Home | History | Annotate | Download | only in EarlyCSE
      1 ; RUN: opt -early-cse -S < %s | FileCheck %s
      2 ; RUN: opt -basicaa -early-cse-memssa -S < %s | FileCheck %s
      3 
      4 ; Can we CSE a known condition to a constant?
      5 define i1 @test(i8* %p) {
      6 ; CHECK-LABEL: @test
      7 entry:
      8   %cnd1 = icmp eq i8* %p, null
      9   br i1 %cnd1, label %taken, label %untaken
     10 
     11 taken:
     12 ; CHECK-LABEL: taken:
     13 ; CHECK-NEXT: ret i1 true
     14   %cnd2 = icmp eq i8* %p, null
     15   ret i1 %cnd2
     16 
     17 untaken:
     18 ; CHECK-LABEL: untaken:
     19 ; CHECK-NEXT: ret i1 false
     20   %cnd3 = icmp eq i8* %p, null
     21   ret i1 %cnd3
     22 }
     23 
     24 ; We can CSE the condition, but we *don't* know it's value after the merge
     25 define i1 @test_neg1(i8* %p) {
     26 ; CHECK-LABEL: @test_neg1
     27 entry:
     28   %cnd1 = icmp eq i8* %p, null
     29   br i1 %cnd1, label %taken, label %untaken
     30 
     31 taken:
     32   br label %merge
     33 
     34 untaken:
     35   br label %merge
     36 
     37 merge:
     38 ; CHECK-LABEL: merge:
     39 ; CHECK-NEXT: ret i1 %cnd1
     40   %cnd3 = icmp eq i8* %p, null
     41   ret i1 %cnd3
     42 }
     43 
     44 ; Check specifically for a case where we have a unique predecessor, but
     45 ; not a single predecessor.  We can not know the value of the condition here.
     46 define i1 @test_neg2(i8* %p) {
     47 ; CHECK-LABEL: @test_neg2
     48 entry:
     49   %cnd1 = icmp eq i8* %p, null
     50   br i1 %cnd1, label %merge, label %merge
     51 
     52 merge:
     53 ; CHECK-LABEL: merge:
     54 ; CHECK-NEXT: ret i1 %cnd1
     55   %cnd3 = icmp eq i8* %p, null
     56   ret i1 %cnd3
     57 }
     58 
     59 ; Replace a use rather than CSE
     60 define i1 @test2(i8* %p) {
     61 ; CHECK-LABEL: @test2
     62 entry:
     63   %cnd = icmp eq i8* %p, null
     64   br i1 %cnd, label %taken, label %untaken
     65 
     66 taken:
     67 ; CHECK-LABEL: taken:
     68 ; CHECK-NEXT: ret i1 true
     69   ret i1 %cnd
     70 
     71 untaken:
     72 ; CHECK-LABEL: untaken:
     73 ; CHECK-NEXT: ret i1 false
     74   ret i1 %cnd
     75 }
     76 
     77 ; Not legal to replace use given it's not dominated by edge
     78 define i1 @test2_neg1(i8* %p) {
     79 ; CHECK-LABEL: @test2_neg1
     80 entry:
     81   %cnd1 = icmp eq i8* %p, null
     82   br i1 %cnd1, label %taken, label %untaken
     83 
     84 taken:
     85   br label %merge
     86 
     87 untaken:
     88   br label %merge
     89 
     90 merge:
     91 ; CHECK-LABEL: merge:
     92 ; CHECK-NEXT: ret i1 %cnd1
     93   ret i1 %cnd1
     94 }
     95 
     96 ; Another single predecessor test, but for dominated use
     97 define i1 @test2_neg2(i8* %p) {
     98 ; CHECK-LABEL: @test2_neg2
     99 entry:
    100   %cnd1 = icmp eq i8* %p, null
    101   br i1 %cnd1, label %merge, label %merge
    102 
    103 merge:
    104 ; CHECK-LABEL: merge:
    105 ; CHECK-NEXT: ret i1 %cnd1
    106   ret i1 %cnd1
    107 }
    108 
    109