1*9880d681SAndroid Build Coastguard Worker; Test merging of blocks with phi nodes. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S > %t 4*9880d681SAndroid Build Coastguard Worker; RUN: not grep N: %t 5*9880d681SAndroid Build Coastguard Worker; RUN: not grep X: %t 6*9880d681SAndroid Build Coastguard Worker; RUN: not grep 'switch i32[^U]+%U' %t 7*9880d681SAndroid Build Coastguard Worker; RUN: not grep "^BB.tomerge" %t 8*9880d681SAndroid Build Coastguard Worker; RUN: grep "^BB.nomerge" %t | count 4 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; ModuleID = '<stdin>' 12*9880d681SAndroid Build Coastguard Workerdeclare i1 @foo() 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdeclare i1 @bar(i32) 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i1 %a) { 17*9880d681SAndroid Build Coastguard WorkerQ: 18*9880d681SAndroid Build Coastguard Worker br i1 %a, label %N, label %M 19*9880d681SAndroid Build Coastguard WorkerN: ; preds = %Q 20*9880d681SAndroid Build Coastguard Worker br label %M 21*9880d681SAndroid Build Coastguard WorkerM: ; preds = %N, %Q 22*9880d681SAndroid Build Coastguard Worker ; It's ok to merge N and M because the incoming values for W are the 23*9880d681SAndroid Build Coastguard Worker ; same for both cases... 24*9880d681SAndroid Build Coastguard Worker %W = phi i32 [ 2, %N ], [ 2, %Q ] ; <i32> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker %R = add i32 %W, 1 ; <i32> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker ret i32 %R 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; Test merging of blocks with phi nodes where at least one incoming value 30*9880d681SAndroid Build Coastguard Worker; in the successor is undef. 31*9880d681SAndroid Build Coastguard Workerdefine i8 @testundef(i32 %u) { 32*9880d681SAndroid Build Coastguard WorkerR: 33*9880d681SAndroid Build Coastguard Worker switch i32 %u, label %U [ 34*9880d681SAndroid Build Coastguard Worker i32 0, label %S 35*9880d681SAndroid Build Coastguard Worker i32 1, label %T 36*9880d681SAndroid Build Coastguard Worker i32 2, label %T 37*9880d681SAndroid Build Coastguard Worker ] 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard WorkerS: ; preds = %R 40*9880d681SAndroid Build Coastguard Worker br label %U 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard WorkerT: ; preds = %R, %R 43*9880d681SAndroid Build Coastguard Worker br label %U 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard WorkerU: ; preds = %T, %S, %R 46*9880d681SAndroid Build Coastguard Worker ; We should be able to merge either the S or T block into U by rewriting 47*9880d681SAndroid Build Coastguard Worker ; R's incoming value with the incoming value of that predecessor since 48*9880d681SAndroid Build Coastguard Worker ; R's incoming value is undef and both of those predecessors are simple 49*9880d681SAndroid Build Coastguard Worker ; unconditional branches. 50*9880d681SAndroid Build Coastguard Worker %val.0 = phi i8 [ undef, %R ], [ 1, %T ], [ 0, %S ] 51*9880d681SAndroid Build Coastguard Worker ret i8 %val.0 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; Test merging of blocks with phi nodes where at least one incoming value 55*9880d681SAndroid Build Coastguard Worker; in the successor is undef. 56*9880d681SAndroid Build Coastguard Workerdefine i8 @testundef2(i32 %u, i32* %A) { 57*9880d681SAndroid Build Coastguard WorkerV: 58*9880d681SAndroid Build Coastguard Worker switch i32 %u, label %U [ 59*9880d681SAndroid Build Coastguard Worker i32 0, label %W 60*9880d681SAndroid Build Coastguard Worker i32 1, label %X 61*9880d681SAndroid Build Coastguard Worker i32 2, label %X 62*9880d681SAndroid Build Coastguard Worker i32 3, label %Z 63*9880d681SAndroid Build Coastguard Worker ] 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard WorkerW: ; preds = %V 66*9880d681SAndroid Build Coastguard Worker br label %U 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard WorkerZ: 69*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %A, align 4 70*9880d681SAndroid Build Coastguard Worker br label %X 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard WorkerX: ; preds = %V, %V, %Z 73*9880d681SAndroid Build Coastguard Worker br label %U 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard WorkerU: ; preds = %X, %W, %V 76*9880d681SAndroid Build Coastguard Worker ; We should be able to merge either the W or X block into U by rewriting 77*9880d681SAndroid Build Coastguard Worker ; V's incoming value with the incoming value of that predecessor since 78*9880d681SAndroid Build Coastguard Worker ; V's incoming value is undef and both of those predecessors are simple 79*9880d681SAndroid Build Coastguard Worker ; unconditional branches. Note that X has predecessors beyond 80*9880d681SAndroid Build Coastguard Worker ; the direct predecessors of U. 81*9880d681SAndroid Build Coastguard Worker %val.0 = phi i8 [ undef, %V ], [ 1, %X ], [ 1, %W ] 82*9880d681SAndroid Build Coastguard Worker ret i8 %val.0 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine i8 @testmergesome(i32 %u, i32* %A) { 86*9880d681SAndroid Build Coastguard WorkerV: 87*9880d681SAndroid Build Coastguard Worker switch i32 %u, label %Y [ 88*9880d681SAndroid Build Coastguard Worker i32 0, label %W 89*9880d681SAndroid Build Coastguard Worker i32 1, label %X 90*9880d681SAndroid Build Coastguard Worker i32 2, label %X 91*9880d681SAndroid Build Coastguard Worker i32 3, label %Z 92*9880d681SAndroid Build Coastguard Worker ] 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard WorkerW: ; preds = %V 95*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %A, align 4 96*9880d681SAndroid Build Coastguard Worker br label %Y 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard WorkerZ: 99*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %A, align 4 100*9880d681SAndroid Build Coastguard Worker br label %X 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard WorkerX: ; preds = %V, %Z 103*9880d681SAndroid Build Coastguard Worker br label %Y 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard WorkerY: ; preds = %X, %W, %V 106*9880d681SAndroid Build Coastguard Worker ; After merging X into Y, we should have 5 predecessors 107*9880d681SAndroid Build Coastguard Worker ; and thus 5 incoming values to the phi. 108*9880d681SAndroid Build Coastguard Worker %val.0 = phi i8 [ 1, %V ], [ 1, %X ], [ 2, %W ] 109*9880d681SAndroid Build Coastguard Worker ret i8 %val.0 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine i8 @testmergesome2(i32 %u, i32* %A) { 114*9880d681SAndroid Build Coastguard WorkerV: 115*9880d681SAndroid Build Coastguard Worker switch i32 %u, label %W [ 116*9880d681SAndroid Build Coastguard Worker i32 0, label %W 117*9880d681SAndroid Build Coastguard Worker i32 1, label %Y 118*9880d681SAndroid Build Coastguard Worker i32 2, label %X 119*9880d681SAndroid Build Coastguard Worker i32 4, label %Y 120*9880d681SAndroid Build Coastguard Worker ] 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard WorkerW: ; preds = %V 123*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %A, align 4 124*9880d681SAndroid Build Coastguard Worker br label %Y 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard WorkerX: ; preds = %V, %Z 127*9880d681SAndroid Build Coastguard Worker br label %Y 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard WorkerY: ; preds = %X, %W, %V 130*9880d681SAndroid Build Coastguard Worker ; Ensure that we deal with both undef inputs for V when we merge in X. 131*9880d681SAndroid Build Coastguard Worker %val.0 = phi i8 [ undef, %V ], [ 1, %X ], [ 2, %W ], [ undef, %V ] 132*9880d681SAndroid Build Coastguard Worker ret i8 %val.0 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; This function can't be merged 136*9880d681SAndroid Build Coastguard Workerdefine void @a() { 137*9880d681SAndroid Build Coastguard Workerentry: 138*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 141*9880d681SAndroid Build Coastguard Worker ; This phi has a conflicting value (0) with below phi (2), so blocks 142*9880d681SAndroid Build Coastguard Worker ; can't be merged. 143*9880d681SAndroid Build Coastguard Worker %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker br label %Succ 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.nomerge 147*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ %a, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0] 148*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 149*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Exit 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 152*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 153*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Succ 156*9880d681SAndroid Build Coastguard Worker ret void 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; This function can't be merged 160*9880d681SAndroid Build Coastguard Workerdefine void @b() { 161*9880d681SAndroid Build Coastguard Workerentry: 162*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 165*9880d681SAndroid Build Coastguard Worker br label %Succ 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.nomerge 168*9880d681SAndroid Build Coastguard Worker ; This phi has confliction values for Common and (through BB) Common, 169*9880d681SAndroid Build Coastguard Worker ; blocks can't be merged 170*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ 1, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0] 171*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 172*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Exit 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 175*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 176*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Succ 179*9880d681SAndroid Build Coastguard Worker ret void 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; This function can't be merged (for keeping canonical loop structures) 183*9880d681SAndroid Build Coastguard Workerdefine void @c() { 184*9880d681SAndroid Build Coastguard Workerentry: 185*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 188*9880d681SAndroid Build Coastguard Worker br label %Succ 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.tomerge, %Pre-Exit 191*9880d681SAndroid Build Coastguard Worker ; This phi has identical values for Common and (through BB) Common, 192*9880d681SAndroid Build Coastguard Worker ; blocks can't be merged 193*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ 1, %BB.nomerge ], [ 1, %Common ], [ 2, %Pre-Exit ] 194*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 195*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Pre-Exit 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 198*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 199*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard WorkerPre-Exit: ; preds = %Succ 202*9880d681SAndroid Build Coastguard Worker ; This adds a backedge, so the %b phi node gets a third branch and is 203*9880d681SAndroid Build Coastguard Worker ; not completely trivial 204*9880d681SAndroid Build Coastguard Worker %cond2 = call i1 @foo( ) ; <i1> [#uses=1] 205*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %Succ, label %Exit 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Pre-Exit 208*9880d681SAndroid Build Coastguard Worker ret void 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker; This function can't be merged (for keeping canonical loop structures) 212*9880d681SAndroid Build Coastguard Workerdefine void @d() { 213*9880d681SAndroid Build Coastguard Workerentry: 214*9880d681SAndroid Build Coastguard Worker br label %BB.nomerge 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard WorkerBB.nomerge: ; preds = %Common, %entry 217*9880d681SAndroid Build Coastguard Worker ; This phi has a matching value (0) with below phi (0), so blocks 218*9880d681SAndroid Build Coastguard Worker ; can be merged. 219*9880d681SAndroid Build Coastguard Worker %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1] 220*9880d681SAndroid Build Coastguard Worker br label %Succ 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Common, %BB.tomerge 223*9880d681SAndroid Build Coastguard Worker %b = phi i32 [ %a, %BB.nomerge ], [ 0, %Common ] ; <i32> [#uses=0] 224*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 225*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Common, label %Exit 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard WorkerCommon: ; preds = %Succ 228*9880d681SAndroid Build Coastguard Worker %cond = call i1 @foo( ) ; <i1> [#uses=1] 229*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB.nomerge, label %Succ 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Succ 232*9880d681SAndroid Build Coastguard Worker ret void 233*9880d681SAndroid Build Coastguard Worker} 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; This function can be merged 236*9880d681SAndroid Build Coastguard Workerdefine void @e() { 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker br label %Succ 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard WorkerSucc: ; preds = %Use, %entry 241*9880d681SAndroid Build Coastguard Worker ; This phi is used somewhere else than Succ, but this should not prevent 242*9880d681SAndroid Build Coastguard Worker ; merging this block 243*9880d681SAndroid Build Coastguard Worker %a = phi i32 [ 1, %entry ], [ 0, %Use ] ; <i32> [#uses=1] 244*9880d681SAndroid Build Coastguard Worker br label %BB.tomerge 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard WorkerBB.tomerge: ; preds = %Succ 247*9880d681SAndroid Build Coastguard Worker %conde = call i1 @foo( ) ; <i1> [#uses=1] 248*9880d681SAndroid Build Coastguard Worker br i1 %conde, label %Use, label %Exit 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard WorkerUse: ; preds = %Succ 251*9880d681SAndroid Build Coastguard Worker %cond = call i1 @bar( i32 %a ) ; <i1> [#uses=1] 252*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Succ, label %Exit 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Use, %Succ 255*9880d681SAndroid Build Coastguard Worker ret void 256*9880d681SAndroid Build Coastguard Worker} 257