1*9880d681SAndroid Build Coastguard Worker; This test makes sure that these instructions are properly eliminated. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128:n8:16:32:64" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A, i1 %b) { 8*9880d681SAndroid Build Coastguard WorkerBB0: 9*9880d681SAndroid Build Coastguard Worker br i1 %b, label %BB1, label %BB2 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard WorkerBB1: 12*9880d681SAndroid Build Coastguard Worker ; Combine away one argument PHI nodes 13*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %A, %BB0 ] 14*9880d681SAndroid Build Coastguard Worker ret i32 %B 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard WorkerBB2: 17*9880d681SAndroid Build Coastguard Worker ret i32 %A 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 19*9880d681SAndroid Build Coastguard Worker; CHECK: BB1: 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A, i1 %b) { 24*9880d681SAndroid Build Coastguard WorkerBB0: 25*9880d681SAndroid Build Coastguard Worker br i1 %b, label %BB1, label %BB2 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard WorkerBB1: 28*9880d681SAndroid Build Coastguard Worker br label %BB2 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard WorkerBB2: 31*9880d681SAndroid Build Coastguard Worker ; Combine away PHI nodes with same values 32*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %A, %BB0 ], [ %A, %BB1 ] 33*9880d681SAndroid Build Coastguard Worker ret i32 %B 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 35*9880d681SAndroid Build Coastguard Worker; CHECK: BB2: 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A, i1 %b) { 40*9880d681SAndroid Build Coastguard WorkerBB0: 41*9880d681SAndroid Build Coastguard Worker br label %Loop 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard WorkerLoop: 44*9880d681SAndroid Build Coastguard Worker ; PHI has same value always. 45*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %A, %BB0 ], [ %B, %Loop ] 46*9880d681SAndroid Build Coastguard Worker br i1 %b, label %Loop, label %Exit 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard WorkerExit: 49*9880d681SAndroid Build Coastguard Worker ret i32 %B 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 51*9880d681SAndroid Build Coastguard Worker; CHECK: Exit: 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i1 %b) { 56*9880d681SAndroid Build Coastguard WorkerBB0: 57*9880d681SAndroid Build Coastguard Worker ; Loop is unreachable 58*9880d681SAndroid Build Coastguard Worker ret i32 7 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %L2, %Loop 61*9880d681SAndroid Build Coastguard Worker ; PHI has same value always. 62*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %B, %L2 ], [ %B, %Loop ] 63*9880d681SAndroid Build Coastguard Worker br i1 %b, label %L2, label %Loop 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard WorkerL2: ; preds = %Loop 66*9880d681SAndroid Build Coastguard Worker br label %Loop 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 68*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %b 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A, i1 %b) { 73*9880d681SAndroid Build Coastguard WorkerBB0: 74*9880d681SAndroid Build Coastguard Worker br label %Loop 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %BB0 77*9880d681SAndroid Build Coastguard Worker ; PHI has same value always. 78*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %A, %BB0 ], [ undef, %Loop ] 79*9880d681SAndroid Build Coastguard Worker br i1 %b, label %Loop, label %Exit 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Loop 82*9880d681SAndroid Build Coastguard Worker ret i32 %B 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 84*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %b 86*9880d681SAndroid Build Coastguard Worker; CHECK: Exit: 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i16 %A, i1 %b) { 91*9880d681SAndroid Build Coastguard WorkerBB0: 92*9880d681SAndroid Build Coastguard Worker %X = zext i16 %A to i32 93*9880d681SAndroid Build Coastguard Worker br i1 %b, label %BB1, label %BB2 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard WorkerBB1: 96*9880d681SAndroid Build Coastguard Worker %Y = zext i16 %A to i32 97*9880d681SAndroid Build Coastguard Worker br label %BB2 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard WorkerBB2: 100*9880d681SAndroid Build Coastguard Worker ;; Suck casts into phi 101*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ] 102*9880d681SAndroid Build Coastguard Worker ret i32 %B 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 104*9880d681SAndroid Build Coastguard Worker; CHECK: BB2: 105*9880d681SAndroid Build Coastguard Worker; CHECK: zext i16 %A to i32 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A, i1 %b) { 110*9880d681SAndroid Build Coastguard WorkerBB0: 111*9880d681SAndroid Build Coastguard Worker br label %Loop 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %BB0 114*9880d681SAndroid Build Coastguard Worker ; PHI is dead. 115*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %A, %BB0 ], [ %C, %Loop ] 116*9880d681SAndroid Build Coastguard Worker %C = add i32 %B, 123 117*9880d681SAndroid Build Coastguard Worker br i1 %b, label %Loop, label %Exit 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Loop 120*9880d681SAndroid Build Coastguard Worker ret i32 0 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 122*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %b 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i32* @test8({ i32, i32 } *%A, i1 %b) { 127*9880d681SAndroid Build Coastguard WorkerBB0: 128*9880d681SAndroid Build Coastguard Worker %X = getelementptr inbounds { i32, i32 }, { i32, i32 } *%A, i32 0, i32 1 129*9880d681SAndroid Build Coastguard Worker br i1 %b, label %BB1, label %BB2 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard WorkerBB1: 132*9880d681SAndroid Build Coastguard Worker %Y = getelementptr { i32, i32 }, { i32, i32 } *%A, i32 0, i32 1 133*9880d681SAndroid Build Coastguard Worker br label %BB2 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard WorkerBB2: 136*9880d681SAndroid Build Coastguard Worker ;; Suck GEPs into phi 137*9880d681SAndroid Build Coastguard Worker %B = phi i32* [ %X, %BB0 ], [ %Y, %BB1 ] 138*9880d681SAndroid Build Coastguard Worker ret i32* %B 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 140*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 141*9880d681SAndroid Build Coastguard Worker; CHECK: BB2: 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %B = getelementptr { i32, i32 }, { i32, i32 }* %A 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32* %B 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32* %A, i32* %B) { 147*9880d681SAndroid Build Coastguard Workerentry: 148*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %A, null 149*9880d681SAndroid Build Coastguard Worker br i1 %c, label %bb1, label %bb 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerbb: 152*9880d681SAndroid Build Coastguard Worker %C = load i32, i32* %B, align 1 153*9880d681SAndroid Build Coastguard Worker br label %bb2 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerbb1: 156*9880d681SAndroid Build Coastguard Worker %D = load i32, i32* %A, align 1 157*9880d681SAndroid Build Coastguard Worker br label %bb2 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerbb2: 160*9880d681SAndroid Build Coastguard Worker %E = phi i32 [ %C, %bb ], [ %D, %bb1 ] 161*9880d681SAndroid Build Coastguard Worker ret i32 %E 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 163*9880d681SAndroid Build Coastguard Worker; CHECK: bb2: 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32* [ %B, %bb ], [ %A, %bb1 ] 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %E = load i32, i32* %{{[^,]*}}, align 1 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %E 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32* %A, i32* %B) { 171*9880d681SAndroid Build Coastguard Workerentry: 172*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32* %A, null 173*9880d681SAndroid Build Coastguard Worker br i1 %c, label %bb1, label %bb 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerbb: 176*9880d681SAndroid Build Coastguard Worker %C = load i32, i32* %B, align 16 177*9880d681SAndroid Build Coastguard Worker br label %bb2 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerbb1: 180*9880d681SAndroid Build Coastguard Worker %D = load i32, i32* %A, align 32 181*9880d681SAndroid Build Coastguard Worker br label %bb2 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerbb2: 184*9880d681SAndroid Build Coastguard Worker %E = phi i32 [ %C, %bb ], [ %D, %bb1 ] 185*9880d681SAndroid Build Coastguard Worker ret i32 %E 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 187*9880d681SAndroid Build Coastguard Worker; CHECK: bb2: 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32* [ %B, %bb ], [ %A, %bb1 ] 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %E = load i32, i32* %{{[^,]*}}, align 16 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %E 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker; PR1777 195*9880d681SAndroid Build Coastguard Workerdeclare i1 @test11a() 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine i1 @test11() { 198*9880d681SAndroid Build Coastguard Workerentry: 199*9880d681SAndroid Build Coastguard Worker %a = alloca i32 200*9880d681SAndroid Build Coastguard Worker %i = ptrtoint i32* %a to i64 201*9880d681SAndroid Build Coastguard Worker %b = call i1 @test11a() 202*9880d681SAndroid Build Coastguard Worker br i1 %b, label %one, label %two 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerone: 205*9880d681SAndroid Build Coastguard Worker %x = phi i64 [%i, %entry], [%y, %two] 206*9880d681SAndroid Build Coastguard Worker %c = call i1 @test11a() 207*9880d681SAndroid Build Coastguard Worker br i1 %c, label %two, label %end 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workertwo: 210*9880d681SAndroid Build Coastguard Worker %y = phi i64 [%i, %entry], [%x, %one] 211*9880d681SAndroid Build Coastguard Worker %d = call i1 @test11a() 212*9880d681SAndroid Build Coastguard Worker br i1 %d, label %one, label %end 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerend: 215*9880d681SAndroid Build Coastguard Worker %f = phi i64 [ %x, %one], [%y, %two] 216*9880d681SAndroid Build Coastguard Worker ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter 217*9880d681SAndroid Build Coastguard Worker ; even though %f must equal %i at this point 218*9880d681SAndroid Build Coastguard Worker %g = inttoptr i64 %f to i32* 219*9880d681SAndroid Build Coastguard Worker store i32 10, i32* %g 220*9880d681SAndroid Build Coastguard Worker %z = call i1 @test11a() 221*9880d681SAndroid Build Coastguard Worker ret i1 %z 222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 223*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi i32 224*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %z 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Workerdefine i64 @test12(i1 %cond, i8* %Ptr, i64 %Val) { 229*9880d681SAndroid Build Coastguard Workerentry: 230*9880d681SAndroid Build Coastguard Worker %tmp41 = ptrtoint i8* %Ptr to i64 231*9880d681SAndroid Build Coastguard Worker %tmp42 = zext i64 %tmp41 to i128 232*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %end, label %two 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workertwo: 235*9880d681SAndroid Build Coastguard Worker %tmp36 = zext i64 %Val to i128 ; <i128> [#uses=1] 236*9880d681SAndroid Build Coastguard Worker %tmp37 = shl i128 %tmp36, 64 ; <i128> [#uses=1] 237*9880d681SAndroid Build Coastguard Worker %ins39 = or i128 %tmp42, %tmp37 ; <i128> [#uses=1] 238*9880d681SAndroid Build Coastguard Worker br label %end 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerend: 241*9880d681SAndroid Build Coastguard Worker %tmp869.0 = phi i128 [ %tmp42, %entry ], [ %ins39, %two ] 242*9880d681SAndroid Build Coastguard Worker %tmp32 = trunc i128 %tmp869.0 to i64 ; <i64> [#uses=1] 243*9880d681SAndroid Build Coastguard Worker %tmp29 = lshr i128 %tmp869.0, 64 ; <i128> [#uses=1] 244*9880d681SAndroid Build Coastguard Worker %tmp30 = trunc i128 %tmp29 to i64 ; <i64> [#uses=1] 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker %tmp2 = add i64 %tmp32, %tmp30 247*9880d681SAndroid Build Coastguard Worker ret i64 %tmp2 248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 249*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: zext 250*9880d681SAndroid Build Coastguard Worker; CHECK: end: 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i64 [ 0, %entry ], [ %Val, %two ] 252*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 253*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Workerdeclare void @test13f(double, i32) 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerdefine void @test13(i1 %cond, i32 %V1, double %Vald) { 259*9880d681SAndroid Build Coastguard Workerentry: 260*9880d681SAndroid Build Coastguard Worker %tmp42 = zext i32 %V1 to i128 261*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %end, label %two 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Workertwo: 264*9880d681SAndroid Build Coastguard Worker %Val = bitcast double %Vald to i64 265*9880d681SAndroid Build Coastguard Worker %tmp36 = zext i64 %Val to i128 ; <i128> [#uses=1] 266*9880d681SAndroid Build Coastguard Worker %tmp37 = shl i128 %tmp36, 64 ; <i128> [#uses=1] 267*9880d681SAndroid Build Coastguard Worker %ins39 = or i128 %tmp42, %tmp37 ; <i128> [#uses=1] 268*9880d681SAndroid Build Coastguard Worker br label %end 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerend: 271*9880d681SAndroid Build Coastguard Worker %tmp869.0 = phi i128 [ %tmp42, %entry ], [ %ins39, %two ] 272*9880d681SAndroid Build Coastguard Worker %tmp32 = trunc i128 %tmp869.0 to i32 273*9880d681SAndroid Build Coastguard Worker %tmp29 = lshr i128 %tmp869.0, 64 ; <i128> [#uses=1] 274*9880d681SAndroid Build Coastguard Worker %tmp30 = trunc i128 %tmp29 to i64 ; <i64> [#uses=1] 275*9880d681SAndroid Build Coastguard Worker %tmp31 = bitcast i64 %tmp30 to double 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker call void @test13f(double %tmp31, i32 %tmp32) 278*9880d681SAndroid Build Coastguard Worker ret void 279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 280*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: zext 281*9880d681SAndroid Build Coastguard Worker; CHECK: end: 282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi double [ 0.000000e+00, %entry ], [ %Vald, %two ] 283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @test13f(double {{[^,]*}}, i32 %V1) 284*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 285*9880d681SAndroid Build Coastguard Worker} 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Workerdefine i640 @test14a(i320 %A, i320 %B, i1 %b1) { 288*9880d681SAndroid Build Coastguard WorkerBB0: 289*9880d681SAndroid Build Coastguard Worker %a = zext i320 %A to i640 290*9880d681SAndroid Build Coastguard Worker %b = zext i320 %B to i640 291*9880d681SAndroid Build Coastguard Worker br label %Loop 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard WorkerLoop: 294*9880d681SAndroid Build Coastguard Worker %C = phi i640 [ %a, %BB0 ], [ %b, %Loop ] 295*9880d681SAndroid Build Coastguard Worker br i1 %b1, label %Loop, label %Exit 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Loop 298*9880d681SAndroid Build Coastguard Worker ret i640 %C 299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14a( 300*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i320 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdefine i160 @test14b(i320 %A, i320 %B, i1 %b1) { 305*9880d681SAndroid Build Coastguard WorkerBB0: 306*9880d681SAndroid Build Coastguard Worker %a = trunc i320 %A to i160 307*9880d681SAndroid Build Coastguard Worker %b = trunc i320 %B to i160 308*9880d681SAndroid Build Coastguard Worker br label %Loop 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard WorkerLoop: 311*9880d681SAndroid Build Coastguard Worker %C = phi i160 [ %a, %BB0 ], [ %b, %Loop ] 312*9880d681SAndroid Build Coastguard Worker br i1 %b1, label %Loop, label %Exit 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Loop 315*9880d681SAndroid Build Coastguard Worker ret i160 %C 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14b( 317*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i160 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdeclare i64 @test15a(i64) 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Workerdefine i64 @test15b(i64 %A, i1 %b) { 324*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15b( 325*9880d681SAndroid Build Coastguard Workerentry: 326*9880d681SAndroid Build Coastguard Worker %i0 = zext i64 %A to i128 327*9880d681SAndroid Build Coastguard Worker %i1 = shl i128 %i0, 64 328*9880d681SAndroid Build Coastguard Worker %i = or i128 %i1, %i0 329*9880d681SAndroid Build Coastguard Worker br i1 %b, label %one, label %two 330*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %b 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Workerone: 334*9880d681SAndroid Build Coastguard Worker %x = phi i128 [%i, %entry], [%y, %two] 335*9880d681SAndroid Build Coastguard Worker %x1 = lshr i128 %x, 64 336*9880d681SAndroid Build Coastguard Worker %x2 = trunc i128 %x1 to i64 337*9880d681SAndroid Build Coastguard Worker %c = call i64 @test15a(i64 %x2) 338*9880d681SAndroid Build Coastguard Worker %c1 = zext i64 %c to i128 339*9880d681SAndroid Build Coastguard Worker br label %two 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker; CHECK: one: 342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i64 343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %c = call i64 @test15a 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Workertwo: 346*9880d681SAndroid Build Coastguard Worker %y = phi i128 [%i, %entry], [%c1, %one] 347*9880d681SAndroid Build Coastguard Worker %y1 = lshr i128 %y, 64 348*9880d681SAndroid Build Coastguard Worker %y2 = trunc i128 %y1 to i64 349*9880d681SAndroid Build Coastguard Worker %d = call i64 @test15a(i64 %y2) 350*9880d681SAndroid Build Coastguard Worker %d1 = trunc i64 %d to i1 351*9880d681SAndroid Build Coastguard Worker br i1 %d1, label %one, label %end 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker; CHECK: two: 354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i64 355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i64 356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %d = call i64 @test15a 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Workerend: 359*9880d681SAndroid Build Coastguard Worker %g = trunc i128 %y to i64 360*9880d681SAndroid Build Coastguard Worker ret i64 %g 361*9880d681SAndroid Build Coastguard Worker; CHECK: end: 362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 363*9880d681SAndroid Build Coastguard Worker} 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker; PR6512 - Shouldn't merge loads from different addr spaces. 366*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i32 addrspace(1)* %pointer1, i32 %flag, i32* %pointer2) 367*9880d681SAndroid Build Coastguard Workernounwind { 368*9880d681SAndroid Build Coastguard Workerentry: 369*9880d681SAndroid Build Coastguard Worker %retval = alloca i32, align 4 ; <i32*> [#uses=2] 370*9880d681SAndroid Build Coastguard Worker %pointer1.addr = alloca i32 addrspace(1)*, align 4 ; <i32 addrspace(1)**> 371*9880d681SAndroid Build Coastguard Worker %flag.addr = alloca i32, align 4 ; <i32*> [#uses=2] 372*9880d681SAndroid Build Coastguard Worker %pointer2.addr = alloca i32*, align 4 ; <i32**> [#uses=2] 373*9880d681SAndroid Build Coastguard Worker %res = alloca i32, align 4 ; <i32*> [#uses=4] 374*9880d681SAndroid Build Coastguard Worker store i32 addrspace(1)* %pointer1, i32 addrspace(1)** %pointer1.addr 375*9880d681SAndroid Build Coastguard Worker store i32 %flag, i32* %flag.addr 376*9880d681SAndroid Build Coastguard Worker store i32* %pointer2, i32** %pointer2.addr 377*9880d681SAndroid Build Coastguard Worker store i32 10, i32* %res 378*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %flag.addr ; <i32> [#uses=1] 379*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %tmp, 0 ; <i1> [#uses=1] 380*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %if.else 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.end 383*9880d681SAndroid Build Coastguard Worker %tmp7 = load i32, i32* %retval ; <i32> [#uses=1] 384*9880d681SAndroid Build Coastguard Worker ret i32 %tmp7 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %if.then 387*9880d681SAndroid Build Coastguard Worker %tmp6 = load i32, i32* %res ; <i32> [#uses=1] 388*9880d681SAndroid Build Coastguard Worker store i32 %tmp6, i32* %retval 389*9880d681SAndroid Build Coastguard Worker br label %return 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 392*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32 addrspace(1)*, i32 addrspace(1)** %pointer1.addr ; <i32 addrspace(1)*> 393*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr i32, i32 addrspace(1)* %tmp1, i32 0 ; <i32 addrspace(1)*> [#uses=1] 394*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32 addrspace(1)* %arrayidx ; <i32> [#uses=1] 395*9880d681SAndroid Build Coastguard Worker store i32 %tmp2, i32* %res 396*9880d681SAndroid Build Coastguard Worker br label %if.end 397*9880d681SAndroid Build Coastguard Worker 398*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 399*9880d681SAndroid Build Coastguard Worker %tmp3 = load i32*, i32** %pointer2.addr ; <i32*> [#uses=1] 400*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr i32, i32* %tmp3, i32 0 ; <i32*> [#uses=1] 401*9880d681SAndroid Build Coastguard Worker %tmp5 = load i32, i32* %arrayidx4 ; <i32> [#uses=1] 402*9880d681SAndroid Build Coastguard Worker store i32 %tmp5, i32* %res 403*9880d681SAndroid Build Coastguard Worker br label %if.end 404*9880d681SAndroid Build Coastguard Worker} 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Worker; PR4413 407*9880d681SAndroid Build Coastguard Workerdeclare i32 @ext() 408*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 409*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(i1 %a) { 410*9880d681SAndroid Build Coastguard Workerentry: 411*9880d681SAndroid Build Coastguard Worker br i1 %a, label %bb1, label %bb2 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 414*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @ext() ; <i32> [#uses=1] 415*9880d681SAndroid Build Coastguard Worker br label %bb2 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1, %entry 418*9880d681SAndroid Build Coastguard Worker %cond = phi i1 [ true, %bb1 ], [ false, %entry ] ; <i1> [#uses=1] 419*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %val = phi i32 [ %0, %bb1 ], [ 0, %entry ] 420*9880d681SAndroid Build Coastguard Worker %val = phi i32 [ %0, %bb1 ], [ 0, %entry ] ; <i32> [#uses=1] 421*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i32 %val, i32 0 ; <i32> [#uses=1] 422*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 423*9880d681SAndroid Build Coastguard Worker ret i32 %res 424*9880d681SAndroid Build Coastguard Worker} 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i1 %cond) { 427*9880d681SAndroid Build Coastguard Worker %zero = alloca i32 428*9880d681SAndroid Build Coastguard Worker %one = alloca i32 429*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %true, label %false 430*9880d681SAndroid Build Coastguard Workertrue: 431*9880d681SAndroid Build Coastguard Worker br label %ret 432*9880d681SAndroid Build Coastguard Workerfalse: 433*9880d681SAndroid Build Coastguard Worker br label %ret 434*9880d681SAndroid Build Coastguard Workerret: 435*9880d681SAndroid Build Coastguard Worker %ptr = phi i32* [ %zero, %true ] , [ %one, %false ] 436*9880d681SAndroid Build Coastguard Worker %isnull = icmp eq i32* %ptr, null 437*9880d681SAndroid Build Coastguard Worker ret i1 %isnull 438*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 439*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 440*9880d681SAndroid Build Coastguard Worker} 441*9880d681SAndroid Build Coastguard Worker 442*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i1 %cond, double %x) { 443*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %true, label %false 444*9880d681SAndroid Build Coastguard Workertrue: 445*9880d681SAndroid Build Coastguard Worker br label %ret 446*9880d681SAndroid Build Coastguard Workerfalse: 447*9880d681SAndroid Build Coastguard Worker br label %ret 448*9880d681SAndroid Build Coastguard Workerret: 449*9880d681SAndroid Build Coastguard Worker %p = phi double [ %x, %true ], [ 0x7FF0000000000000, %false ]; RHS = +infty 450*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ule double %x, %p 451*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 452*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 453*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 454*9880d681SAndroid Build Coastguard Worker} 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i1 %cond) { 457*9880d681SAndroid Build Coastguard Worker %a = alloca i32 458*9880d681SAndroid Build Coastguard Worker %b = alloca i32 459*9880d681SAndroid Build Coastguard Worker %c = alloca i32 460*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %true, label %false 461*9880d681SAndroid Build Coastguard Workertrue: 462*9880d681SAndroid Build Coastguard Worker br label %ret 463*9880d681SAndroid Build Coastguard Workerfalse: 464*9880d681SAndroid Build Coastguard Worker br label %ret 465*9880d681SAndroid Build Coastguard Workerret: 466*9880d681SAndroid Build Coastguard Worker %p = phi i32* [ %a, %true ], [ %b, %false ] 467*9880d681SAndroid Build Coastguard Worker %r = icmp eq i32* %p, %c 468*9880d681SAndroid Build Coastguard Worker ret i1 %r 469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 470*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 471*9880d681SAndroid Build Coastguard Worker} 472*9880d681SAndroid Build Coastguard Worker 473*9880d681SAndroid Build Coastguard Workerdefine i1 @test21(i1 %c1, i1 %c2) { 474*9880d681SAndroid Build Coastguard Worker %a = alloca i32 475*9880d681SAndroid Build Coastguard Worker %b = alloca i32 476*9880d681SAndroid Build Coastguard Worker %c = alloca i32 477*9880d681SAndroid Build Coastguard Worker br i1 %c1, label %true, label %false 478*9880d681SAndroid Build Coastguard Workertrue: 479*9880d681SAndroid Build Coastguard Worker br label %loop 480*9880d681SAndroid Build Coastguard Workerfalse: 481*9880d681SAndroid Build Coastguard Worker br label %loop 482*9880d681SAndroid Build Coastguard Workerloop: 483*9880d681SAndroid Build Coastguard Worker %p = phi i32* [ %a, %true ], [ %b, %false ], [ %p, %loop ] 484*9880d681SAndroid Build Coastguard Worker %r = icmp eq i32* %p, %c 485*9880d681SAndroid Build Coastguard Worker br i1 %c2, label %ret, label %loop 486*9880d681SAndroid Build Coastguard Workerret: 487*9880d681SAndroid Build Coastguard Worker ret i1 %r 488*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 489*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 490*9880d681SAndroid Build Coastguard Worker} 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard Workerdefine void @test22() { 493*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22( 494*9880d681SAndroid Build Coastguard Workerentry: 495*9880d681SAndroid Build Coastguard Worker br label %loop 496*9880d681SAndroid Build Coastguard Workerloop: 497*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [ 0, %entry ], [ %y, %loop ] 498*9880d681SAndroid Build Coastguard Worker %y = add i32 %phi, 1 499*9880d681SAndroid Build Coastguard Worker %o = or i32 %y, %phi 500*9880d681SAndroid Build Coastguard Worker %e = icmp eq i32 %o, %y 501*9880d681SAndroid Build Coastguard Worker br i1 %e, label %loop, label %ret 502*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %e 503*9880d681SAndroid Build Coastguard Workerret: 504*9880d681SAndroid Build Coastguard Worker ret void 505*9880d681SAndroid Build Coastguard Worker} 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Workerdefine i32 @test23(i32 %A, i1 %b, i32 * %P) { 508*9880d681SAndroid Build Coastguard WorkerBB0: 509*9880d681SAndroid Build Coastguard Worker br label %Loop 510*9880d681SAndroid Build Coastguard Worker 511*9880d681SAndroid Build Coastguard WorkerLoop: ; preds = %Loop, %BB0 512*9880d681SAndroid Build Coastguard Worker ; PHI has same value always. 513*9880d681SAndroid Build Coastguard Worker %B = phi i32 [ %A, %BB0 ], [ 42, %Loop ] 514*9880d681SAndroid Build Coastguard Worker %D = add i32 %B, 19 515*9880d681SAndroid Build Coastguard Worker store i32 %D, i32* %P 516*9880d681SAndroid Build Coastguard Worker br i1 %b, label %Loop, label %Exit 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard WorkerExit: ; preds = %Loop 519*9880d681SAndroid Build Coastguard Worker %E = add i32 %B, 19 520*9880d681SAndroid Build Coastguard Worker ret i32 %E 521*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 522*9880d681SAndroid Build Coastguard Worker; CHECK: %phitmp = add i32 %A, 19 523*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 524*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %B = phi i32 [ %phitmp, %BB0 ], [ 61, %Loop ] 525*9880d681SAndroid Build Coastguard Worker; CHECK: Exit: 526*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %B 527*9880d681SAndroid Build Coastguard Worker} 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Workerdefine i32 @test24(i32 %A, i1 %cond) { 530*9880d681SAndroid Build Coastguard WorkerBB0: 531*9880d681SAndroid Build Coastguard Worker %X = add nuw nsw i32 %A, 1 532*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %BB1, label %BB2 533*9880d681SAndroid Build Coastguard Worker 534*9880d681SAndroid Build Coastguard WorkerBB1: 535*9880d681SAndroid Build Coastguard Worker %Y = add nuw i32 %A, 1 536*9880d681SAndroid Build Coastguard Worker br label %BB2 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard WorkerBB2: 539*9880d681SAndroid Build Coastguard Worker %C = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ] 540*9880d681SAndroid Build Coastguard Worker ret i32 %C 541*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 542*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 543*9880d681SAndroid Build Coastguard Worker; CHECK: BB2: 544*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %C = add nuw i32 %A, 1 545*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %C 546*9880d681SAndroid Build Coastguard Worker} 547*9880d681SAndroid Build Coastguard Worker 548*9880d681SAndroid Build Coastguard Worker; Same as test11, but used to be missed due to a bug. 549*9880d681SAndroid Build Coastguard Workerdeclare i1 @test25a() 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Workerdefine i1 @test25() { 552*9880d681SAndroid Build Coastguard Workerentry: 553*9880d681SAndroid Build Coastguard Worker %a = alloca i32 554*9880d681SAndroid Build Coastguard Worker %i = ptrtoint i32* %a to i64 555*9880d681SAndroid Build Coastguard Worker %b = call i1 @test25a() 556*9880d681SAndroid Build Coastguard Worker br i1 %b, label %one, label %two 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Workerone: 559*9880d681SAndroid Build Coastguard Worker %x = phi i64 [%y, %two], [%i, %entry] 560*9880d681SAndroid Build Coastguard Worker %c = call i1 @test25a() 561*9880d681SAndroid Build Coastguard Worker br i1 %c, label %two, label %end 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Workertwo: 564*9880d681SAndroid Build Coastguard Worker %y = phi i64 [%x, %one], [%i, %entry] 565*9880d681SAndroid Build Coastguard Worker %d = call i1 @test25a() 566*9880d681SAndroid Build Coastguard Worker br i1 %d, label %one, label %end 567*9880d681SAndroid Build Coastguard Worker 568*9880d681SAndroid Build Coastguard Workerend: 569*9880d681SAndroid Build Coastguard Worker %f = phi i64 [ %x, %one], [%y, %two] 570*9880d681SAndroid Build Coastguard Worker ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter 571*9880d681SAndroid Build Coastguard Worker ; even though %f must equal %i at this point 572*9880d681SAndroid Build Coastguard Worker %g = inttoptr i64 %f to i32* 573*9880d681SAndroid Build Coastguard Worker store i32 10, i32* %g 574*9880d681SAndroid Build Coastguard Worker %z = call i1 @test25a() 575*9880d681SAndroid Build Coastguard Worker ret i1 %z 576*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25( 577*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi i32 578*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %z 579*9880d681SAndroid Build Coastguard Worker} 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Workerdeclare i1 @test26a() 582*9880d681SAndroid Build Coastguard Worker 583*9880d681SAndroid Build Coastguard Workerdefine i1 @test26(i32 %n) { 584*9880d681SAndroid Build Coastguard Workerentry: 585*9880d681SAndroid Build Coastguard Worker %a = alloca i32 586*9880d681SAndroid Build Coastguard Worker %i = ptrtoint i32* %a to i64 587*9880d681SAndroid Build Coastguard Worker %b = call i1 @test26a() 588*9880d681SAndroid Build Coastguard Worker br label %one 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Workerone: 591*9880d681SAndroid Build Coastguard Worker %x = phi i64 [%y, %two], [%w, %three], [%i, %entry] 592*9880d681SAndroid Build Coastguard Worker %c = call i1 @test26a() 593*9880d681SAndroid Build Coastguard Worker switch i32 %n, label %end [ 594*9880d681SAndroid Build Coastguard Worker i32 2, label %two 595*9880d681SAndroid Build Coastguard Worker i32 3, label %three 596*9880d681SAndroid Build Coastguard Worker ] 597*9880d681SAndroid Build Coastguard Worker 598*9880d681SAndroid Build Coastguard Workertwo: 599*9880d681SAndroid Build Coastguard Worker %y = phi i64 [%x, %one], [%w, %three] 600*9880d681SAndroid Build Coastguard Worker %d = call i1 @test26a() 601*9880d681SAndroid Build Coastguard Worker switch i32 %n, label %end [ 602*9880d681SAndroid Build Coastguard Worker i32 10, label %one 603*9880d681SAndroid Build Coastguard Worker i32 30, label %three 604*9880d681SAndroid Build Coastguard Worker ] 605*9880d681SAndroid Build Coastguard Worker 606*9880d681SAndroid Build Coastguard Workerthree: 607*9880d681SAndroid Build Coastguard Worker %w = phi i64 [%y, %two], [%x, %one] 608*9880d681SAndroid Build Coastguard Worker %e = call i1 @test26a() 609*9880d681SAndroid Build Coastguard Worker br i1 %e, label %one, label %two 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Workerend: 612*9880d681SAndroid Build Coastguard Worker %f = phi i64 [ %x, %one], [%y, %two] 613*9880d681SAndroid Build Coastguard Worker ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter 614*9880d681SAndroid Build Coastguard Worker ; even though %f must equal %i at this point 615*9880d681SAndroid Build Coastguard Worker %g = inttoptr i64 %f to i32* 616*9880d681SAndroid Build Coastguard Worker store i32 10, i32* %g 617*9880d681SAndroid Build Coastguard Worker %z = call i1 @test26a() 618*9880d681SAndroid Build Coastguard Worker ret i1 %z 619*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26( 620*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi i32 621*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %z 622*9880d681SAndroid Build Coastguard Worker} 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27( 625*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef 626*9880d681SAndroid Build Coastguard Workerdefine i32 @test27(i1 %b) { 627*9880d681SAndroid Build Coastguard Workerentry: 628*9880d681SAndroid Build Coastguard Worker br label %done 629*9880d681SAndroid Build Coastguard Workerdone: 630*9880d681SAndroid Build Coastguard Worker %y = phi i32 [ undef, %entry ] 631*9880d681SAndroid Build Coastguard Worker ret i32 %y 632*9880d681SAndroid Build Coastguard Worker} 633*9880d681SAndroid Build Coastguard Worker 634*9880d681SAndroid Build Coastguard Worker; We should be able to fold the zexts to the other side of the phi 635*9880d681SAndroid Build Coastguard Worker; even though there's a constant value input to the phi. This is 636*9880d681SAndroid Build Coastguard Worker; because we can shrink that constant to the smaller phi type. 637*9880d681SAndroid Build Coastguard Worker 638*9880d681SAndroid Build Coastguard Workerdefine i1 @PR24766(i8 %x1, i8 %x2, i8 %condition) { 639*9880d681SAndroid Build Coastguard Workerentry: 640*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %condition to i32 641*9880d681SAndroid Build Coastguard Worker switch i32 %conv, label %epilog [ 642*9880d681SAndroid Build Coastguard Worker i32 0, label %sw1 643*9880d681SAndroid Build Coastguard Worker i32 1, label %sw2 644*9880d681SAndroid Build Coastguard Worker ] 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard Workersw1: 647*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i8 %x1, %x2 648*9880d681SAndroid Build Coastguard Worker %frombool1 = zext i1 %cmp1 to i8 649*9880d681SAndroid Build Coastguard Worker br label %epilog 650*9880d681SAndroid Build Coastguard Worker 651*9880d681SAndroid Build Coastguard Workersw2: 652*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sle i8 %x1, %x2 653*9880d681SAndroid Build Coastguard Worker %frombool2 = zext i1 %cmp2 to i8 654*9880d681SAndroid Build Coastguard Worker br label %epilog 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Workerepilog: 657*9880d681SAndroid Build Coastguard Worker %conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ] 658*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i8 %conditionMet, 0 659*9880d681SAndroid Build Coastguard Worker ret i1 %tobool 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24766( 662*9880d681SAndroid Build Coastguard Worker; CHECK: %[[RES:.*]] = phi i1 [ false, %entry ], [ %cmp2, %sw2 ], [ %cmp1, %sw1 ] 663*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %[[RES]] 664*9880d681SAndroid Build Coastguard Worker} 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Worker; Same as above (a phi with more than 2 operands), but no constants 667*9880d681SAndroid Build Coastguard Worker 668*9880d681SAndroid Build Coastguard Workerdefine i1 @PR24766_no_constants(i8 %x1, i8 %x2, i8 %condition, i1 %another_condition) { 669*9880d681SAndroid Build Coastguard Workerentry: 670*9880d681SAndroid Build Coastguard Worker %frombool0 = zext i1 %another_condition to i8 671*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %condition to i32 672*9880d681SAndroid Build Coastguard Worker switch i32 %conv, label %epilog [ 673*9880d681SAndroid Build Coastguard Worker i32 0, label %sw1 674*9880d681SAndroid Build Coastguard Worker i32 1, label %sw2 675*9880d681SAndroid Build Coastguard Worker ] 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Workersw1: 678*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i8 %x1, %x2 679*9880d681SAndroid Build Coastguard Worker %frombool1 = zext i1 %cmp1 to i8 680*9880d681SAndroid Build Coastguard Worker br label %epilog 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Workersw2: 683*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sle i8 %x1, %x2 684*9880d681SAndroid Build Coastguard Worker %frombool2 = zext i1 %cmp2 to i8 685*9880d681SAndroid Build Coastguard Worker br label %epilog 686*9880d681SAndroid Build Coastguard Worker 687*9880d681SAndroid Build Coastguard Workerepilog: 688*9880d681SAndroid Build Coastguard Worker %conditionMet = phi i8 [ %frombool0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ] 689*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i8 %conditionMet, 0 690*9880d681SAndroid Build Coastguard Worker ret i1 %tobool 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24766_no_constants( 693*9880d681SAndroid Build Coastguard Worker; CHECK: %[[RES:.*]] = phi i1 [ %another_condition, %entry ], [ %cmp2, %sw2 ], [ %cmp1, %sw1 ] 694*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %[[RES]] 695*9880d681SAndroid Build Coastguard Worker} 696*9880d681SAndroid Build Coastguard Worker 697*9880d681SAndroid Build Coastguard Worker; Same as above (a phi with more than 2 operands), but two constants 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Workerdefine i1 @PR24766_two_constants(i8 %x1, i8 %x2, i8 %condition) { 700*9880d681SAndroid Build Coastguard Workerentry: 701*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %condition to i32 702*9880d681SAndroid Build Coastguard Worker switch i32 %conv, label %epilog [ 703*9880d681SAndroid Build Coastguard Worker i32 0, label %sw1 704*9880d681SAndroid Build Coastguard Worker i32 1, label %sw2 705*9880d681SAndroid Build Coastguard Worker ] 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Workersw1: 708*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i8 %x1, %x2 709*9880d681SAndroid Build Coastguard Worker %frombool1 = zext i1 %cmp1 to i8 710*9880d681SAndroid Build Coastguard Worker br label %epilog 711*9880d681SAndroid Build Coastguard Worker 712*9880d681SAndroid Build Coastguard Workersw2: 713*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sle i8 %x1, %x2 714*9880d681SAndroid Build Coastguard Worker %frombool2 = zext i1 %cmp2 to i8 715*9880d681SAndroid Build Coastguard Worker br label %epilog 716*9880d681SAndroid Build Coastguard Worker 717*9880d681SAndroid Build Coastguard Workerepilog: 718*9880d681SAndroid Build Coastguard Worker %conditionMet = phi i8 [ 0, %entry ], [ 1, %sw2 ], [ %frombool1, %sw1 ] 719*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i8 %conditionMet, 0 720*9880d681SAndroid Build Coastguard Worker ret i1 %tobool 721*9880d681SAndroid Build Coastguard Worker 722*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24766_two_constants( 723*9880d681SAndroid Build Coastguard Worker; CHECK: %[[RES:.*]] = phi i1 [ false, %entry ], [ true, %sw2 ], [ %cmp1, %sw1 ] 724*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %[[RES]] 725*9880d681SAndroid Build Coastguard Worker} 726*9880d681SAndroid Build Coastguard Worker 727*9880d681SAndroid Build Coastguard Worker; Same as above (a phi with more than 2 operands), but two constants and two variables 728*9880d681SAndroid Build Coastguard Worker 729*9880d681SAndroid Build Coastguard Workerdefine i1 @PR24766_two_constants_two_var(i8 %x1, i8 %x2, i8 %condition) { 730*9880d681SAndroid Build Coastguard Workerentry: 731*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %condition to i32 732*9880d681SAndroid Build Coastguard Worker switch i32 %conv, label %epilog [ 733*9880d681SAndroid Build Coastguard Worker i32 0, label %sw1 734*9880d681SAndroid Build Coastguard Worker i32 1, label %sw2 735*9880d681SAndroid Build Coastguard Worker i32 2, label %sw3 736*9880d681SAndroid Build Coastguard Worker ] 737*9880d681SAndroid Build Coastguard Worker 738*9880d681SAndroid Build Coastguard Workersw1: 739*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i8 %x1, %x2 740*9880d681SAndroid Build Coastguard Worker %frombool1 = zext i1 %cmp1 to i8 741*9880d681SAndroid Build Coastguard Worker br label %epilog 742*9880d681SAndroid Build Coastguard Worker 743*9880d681SAndroid Build Coastguard Workersw2: 744*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sle i8 %x1, %x2 745*9880d681SAndroid Build Coastguard Worker %frombool2 = zext i1 %cmp2 to i8 746*9880d681SAndroid Build Coastguard Worker br label %epilog 747*9880d681SAndroid Build Coastguard Worker 748*9880d681SAndroid Build Coastguard Workersw3: 749*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp sge i8 %x1, %x2 750*9880d681SAndroid Build Coastguard Worker %frombool3 = zext i1 %cmp3 to i8 751*9880d681SAndroid Build Coastguard Worker br label %epilog 752*9880d681SAndroid Build Coastguard Worker 753*9880d681SAndroid Build Coastguard Workerepilog: 754*9880d681SAndroid Build Coastguard Worker %conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ], [ 1, %sw3 ] 755*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i8 %conditionMet, 0 756*9880d681SAndroid Build Coastguard Worker ret i1 %tobool 757*9880d681SAndroid Build Coastguard Worker 758*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24766_two_constants_two_var( 759*9880d681SAndroid Build Coastguard Worker; CHECK: %[[RES:.*]] = phi i1 [ false, %entry ], [ %cmp2, %sw2 ], [ %cmp1, %sw1 ], [ true, %sw3 ] 760*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %[[RES]] 761*9880d681SAndroid Build Coastguard Worker} 762*9880d681SAndroid Build Coastguard Worker 763*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: phi_allnonzeroconstant 764*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi i32 765*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 766*9880d681SAndroid Build Coastguard Workerdefine i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) { 767*9880d681SAndroid Build Coastguard Workerentry: 768*9880d681SAndroid Build Coastguard Worker br i1 %c, label %if.then, label %if.else 769*9880d681SAndroid Build Coastguard Worker 770*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 771*9880d681SAndroid Build Coastguard Worker br label %if.end 772*9880d681SAndroid Build Coastguard Worker 773*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 774*9880d681SAndroid Build Coastguard Worker call void @dummy() 775*9880d681SAndroid Build Coastguard Worker 776*9880d681SAndroid Build Coastguard Worker br label %if.end 777*9880d681SAndroid Build Coastguard Worker 778*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %if.then 779*9880d681SAndroid Build Coastguard Worker %x.0 = phi i32 [ 1, %if.then ], [ 2, %if.else ] 780*9880d681SAndroid Build Coastguard Worker %or = or i32 %x.0, %a 781*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %or, 0 782*9880d681SAndroid Build Coastguard Worker ret i1 %cmp1 783*9880d681SAndroid Build Coastguard Worker} 784*9880d681SAndroid Build Coastguard Worker 785*9880d681SAndroid Build Coastguard Workerdeclare void @dummy() 786*9880d681SAndroid Build Coastguard Worker 787*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_knownnonzero_eq 788*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.then: 789*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 790*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.end: 791*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 [ 1, %if.then ] 792*9880d681SAndroid Build Coastguard Workerdefine i1 @phi_knownnonzero_eq(i32 %n, i32 %s, i32* nocapture readonly %P) { 793*9880d681SAndroid Build Coastguard Workerentry: 794*9880d681SAndroid Build Coastguard Worker %tobool = icmp slt i32 %n, %s 795*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 796*9880d681SAndroid Build Coastguard Worker 797*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 798*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %P 799*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %n, %0 800*9880d681SAndroid Build Coastguard Worker %1 = select i1 %cmp, i32 1, i32 2 801*9880d681SAndroid Build Coastguard Worker br label %if.end 802*9880d681SAndroid Build Coastguard Worker 803*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 804*9880d681SAndroid Build Coastguard Worker %a.0 = phi i32 [ %1, %if.then ], [ %n, %entry ] 805*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %a.0, 0 806*9880d681SAndroid Build Coastguard Worker ret i1 %cmp1 807*9880d681SAndroid Build Coastguard Worker} 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_knownnonzero_ne 810*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.then: 811*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 812*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.end: 813*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 [ 1, %if.then ] 814*9880d681SAndroid Build Coastguard Workerdefine i1 @phi_knownnonzero_ne(i32 %n, i32 %s, i32* nocapture readonly %P) { 815*9880d681SAndroid Build Coastguard Workerentry: 816*9880d681SAndroid Build Coastguard Worker %tobool = icmp slt i32 %n, %s 817*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 820*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %P 821*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %n, %0 822*9880d681SAndroid Build Coastguard Worker %1 = select i1 %cmp, i32 1, i32 2 823*9880d681SAndroid Build Coastguard Worker br label %if.end 824*9880d681SAndroid Build Coastguard Worker 825*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 826*9880d681SAndroid Build Coastguard Worker %a.0 = phi i32 [ %1, %if.then ], [ %n, %entry ] 827*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i32 %a.0, 0 828*9880d681SAndroid Build Coastguard Worker ret i1 %cmp1 829*9880d681SAndroid Build Coastguard Worker} 830*9880d681SAndroid Build Coastguard Worker 831*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_knownnonzero_eq_2 832*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.then: 833*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 834*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.end: 835*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 [ 2, %if.else ] 836*9880d681SAndroid Build Coastguard Workerdefine i1 @phi_knownnonzero_eq_2(i32 %n, i32 %s, i32* nocapture readonly %P) { 837*9880d681SAndroid Build Coastguard Workerentry: 838*9880d681SAndroid Build Coastguard Worker %tobool = icmp slt i32 %n, %s 839*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %if.end 840*9880d681SAndroid Build Coastguard Worker 841*9880d681SAndroid Build Coastguard Workerif.then: 842*9880d681SAndroid Build Coastguard Worker %tobool2 = icmp slt i32 %n, %s 843*9880d681SAndroid Build Coastguard Worker br i1 %tobool2, label %if.else, label %if.end 844*9880d681SAndroid Build Coastguard Worker 845*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 846*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %P 847*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %n, %0 848*9880d681SAndroid Build Coastguard Worker %1 = select i1 %cmp, i32 1, i32 2 849*9880d681SAndroid Build Coastguard Worker br label %if.end 850*9880d681SAndroid Build Coastguard Worker 851*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 852*9880d681SAndroid Build Coastguard Worker %a.0 = phi i32 [ %1, %if.else], [ %n, %entry ], [2, %if.then] 853*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %a.0, 0 854*9880d681SAndroid Build Coastguard Worker ret i1 %cmp1 855*9880d681SAndroid Build Coastguard Worker} 856*9880d681SAndroid Build Coastguard Worker 857*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_knownnonzero_ne_2 858*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.then: 859*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 860*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: if.end: 861*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 [ 2, %if.else ] 862*9880d681SAndroid Build Coastguard Workerdefine i1 @phi_knownnonzero_ne_2(i32 %n, i32 %s, i32* nocapture readonly %P) { 863*9880d681SAndroid Build Coastguard Workerentry: 864*9880d681SAndroid Build Coastguard Worker %tobool = icmp slt i32 %n, %s 865*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %if.end 866*9880d681SAndroid Build Coastguard Worker 867*9880d681SAndroid Build Coastguard Workerif.then: 868*9880d681SAndroid Build Coastguard Worker %tobool2 = icmp slt i32 %n, %s 869*9880d681SAndroid Build Coastguard Worker br i1 %tobool2, label %if.else, label %if.end 870*9880d681SAndroid Build Coastguard Worker 871*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 872*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %P 873*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %n, %0 874*9880d681SAndroid Build Coastguard Worker %1 = select i1 %cmp, i32 1, i32 2 875*9880d681SAndroid Build Coastguard Worker br label %if.end 876*9880d681SAndroid Build Coastguard Worker 877*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 878*9880d681SAndroid Build Coastguard Worker %a.0 = phi i32 [ %1, %if.else], [ %n, %entry ], [2, %if.then] 879*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i32 %a.0, 0 880*9880d681SAndroid Build Coastguard Worker ret i1 %cmp1 881*9880d681SAndroid Build Coastguard Worker} 882