Home | History | Annotate | Download | only in NewGVN
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -basicaa -newgvn -S | FileCheck %s
      3 
      4 
      5 declare void @foo(i1)
      6 declare void @bar(i32)
      7 
      8 define void @test3(i32 %x, i32 %y) {
      9 ; CHECK-LABEL: @test3(
     10 ; CHECK-NEXT:    [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
     11 ; CHECK-NEXT:    [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
     12 ; CHECK-NEXT:    [[Z:%.*]] = and i1 [[XZ]], [[YZ]]
     13 ; CHECK-NEXT:    br i1 [[Z]], label [[BOTH_ZERO:%.*]], label [[NOPE:%.*]]
     14 ; CHECK:       both_zero:
     15 ; CHECK-NEXT:    call void @foo(i1 true)
     16 ; CHECK-NEXT:    call void @foo(i1 true)
     17 ; CHECK-NEXT:    call void @bar(i32 0)
     18 ; CHECK-NEXT:    call void @bar(i32 0)
     19 ; CHECK-NEXT:    ret void
     20 ; CHECK:       nope:
     21 ; CHECK-NEXT:    call void @foo(i1 false)
     22 ; CHECK-NEXT:    ret void
     23 ;
     24   %xz = icmp eq i32 %x, 0
     25   %yz = icmp eq i32 %y, 0
     26   %z = and i1 %xz, %yz
     27   br i1 %z, label %both_zero, label %nope
     28 both_zero:
     29   call void @foo(i1 %xz)
     30   call void @foo(i1 %yz)
     31   call void @bar(i32 %x)
     32   call void @bar(i32 %y)
     33   ret void
     34 nope:
     35   call void @foo(i1 %z)
     36   ret void
     37 }
     38 define void @test4(i1 %b, i32 %x) {
     39 ; CHECK-LABEL: @test4(
     40 ; CHECK-NEXT:    br i1 [[B:%.*]], label [[SW:%.*]], label [[CASE3:%.*]]
     41 ; CHECK:       sw:
     42 ; CHECK-NEXT:    switch i32 [[X:%.*]], label [[DEFAULT:%.*]] [
     43 ; CHECK-NEXT:    i32 0, label [[CASE0:%.*]]
     44 ; CHECK-NEXT:    i32 1, label [[CASE1:%.*]]
     45 ; CHECK-NEXT:    i32 2, label [[CASE0]]
     46 ; CHECK-NEXT:    i32 3, label [[CASE3]]
     47 ; CHECK-NEXT:    i32 4, label [[DEFAULT]]
     48 ; CHECK-NEXT:    ]
     49 ; CHECK:       default:
     50 ; CHECK-NEXT:    call void @bar(i32 [[X]])
     51 ; CHECK-NEXT:    ret void
     52 ; CHECK:       case0:
     53 ; CHECK-NEXT:    call void @bar(i32 [[X]])
     54 ; CHECK-NEXT:    ret void
     55 ; CHECK:       case1:
     56 ; CHECK-NEXT:    call void @bar(i32 1)
     57 ; CHECK-NEXT:    ret void
     58 ; CHECK:       case3:
     59 ; CHECK-NEXT:    call void @bar(i32 [[X]])
     60 ; CHECK-NEXT:    ret void
     61 ;
     62   br i1 %b, label %sw, label %case3
     63 sw:
     64   switch i32 %x, label %default [
     65   i32 0, label %case0
     66   i32 1, label %case1
     67   i32 2, label %case0
     68   i32 3, label %case3
     69   i32 4, label %default
     70   ]
     71 default:
     72   call void @bar(i32 %x)
     73   ret void
     74 case0:
     75   call void @bar(i32 %x)
     76   ret void
     77 case1:
     78   call void @bar(i32 %x)
     79   ret void
     80 case3:
     81   call void @bar(i32 %x)
     82   ret void
     83 }
     84 
     85 define i1 @test5(i32 %x, i32 %y) {
     86 ; CHECK-LABEL: @test5(
     87 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
     88 ; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
     89 ; CHECK:       same:
     90 ; CHECK-NEXT:    ret i1 false
     91 ; CHECK:       different:
     92 ; CHECK-NEXT:    ret i1 false
     93 ;
     94   %cmp = icmp eq i32 %x, %y
     95   br i1 %cmp, label %same, label %different
     96 
     97 same:
     98   %cmp2 = icmp ne i32 %x, %y
     99   ret i1 %cmp2
    100 
    101 different:
    102   %cmp3 = icmp eq i32 %x, %y
    103   ret i1 %cmp3
    104 }
    105 
    106 
    107 define i1 @test7(i32 %x, i32 %y) {
    108 ; CHECK-LABEL: @test7(
    109 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
    110 ; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
    111 ; CHECK:       same:
    112 ; CHECK-NEXT:    ret i1 false
    113 ; CHECK:       different:
    114 ; CHECK-NEXT:    ret i1 false
    115 ;
    116   %cmp = icmp sgt i32 %x, %y
    117   br i1 %cmp, label %same, label %different
    118 
    119 same:
    120   %cmp2 = icmp sle i32 %x, %y
    121   ret i1 %cmp2
    122 
    123 different:
    124   %cmp3 = icmp sgt i32 %x, %y
    125   ret i1 %cmp3
    126 }
    127 
    128 define i1 @test7_fp(float %x, float %y) {
    129 ; CHECK-LABEL: @test7_fp(
    130 ; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]]
    131 ; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
    132 ; CHECK:       same:
    133 ; CHECK-NEXT:    ret i1 false
    134 ; CHECK:       different:
    135 ; CHECK-NEXT:    ret i1 false
    136 ;
    137   %cmp = fcmp ogt float %x, %y
    138   br i1 %cmp, label %same, label %different
    139 
    140 same:
    141   %cmp2 = fcmp ule float %x, %y
    142   ret i1 %cmp2
    143 
    144 different:
    145   %cmp3 = fcmp ogt float %x, %y
    146   ret i1 %cmp3
    147 }
    148 
    149 ; PR1768
    150 define i32 @test9(i32 %i, i32 %j) {
    151 ; CHECK-LABEL: @test9(
    152 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]
    153 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[RET:%.*]]
    154 ; CHECK:       cond_true:
    155 ; CHECK-NEXT:    ret i32 0
    156 ; CHECK:       ret:
    157 ; CHECK-NEXT:    ret i32 5
    158 ;
    159   %cmp = icmp eq i32 %i, %j
    160   br i1 %cmp, label %cond_true, label %ret
    161 
    162 cond_true:
    163   %diff = sub i32 %i, %j
    164   ret i32 %diff
    165 
    166 ret:
    167   ret i32 5
    168 }
    169 
    170 ; PR1768
    171 define i32 @test10(i32 %j, i32 %i) {
    172 ; CHECK-LABEL: @test10(
    173 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]
    174 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[RET:%.*]]
    175 ; CHECK:       cond_true:
    176 ; CHECK-NEXT:    ret i32 0
    177 ; CHECK:       ret:
    178 ; CHECK-NEXT:    ret i32 5
    179 ;
    180   %cmp = icmp eq i32 %i, %j
    181   br i1 %cmp, label %cond_true, label %ret
    182 
    183 cond_true:
    184   %diff = sub i32 %i, %j
    185   ret i32 %diff
    186 
    187 ret:
    188   ret i32 5
    189 }
    190 
    191 declare i32 @yogibar()
    192 
    193 define i32 @test11(i32 %x) {
    194 ; CHECK-LABEL: @test11(
    195 ; CHECK-NEXT:    [[V0:%.*]] = call i32 @yogibar()
    196 ; CHECK-NEXT:    [[V1:%.*]] = call i32 @yogibar()
    197 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[V0]], [[V1]]
    198 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[NEXT:%.*]]
    199 ; CHECK:       cond_true:
    200 ; CHECK-NEXT:    ret i32 [[V0]]
    201 ; CHECK:       next:
    202 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i32 [[X:%.*]], [[V0]]
    203 ; CHECK-NEXT:    br i1 [[CMP2]], label [[COND_TRUE2:%.*]], label [[NEXT2:%.*]]
    204 ; CHECK:       cond_true2:
    205 ; CHECK-NEXT:    ret i32 [[X]]
    206 ; CHECK:       next2:
    207 ; CHECK-NEXT:    ret i32 0
    208 ;
    209   %v0 = call i32 @yogibar()
    210   %v1 = call i32 @yogibar()
    211   %cmp = icmp eq i32 %v0, %v1
    212   br i1 %cmp, label %cond_true, label %next
    213 
    214 cond_true:
    215   ret i32 %v1
    216 
    217 next:
    218   %cmp2 = icmp eq i32 %x, %v0
    219   br i1 %cmp2, label %cond_true2, label %next2
    220 
    221 cond_true2:
    222   ret i32 %v0
    223 
    224 next2:
    225   ret i32 0
    226 }
    227 
    228 define i32 @test12(i32 %x) {
    229 ; CHECK-LABEL: @test12(
    230 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0
    231 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
    232 ; CHECK:       cond_true:
    233 ; CHECK-NEXT:    br label [[RET:%.*]]
    234 ; CHECK:       cond_false:
    235 ; CHECK-NEXT:    br label [[RET]]
    236 ; CHECK:       ret:
    237 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[COND_TRUE]] ], [ [[X]], [[COND_FALSE]] ]
    238 ; CHECK-NEXT:    ret i32 [[RES]]
    239 ;
    240   %cmp = icmp eq i32 %x, 0
    241   br i1 %cmp, label %cond_true, label %cond_false
    242 
    243 cond_true:
    244   br label %ret
    245 
    246 cond_false:
    247   br label %ret
    248 
    249 ret:
    250   %res = phi i32 [ %x, %cond_true ], [ %x, %cond_false ]
    251   ret i32 %res
    252 }
    253