Home | History | Annotate | Download | only in SimplifyCFG
      1 ; RUN: opt -simplifycfg -S < %s | FileCheck %s
      2 
      3 declare void @bar() nounwind
      4 
      5 define i32 @test1(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
      6 entry:
      7   %tobool = icmp eq i32 %b, 0
      8   br i1 %tobool, label %if.else, label %if.then
      9 
     10 if.then:                                          ; preds = %entry
     11   tail call void @bar() nounwind
     12   br label %if.end7
     13 
     14 if.else:                                          ; preds = %entry
     15   %tobool3 = icmp eq i32 %d, 0
     16   br i1 %tobool3, label %if.end7, label %if.then4
     17 
     18 if.then4:                                         ; preds = %if.else
     19   tail call void @bar() nounwind
     20   br label %if.end7
     21 
     22 if.end7:                                          ; preds = %if.else, %if.then4, %if.then
     23   %x.0 = phi i32* [ %a, %if.then ], [ %c, %if.then4 ], [ null, %if.else ]
     24   %tmp9 = load i32* %x.0
     25   ret i32 %tmp9
     26 
     27 ; CHECK-LABEL: @test1(
     28 ; CHECK: if.else:
     29 ; CHECK: br label %if.end7
     30 
     31 ; CHECK: phi i32* [ %a, %if.then ], [ %c, %if.else ]
     32 }
     33 
     34 define i32 @test2(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
     35 entry:
     36   %tobool = icmp eq i32 %b, 0
     37   br i1 %tobool, label %if.else, label %if.then
     38 
     39 if.then:                                          ; preds = %entry
     40   tail call void @bar() nounwind
     41   br label %if.end7
     42 
     43 if.else:                                          ; preds = %entry
     44   %tobool3 = icmp eq i32 %d, 0
     45   br i1 %tobool3, label %if.end7, label %if.then4
     46 
     47 if.then4:                                         ; preds = %if.else
     48   tail call void @bar() nounwind
     49   br label %if.end7
     50 
     51 if.end7:                                          ; preds = %if.else, %if.then4, %if.then
     52   %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
     53   %tmp9 = load i32* %x.0
     54   ret i32 %tmp9
     55 ; CHECK-LABEL: @test2(
     56 ; CHECK: if.else:
     57 ; CHECK: unreachable
     58 
     59 ; CHECK-NOT: phi
     60 }
     61 
     62 define i32 @test3(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
     63 entry:
     64   %tobool = icmp eq i32 %b, 0
     65   br i1 %tobool, label %if.else, label %if.then
     66 
     67 if.then:                                          ; preds = %entry
     68   tail call void @bar() nounwind
     69   br label %if.end7
     70 
     71 if.else:                                          ; preds = %entry
     72   %tobool3 = icmp eq i32 %d, 0
     73   br i1 %tobool3, label %if.end7, label %if.then4
     74 
     75 if.then4:                                         ; preds = %if.else
     76   tail call void @bar() nounwind
     77   br label %if.end7
     78 
     79 if.end7:                                          ; preds = %if.else, %if.then4, %if.then
     80   %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
     81   tail call void @bar() nounwind
     82   %tmp9 = load i32* %x.0
     83   ret i32 %tmp9
     84 ; CHECK-LABEL: @test3(
     85 ; CHECK: if.end7:
     86 ; CHECK: phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
     87 }
     88 
     89 define i32 @test4(i32* %a, i32 %b, i32* %c, i32 %d) nounwind {
     90 entry:
     91   %tobool = icmp eq i32 %b, 0
     92   br i1 %tobool, label %if.else, label %if.then
     93 
     94 if.then:                                          ; preds = %entry
     95   tail call void @bar() nounwind
     96   br label %if.end7
     97 
     98 if.else:                                          ; preds = %entry
     99   %tobool3 = icmp eq i32 %d, 0
    100   br i1 %tobool3, label %if.end7, label %if.then4
    101 
    102 if.then4:                                         ; preds = %if.else
    103   tail call void @bar() nounwind
    104   br label %if.end7
    105 
    106 if.end7:                                          ; preds = %if.else, %if.then4, %if.then
    107   %x.0 = phi i32* [ %a, %if.then ], [ null, %if.then4 ], [ null, %if.else ]
    108   %gep = getelementptr i32* %x.0, i32 10
    109   %tmp9 = load i32* %gep
    110   %tmp10 = or i32 %tmp9, 1
    111   store i32 %tmp10, i32* %gep
    112   ret i32 %tmp9
    113 ; CHECK-LABEL: @test4(
    114 ; CHECK-NOT: phi
    115 }
    116