1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S > %t 2*9880d681SAndroid Build Coastguard Worker; RUN: not grep "^BB.tomerge" %t 3*9880d681SAndroid Build Coastguard Worker; RUN: grep "^BB.nomerge" %t | count 4 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; ModuleID = '<stdin>' 6*9880d681SAndroid Build Coastguard Workerdeclare i1 @foo() 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare i1 @bar(i32) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; This function can't be merged 11*9880d681SAndroid Build Coastguard Workerdefine void @a() { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 16*9880d681SAndroid Build Coastguard Worker ; This phi has a conflicting value (0) with below phi (2), so blocks 17*9880d681SAndroid Build Coastguard Worker ; can't be merged. 18*9880d681SAndroid Build Coastguard Worker %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker br label %Succ 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.nomerge 22*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ %a, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0] 23*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Exit 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 27*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Succ 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; This function can't be merged 35*9880d681SAndroid Build Coastguard Workerdefine void @b() { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 40*9880d681SAndroid Build Coastguard Worker br label %Succ 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.nomerge 43*9880d681SAndroid Build Coastguard Worker ; This phi has confliction values for Common and (through BB) Common, 44*9880d681SAndroid Build Coastguard Worker ; blocks can't be merged 45*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ 1, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0] 46*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Exit 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 50*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Succ 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; This function can't be merged (for keeping canonical loop structures) 58*9880d681SAndroid Build Coastguard Workerdefine void @c() { 59*9880d681SAndroid Build Coastguard Workerentry: 60*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 63*9880d681SAndroid Build Coastguard Worker br label %Succ 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.tomerge, %Pre-Exit 66*9880d681SAndroid Build Coastguard Worker ; This phi has identical values for Common and (through BB) Common, 67*9880d681SAndroid Build Coastguard Worker ; blocks can't be merged 68*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ 1, %BB.nomerge ], [ 1, %Common ], [ 2, %Pre-Exit ] 69*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 70*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Pre-Exit 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 73*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard WorkerPre-Exit: ; preds = %Succ 77*9880d681SAndroid Build Coastguard Worker ; This adds a backedge, so the %b phi node gets a third branch and is 78*9880d681SAndroid Build Coastguard Worker ; not completely trivial 79*9880d681SAndroid Build Coastguard Worker %cond2 = call i1 @foo( ) ; <i1> [#uses=1] 80*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %Succ, label %Exit 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Pre-Exit 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; This function can't be merged (for keeping canonical loop structures) 87*9880d681SAndroid Build Coastguard Workerdefine void @d() { 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 92*9880d681SAndroid Build Coastguard Worker ; This phi has a matching value (0) with below phi (0), so blocks 93*9880d681SAndroid Build Coastguard Worker ; can be merged. 94*9880d681SAndroid Build Coastguard Worker %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1] 95*9880d681SAndroid Build Coastguard Worker br label %Succ 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.tomerge 98*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ %a, %BB.nomerge ], [ 0, %Common ] ; <i32> [#uses=0] 99*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 100*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Exit 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 103*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 104*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Succ 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; This function can be merged 111*9880d681SAndroid Build Coastguard Workerdefine void @e() { 112*9880d681SAndroid Build Coastguard Workerentry: 113*9880d681SAndroid Build Coastguard Worker br label %Succ 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Use, %entry 116*9880d681SAndroid Build Coastguard Worker ; This phi is used somewhere else than Succ, but this should not prevent 117*9880d681SAndroid Build Coastguard Worker ; merging this block 118*9880d681SAndroid Build Coastguard Worker %a = phi i32 [ 1, %entry ], [ 0, %Use ] ; <i32> [#uses=1] 119*9880d681SAndroid Build Coastguard Worker br label %BB.tomerge 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard WorkerBB.tomerge: ; preds = %BB.tomerge 122*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 123*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Use, label %Exit 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard WorkerUse: ; preds = %Succ 126*9880d681SAndroid Build Coastguard Worker %cond = call i1 @bar( i32 %a ) ; <i1> [#uses=1] 127*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Succ, label %Exit 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Use, %Succ 130*9880d681SAndroid Build Coastguard Worker ret void 131*9880d681SAndroid Build Coastguard Worker} 132