Home | History | Annotate | Download | only in CorrelatedValuePropagation
      1 ; RUN: opt -correlated-propagation -S < %s | FileCheck %s
      2 
      3 declare i32 @foo()
      4 
      5 define i32 @test1(i32 %a) nounwind {
      6   %a.off = add i32 %a, -8
      7   %cmp = icmp ult i32 %a.off, 8
      8   br i1 %cmp, label %then, label %else
      9 
     10 then:
     11   %dead = icmp eq i32 %a, 7
     12   br i1 %dead, label %end, label %else
     13 
     14 else:
     15   ret i32 1
     16 
     17 end:
     18   ret i32 2
     19 
     20 ; CHECK-LABEL: @test1(
     21 ; CHECK: then:
     22 ; CHECK-NEXT: br i1 false, label %end, label %else
     23 }
     24 
     25 define i32 @test2(i32 %a) nounwind {
     26   %a.off = add i32 %a, -8
     27   %cmp = icmp ult i32 %a.off, 8
     28   br i1 %cmp, label %then, label %else
     29 
     30 then:
     31   %dead = icmp ugt i32 %a, 15
     32   br i1 %dead, label %end, label %else
     33 
     34 else:
     35   ret i32 1
     36 
     37 end:
     38   ret i32 2
     39 
     40 ; CHECK-LABEL: @test2(
     41 ; CHECK: then:
     42 ; CHECK-NEXT: br i1 false, label %end, label %else
     43 }
     44 
     45 ; CHECK-LABEL: @test3(
     46 define i32 @test3(i32 %c) nounwind {
     47   %cmp = icmp slt i32 %c, 2
     48   br i1 %cmp, label %if.then, label %if.end
     49 
     50 if.then:
     51   ret i32 1
     52 
     53 if.end:
     54   %cmp1 = icmp slt i32 %c, 3
     55   br i1 %cmp1, label %if.then2, label %if.end8
     56 
     57 ; CHECK: if.then2
     58 if.then2:
     59   %cmp2 = icmp eq i32 %c, 2
     60 ; CHECK: br i1 true
     61   br i1 %cmp2, label %if.then4, label %if.end6
     62 
     63 ; CHECK: if.end6
     64 if.end6:
     65   ret i32 2
     66 
     67 if.then4:
     68   ret i32 3
     69 
     70 if.end8:
     71   ret i32 4
     72 }
     73 
     74 ; CHECK-LABEL: @test4(
     75 define i32 @test4(i32 %c) nounwind {
     76   switch i32 %c, label %sw.default [
     77     i32 1, label %sw.bb
     78     i32 2, label %sw.bb
     79     i32 4, label %sw.bb
     80   ]
     81 
     82 ; CHECK: sw.bb
     83 sw.bb:
     84   %cmp = icmp sge i32 %c, 1
     85 ; CHECK: br i1 true
     86   br i1 %cmp, label %if.then, label %if.end
     87 
     88 if.then:
     89   br label %return
     90 
     91 if.end:
     92   br label %return
     93 
     94 sw.default:
     95   br label %return
     96 
     97 return:
     98   %retval.0 = phi i32 [ 42, %sw.default ], [ 4, %if.then ], [ 9, %if.end ]
     99   ret i32 %retval.0
    100 }
    101 
    102 ; CHECK-LABEL: @test5(
    103 define i1 @test5(i32 %c) nounwind {
    104   %cmp = icmp slt i32 %c, 5
    105   br i1 %cmp, label %if.then, label %if.end
    106 
    107 if.then:
    108   %cmp1 = icmp eq i32 %c, 4
    109   br i1 %cmp1, label %if.end, label %if.end8
    110 
    111 if.end:
    112   ret i1 true
    113 
    114 if.end8:
    115   %cmp2 = icmp eq i32 %c, 3
    116   %cmp3 = icmp eq i32 %c, 4
    117   %cmp4 = icmp eq i32 %c, 6
    118 ; CHECK: %or = or i1 false, false
    119   %or = or i1 %cmp3, %cmp4
    120 ; CHECK: ret i1 %cmp2
    121   ret i1 %cmp2
    122 }
    123 
    124 ; CHECK-LABEL: @test6(
    125 define i1 @test6(i32 %c) nounwind {
    126   %cmp = icmp ule i32 %c, 7
    127   br i1 %cmp, label %if.then, label %if.end
    128 
    129 if.then:
    130 ; CHECK: icmp eq i32 %c, 6
    131 ; CHECK: br i1
    132   switch i32 %c, label %if.end [
    133     i32 6, label %sw.bb
    134     i32 8, label %sw.bb
    135   ]
    136 
    137 if.end:
    138   ret i1 true
    139 
    140 sw.bb:
    141   %cmp2 = icmp eq i32 %c, 6
    142 ; CHECK: ret i1 true
    143   ret i1 %cmp2
    144 }
    145 
    146 ; CHECK-LABEL: @test7(
    147 define i1 @test7(i32 %c) nounwind {
    148 entry:
    149  switch i32 %c, label %sw.default [
    150    i32 6, label %sw.bb
    151    i32 7, label %sw.bb
    152  ]
    153 
    154 sw.bb:
    155  ret i1 true
    156 
    157 sw.default:
    158  %cmp5 = icmp eq i32 %c, 5
    159  %cmp6 = icmp eq i32 %c, 6
    160  %cmp7 = icmp eq i32 %c, 7
    161  %cmp8 = icmp eq i32 %c, 8
    162 ; CHECK: %or = or i1 %cmp5, false
    163  %or = or i1 %cmp5, %cmp6
    164 ; CHECK: %or2 = or i1 false, %cmp8
    165  %or2 = or i1 %cmp7, %cmp8
    166  ret i1 false
    167 }
    168