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