Home | History | Annotate | Download | only in GVNSink
      1 ; RUN: opt < %s -gvn-sink -simplifycfg -simplifycfg-sink-common=false -S | FileCheck %s
      2 
      3 define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
      4 entry:
      5   br i1 %flag, label %if.then, label %if.else
      6 
      7 ; CHECK-LABEL: test1
      8 ; CHECK: add
      9 ; CHECK: select
     10 ; CHECK: icmp
     11 ; CHECK-NOT: br
     12 if.then:
     13   %cmp = icmp uge i32 %blksA, %nblks
     14   %frombool1 = zext i1 %cmp to i8
     15   br label %if.end
     16 
     17 if.else:
     18   %add = add i32 %nblks, %blksB
     19   %cmp2 = icmp ule i32 %add, %blksA
     20   %frombool3 = zext i1 %cmp2 to i8
     21   br label %if.end
     22 
     23 if.end:
     24   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
     25   %tobool4 = icmp ne i8 %obeys.0, 0
     26   ret i1 %tobool4
     27 }
     28 
     29 define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
     30 entry:
     31   br i1 %flag, label %if.then, label %if.else
     32 
     33 ; CHECK-LABEL: test2
     34 ; CHECK: add
     35 ; CHECK: select
     36 ; CHECK: icmp
     37 ; CHECK-NOT: br
     38 if.then:
     39   %cmp = icmp uge i32 %blksA, %nblks
     40   %frombool1 = zext i1 %cmp to i8
     41   br label %if.end
     42 
     43 if.else:
     44   %add = add i32 %nblks, %blksB
     45   %cmp2 = icmp uge i32 %blksA, %add
     46   %frombool3 = zext i1 %cmp2 to i8
     47   br label %if.end
     48 
     49 if.end:
     50   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
     51   %tobool4 = icmp ne i8 %obeys.0, 0
     52   ret i1 %tobool4
     53 }
     54 
     55 declare i32 @foo(i32, i32) nounwind readnone
     56 
     57 ; FIXME: The test failes when the original order of the
     58 ; candidates with the same cost is preserved.
     59 ;
     60 ;define i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) {
     61 ;entry:
     62 ;  br i1 %flag, label %if.then, label %if.else
     63 ;
     64 ;if.then:
     65 ;  %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
     66 ;  %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
     67 ;  br label %if.end
     68 ;
     69 ;if.else:
     70 ;  %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
     71 ;  %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
     72 ;  br label %if.end
     73 ;
     74 ;if.end:
     75 ;  %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
     76 ;  %yy = phi i32 [ %y0, %if.then ], [ %y1, %if.else ]
     77 ;  %ret = add i32 %xx, %yy
     78 ;  ret i32 %ret
     79 ;}
     80 ;
     81 ; -CHECK-LABEL: test3
     82 ; -CHECK: select
     83 ; -CHECK: call
     84 ; -CHECK: call
     85 ; -CHECK: add
     86 ; -CHECK-NOT: br
     87 
     88 define i32 @test4(i1 zeroext %flag, i32 %x, i32* %y) {
     89 entry:
     90   br i1 %flag, label %if.then, label %if.else
     91 
     92 if.then:
     93   %a = add i32 %x, 5
     94   store i32 %a, i32* %y
     95   br label %if.end
     96 
     97 if.else:
     98   %b = add i32 %x, 7
     99   store i32 %b, i32* %y
    100   br label %if.end
    101 
    102 if.end:
    103   ret i32 1
    104 }
    105 
    106 ; CHECK-LABEL: test4
    107 ; CHECK: select
    108 ; CHECK: store
    109 ; CHECK-NOT: store
    110 
    111 define i32 @test5(i1 zeroext %flag, i32 %x, i32* %y) {
    112 entry:
    113   br i1 %flag, label %if.then, label %if.else
    114 
    115 if.then:
    116   %a = add i32 %x, 5
    117   store volatile i32 %a, i32* %y
    118   br label %if.end
    119 
    120 if.else:
    121   %b = add i32 %x, 7
    122   store i32 %b, i32* %y
    123   br label %if.end
    124 
    125 if.end:
    126   ret i32 1
    127 }
    128 
    129 ; CHECK-LABEL: test5
    130 ; CHECK: store volatile
    131 ; CHECK: store
    132 
    133 define i32 @test6(i1 zeroext %flag, i32 %x, i32* %y) {
    134 entry:
    135   br i1 %flag, label %if.then, label %if.else
    136 
    137 if.then:
    138   %a = add i32 %x, 5
    139   store volatile i32 %a, i32* %y
    140   br label %if.end
    141 
    142 if.else:
    143   %b = add i32 %x, 7
    144   store volatile i32 %b, i32* %y
    145   br label %if.end
    146 
    147 if.end:
    148   ret i32 1
    149 }
    150 
    151 ; CHECK-LABEL: test6
    152 ; CHECK: select
    153 ; CHECK: store volatile
    154 ; CHECK-NOT: store
    155 
    156 define i32 @test7(i1 zeroext %flag, i32 %x, i32* %y) {
    157 entry:
    158   br i1 %flag, label %if.then, label %if.else
    159 
    160 if.then:
    161   %z = load volatile i32, i32* %y
    162   %a = add i32 %z, 5
    163   store volatile i32 %a, i32* %y
    164   br label %if.end
    165 
    166 if.else:
    167   %w = load volatile i32, i32* %y
    168   %b = add i32 %w, 7
    169   store volatile i32 %b, i32* %y
    170   br label %if.end
    171 
    172 if.end:
    173   ret i32 1
    174 }
    175 
    176 ; CHECK-LABEL: test7
    177 ; CHECK-DAG: select
    178 ; CHECK-DAG: load volatile
    179 ; CHECK: store volatile
    180 ; CHECK-NOT: load
    181 ; CHECK-NOT: store
    182 
    183 ; The extra store in %if.then means %z and %w are not equivalent.
    184 define i32 @test9(i1 zeroext %flag, i32 %x, i32* %y, i32* %p) {
    185 entry:
    186   br i1 %flag, label %if.then, label %if.else
    187 
    188 if.then:
    189   store i32 7, i32* %p
    190   %z = load volatile i32, i32* %y
    191   store i32 6, i32* %p
    192   %a = add i32 %z, 5
    193   store volatile i32 %a, i32* %y
    194   br label %if.end
    195 
    196 if.else:
    197   %w = load volatile i32, i32* %y
    198   %b = add i32 %w, 7
    199   store volatile i32 %b, i32* %y
    200   br label %if.end
    201 
    202 if.end:
    203   ret i32 1
    204 }
    205 
    206 ; CHECK-LABEL: test9
    207 ; CHECK: add
    208 ; CHECK: add
    209 
    210 %struct.anon = type { i32, i32 }
    211 
    212 ; The GEP indexes a struct type so cannot have a variable last index.
    213 define i32 @test10(i1 zeroext %flag, i32 %x, i32* %y, %struct.anon* %s) {
    214 entry:
    215   br i1 %flag, label %if.then, label %if.else
    216 
    217 if.then:
    218   %dummy = add i32 %x, 5
    219   %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0
    220   store volatile i32 %x, i32* %gepa
    221   br label %if.end
    222 
    223 if.else:
    224   %dummy1 = add i32 %x, 6
    225   %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
    226   store volatile i32 %x, i32* %gepb
    227   br label %if.end
    228 
    229 if.end:
    230   ret i32 1
    231 }
    232 
    233 ; CHECK-LABEL: test10
    234 ; CHECK: getelementptr
    235 ; CHECK: store volatile
    236 ; CHECK: getelementptr
    237 ; CHECK: store volatile
    238 
    239 ; The shufflevector's mask operand cannot be merged in a PHI.
    240 define i32 @test11(i1 zeroext %flag, i32 %w, <2 x i32> %x, <2 x i32> %y) {
    241 entry:
    242   br i1 %flag, label %if.then, label %if.else
    243 
    244 if.then:
    245   %dummy = add i32 %w, 5
    246   %sv1 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 0, i32 1>
    247   br label %if.end
    248 
    249 if.else:
    250   %dummy1 = add i32 %w, 6
    251   %sv2 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 1, i32 0>
    252   br label %if.end
    253 
    254 if.end:
    255   %p = phi <2 x i32> [ %sv1, %if.then ], [ %sv2, %if.else ]
    256   ret i32 1
    257 }
    258 
    259 ; CHECK-LABEL: test11
    260 ; CHECK: shufflevector
    261 ; CHECK: shufflevector
    262 
    263 ; We can't common an intrinsic!
    264 define i32 @test12(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
    265 entry:
    266   br i1 %flag, label %if.then, label %if.else
    267 
    268 if.then:
    269   %dummy = add i32 %w, 5
    270   %sv1 = call i32 @llvm.ctlz.i32(i32 %x)
    271   br label %if.end
    272 
    273 if.else:
    274   %dummy1 = add i32 %w, 6
    275   %sv2 = call i32 @llvm.cttz.i32(i32 %x)
    276   br label %if.end
    277 
    278 if.end:
    279   %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
    280   ret i32 1
    281 }
    282 
    283 declare i32 @llvm.ctlz.i32(i32 %x) readnone
    284 declare i32 @llvm.cttz.i32(i32 %x) readnone
    285 
    286 ; CHECK-LABEL: test12
    287 ; CHECK: call i32 @llvm.ctlz
    288 ; CHECK: call i32 @llvm.cttz
    289 
    290 ; The TBAA metadata should be properly combined.
    291 define i32 @test13(i1 zeroext %flag, i32 %x, i32* %y) {
    292 entry:
    293   br i1 %flag, label %if.then, label %if.else
    294 
    295 if.then:
    296   %z = load volatile i32, i32* %y
    297   %a = add i32 %z, 5
    298   store volatile i32 %a, i32* %y, !tbaa !3
    299   br label %if.end
    300 
    301 if.else:
    302   %w = load volatile i32, i32* %y
    303   %b = add i32 %w, 7
    304   store volatile i32 %b, i32* %y, !tbaa !4
    305   br label %if.end
    306 
    307 if.end:
    308   ret i32 1
    309 }
    310 
    311 !0 = !{ !"an example type tree" }
    312 !1 = !{ !"int", !0 }
    313 !2 = !{ !"float", !0 }
    314 !3 = !{ !"const float", !2, i64 0 }
    315 !4 = !{ !"special float", !2, i64 1 }
    316 
    317 ; CHECK-LABEL: test13
    318 ; CHECK-DAG: select
    319 ; CHECK-DAG: load volatile
    320 ; CHECK: store volatile {{.*}}, !tbaa !0
    321 ; CHECK-NOT: load
    322 ; CHECK-NOT: store
    323 
    324 ; The call should be commoned.
    325 define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
    326 entry:
    327   br i1 %flag, label %if.then, label %if.else
    328 
    329 if.then:
    330   %sv1 = call i32 @bar(i32 %x)
    331   br label %if.end
    332 
    333 if.else:
    334   %sv2 = call i32 @bar(i32 %y)
    335   br label %if.end
    336 
    337 if.end:
    338   %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
    339   ret i32 1
    340 }
    341 declare i32 @bar(i32)
    342 
    343 ; CHECK-LABEL: test13a
    344 ; CHECK: %[[x:.*]] = select i1 %flag
    345 ; CHECK: call i32 @bar(i32 %[[x]])
    346 
    347 ; The load should be commoned.
    348 define i32 @test14(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
    349 entry:
    350   br i1 %flag, label %if.then, label %if.else
    351 
    352 if.then:
    353   %dummy = add i32 %x, 1
    354   %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
    355   %sv1 = load i32, i32* %gepa
    356   %cmp1 = icmp eq i32 %sv1, 56
    357   br label %if.end
    358 
    359 if.else:
    360   %dummy2 = add i32 %x, 4
    361   %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
    362   %sv2 = load i32, i32* %gepb
    363   %cmp2 = icmp eq i32 %sv2, 57
    364   br label %if.end
    365 
    366 if.end:
    367   %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
    368   ret i32 1
    369 }
    370 
    371 ; CHECK-LABEL: test14
    372 ; CHECK: getelementptr
    373 ; CHECK: load
    374 ; CHECK-NOT: load
    375 
    376 ; The load should be commoned.
    377 define i32 @test15(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
    378 entry:
    379   br i1 %flag, label %if.then, label %if.else
    380 
    381 if.then:
    382   %dummy = add i32 %x, 1
    383   %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0
    384   %sv1 = load i32, i32* %gepa
    385   %ext1 = zext i32 %sv1 to i64
    386   %cmp1 = icmp eq i64 %ext1, 56
    387   br label %if.end
    388 
    389 if.else:
    390   %dummy2 = add i32 %x, 4
    391   %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
    392   %sv2 = load i32, i32* %gepb
    393   %ext2 = zext i32 %sv2 to i64
    394   %cmp2 = icmp eq i64 %ext2, 56
    395   br label %if.end
    396 
    397 if.end:
    398   %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
    399   ret i32 1
    400 }
    401 
    402 ; CHECK-LABEL: test15
    403 ; CHECK: getelementptr
    404 ; CHECK: load
    405 ; CHECK-NOT: load
    406 
    407 define zeroext i1 @test_crash(i1 zeroext %flag, i32* %i4, i32* %m, i32* %n) {
    408 entry:
    409   br i1 %flag, label %if.then, label %if.else
    410 
    411 if.then:
    412   %tmp1 = load i32, i32* %i4
    413   %tmp2 = add i32 %tmp1, -1
    414   store i32 %tmp2, i32* %i4
    415   br label %if.end
    416 
    417 if.else:
    418   %tmp3 = load i32, i32* %m
    419   %tmp4 = load i32, i32* %n
    420   %tmp5 = add i32 %tmp3, %tmp4
    421   store i32 %tmp5, i32* %i4
    422   br label %if.end
    423 
    424 if.end:
    425   ret i1 true
    426 }
    427 
    428 ; CHECK-LABEL: test_crash
    429 ; No checks for test_crash - just ensure it doesn't crash!
    430 
    431 define zeroext i1 @test16(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
    432 
    433 entry:
    434   br i1 %flag, label %if.then, label %if.else
    435 
    436 if.then:
    437   %cmp = icmp uge i32 %blksA, %nblks
    438   %frombool1 = zext i1 %cmp to i8
    439   br label %if.end
    440 
    441 if.else:
    442   br i1 %flag2, label %if.then2, label %if.end
    443 
    444 if.then2:
    445   %add = add i32 %nblks, %blksB
    446   %cmp2 = icmp ule i32 %add, %blksA
    447   %frombool3 = zext i1 %cmp2 to i8
    448   br label %if.end
    449 
    450 if.end:
    451   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %if.else ]
    452   %tobool4 = icmp ne i8 %obeys.0, 0
    453   ret i1 %tobool4
    454 }
    455 
    456 ; CHECK-LABEL: test16
    457 ; CHECK: zext
    458 ; CHECK: zext
    459 
    460 define zeroext i1 @test16a(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks, i8* %p) {
    461 
    462 entry:
    463   br i1 %flag, label %if.then, label %if.else
    464 
    465 if.then:
    466   %cmp = icmp uge i32 %blksA, %nblks
    467   %frombool1 = zext i1 %cmp to i8
    468   %b1 = sext i8 %frombool1 to i32
    469   %b2 = trunc i32 %b1 to i8
    470   store i8 %b2, i8* %p
    471   br label %if.end
    472 
    473 if.else:
    474   br i1 %flag2, label %if.then2, label %if.end
    475 
    476 if.then2:
    477   %add = add i32 %nblks, %blksB
    478   %cmp2 = icmp ule i32 %add, %blksA
    479   %frombool3 = zext i1 %cmp2 to i8
    480   %a1 = sext i8 %frombool3 to i32
    481   %a2 = trunc i32 %a1 to i8
    482   store i8 %a2, i8* %p
    483   br label %if.end
    484 
    485 if.end:
    486   ret i1 true
    487 }
    488 
    489 ; CHECK-LABEL: test16a
    490 ; CHECK: zext
    491 ; CHECK-NOT: zext
    492 
    493 define zeroext i1 @test17(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
    494 entry:
    495   switch i32 %flag, label %if.end [
    496     i32 0, label %if.then
    497     i32 1, label %if.then2
    498   ]
    499 
    500 if.then:
    501   %cmp = icmp uge i32 %blksA, %nblks
    502   %frombool1 = call i8 @i1toi8(i1 %cmp)
    503   %a1 = sext i8 %frombool1 to i32
    504   %a2 = trunc i32 %a1 to i8
    505   br label %if.end
    506 
    507 if.then2:
    508   %add = add i32 %nblks, %blksB
    509   %cmp2 = icmp ule i32 %add, %blksA
    510   %frombool3 = call i8 @i1toi8(i1 %cmp2)
    511   %b1 = sext i8 %frombool3 to i32
    512   %b2 = trunc i32 %b1 to i8
    513   br label %if.end
    514 
    515 if.end:
    516   %obeys.0 = phi i8 [ %a2, %if.then ], [ %b2, %if.then2 ], [ 0, %entry ]
    517   %tobool4 = icmp ne i8 %obeys.0, 0
    518   ret i1 %tobool4
    519 }
    520 declare i8 @i1toi8(i1)
    521 
    522 ; FIXME: DISABLED - we don't consider this profitable. We should
    523 ;  - Consider argument setup/return mov'ing for calls, like InlineCost does.
    524 ;  - Consider the removal of the %obeys.0 PHI (zero PHI movement overall)
    525 
    526 ; DISABLED-CHECK-LABEL: test17
    527 ; DISABLED-CHECK: if.then:
    528 ; DISABLED-CHECK-NEXT: icmp uge
    529 ; DISABLED-CHECK-NEXT: br label %[[x:.*]]
    530 
    531 ; DISABLED-CHECK: if.then2:
    532 ; DISABLED-CHECK-NEXT: add
    533 ; DISABLED-CHECK-NEXT: icmp ule
    534 ; DISABLED-CHECK-NEXT: br label %[[x]]
    535 
    536 ; DISABLED-CHECK: [[x]]:
    537 ; DISABLED-CHECK-NEXT: %[[y:.*]] = phi i1 [ %cmp
    538 ; DISABLED-CHECK-NEXT: %[[z:.*]] = call i8 @i1toi8(i1 %[[y]])
    539 ; DISABLED-CHECK-NEXT: br label %if.end
    540 
    541 ; DISABLED-CHECK: if.end:
    542 ; DISABLED-CHECK-NEXT: phi i8
    543 ; DISABLED-CHECK-DAG: [ %[[z]], %[[x]] ]
    544 ; DISABLED-CHECK-DAG: [ 0, %entry ]
    545 
    546 define zeroext i1 @test18(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
    547 entry:
    548   switch i32 %flag, label %if.then3 [
    549     i32 0, label %if.then
    550     i32 1, label %if.then2
    551   ]
    552 
    553 if.then:
    554   %cmp = icmp uge i32 %blksA, %nblks
    555   %frombool1 = zext i1 %cmp to i8
    556   br label %if.end
    557 
    558 if.then2:
    559   %add = add i32 %nblks, %blksB
    560   %cmp2 = icmp ule i32 %add, %blksA
    561   %frombool3 = zext i1 %cmp2 to i8
    562   br label %if.end
    563 
    564 if.then3:
    565   %add2 = add i32 %nblks, %blksA
    566   %cmp3 = icmp ule i32 %add2, %blksA
    567   %frombool4 = zext i1 %cmp3 to i8
    568   br label %if.end
    569 
    570 if.end:
    571   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ %frombool4, %if.then3 ]
    572   %tobool4 = icmp ne i8 %obeys.0, 0
    573   ret i1 %tobool4
    574 }
    575 
    576 ; CHECK-LABEL: test18
    577 ; CHECK: if.end:
    578 ; CHECK-NEXT: %[[x:.*]] = phi i1
    579 ; CHECK-DAG: [ %cmp, %if.then ]
    580 ; CHECK-DAG: [ %cmp2, %if.then2 ]
    581 ; CHECK-DAG: [ %cmp3, %if.then3 ]
    582 ; CHECK-NEXT: zext i1 %[[x]] to i8
    583 
    584 ; The phi is confusing - both add instructions are used by it, but
    585 ; not on their respective unconditional arcs. It should not be
    586 ; optimized.
    587 define void @test_pr30292(i1 %cond, i1 %cond2, i32 %a, i32 %b) {
    588 entry:
    589   %add1 = add i32 %a, 1
    590   br label %succ
    591 
    592 one:
    593   br i1 %cond, label %two, label %succ
    594 
    595 two:
    596   call void @g()
    597   %add2 = add i32 %a, 1
    598   br label %succ
    599 
    600 succ:
    601   %p = phi i32 [ 0, %entry ], [ %add1, %one ], [ %add2, %two ]
    602   br label %one
    603 }
    604 declare void @g()
    605 
    606 ; CHECK-LABEL: test_pr30292
    607 ; CHECK: phi i32 [ 0, %entry ], [ %add1, %succ ], [ %add2, %two ]
    608 
    609 define zeroext i1 @test_pr30244(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
    610 
    611 entry:
    612   %p = alloca i8
    613   br i1 %flag, label %if.then, label %if.else
    614 
    615 if.then:
    616   %cmp = icmp uge i32 %blksA, %nblks
    617   %frombool1 = zext i1 %cmp to i8
    618   store i8 %frombool1, i8* %p
    619   br label %if.end
    620 
    621 if.else:
    622   br i1 %flag2, label %if.then2, label %if.end
    623 
    624 if.then2:
    625   %add = add i32 %nblks, %blksB
    626   %cmp2 = icmp ule i32 %add, %blksA
    627   %frombool3 = zext i1 %cmp2 to i8
    628   store i8 %frombool3, i8* %p
    629   br label %if.end
    630 
    631 if.end:
    632   ret i1 true
    633 }
    634 
    635 ; CHECK-LABEL: @test_pr30244
    636 ; CHECK: store
    637 ; CHECK-NOT: store
    638 
    639 define i32 @test_pr30373a(i1 zeroext %flag, i32 %x, i32 %y) {
    640 entry:
    641   br i1 %flag, label %if.then, label %if.else
    642 
    643 if.then:
    644   %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
    645   %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
    646   %z0 = lshr i32 %y0, 8
    647   br label %if.end
    648 
    649 if.else:
    650   %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
    651   %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
    652   %z1 = lshr exact i32 %y1, 8
    653   br label %if.end
    654 
    655 if.end:
    656   %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
    657   %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]
    658   %ret = add i32 %xx, %yy
    659   ret i32 %ret
    660 }
    661 
    662 ; CHECK-LABEL: test_pr30373a
    663 ; CHECK: lshr
    664 ; CHECK-NOT: exact
    665 ; CHECK: }
    666 
    667 define i32 @test_pr30373b(i1 zeroext %flag, i32 %x, i32 %y) {
    668 entry:
    669   br i1 %flag, label %if.then, label %if.else
    670 
    671 if.then:
    672   %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
    673   %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
    674   %z0 = lshr exact i32 %y0, 8
    675   br label %if.end
    676 
    677 if.else:
    678   %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
    679   %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
    680   %z1 = lshr i32 %y1, 8
    681   br label %if.end
    682 
    683 if.end:
    684   %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
    685   %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]
    686   %ret = add i32 %xx, %yy
    687   ret i32 %ret
    688 }
    689 
    690 ; CHECK-LABEL: test_pr30373b
    691 ; CHECK: lshr
    692 ; CHECK-NOT: exact
    693 ; CHECK: }
    694 
    695 ; CHECK: !0 = !{!1, !1, i64 0}
    696 ; CHECK: !1 = !{!"float", !2}
    697 ; CHECK: !2 = !{!"an example type tree"}
    698