1*9880d681SAndroid Build Coastguard Worker; RUN: opt -jump-threading -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @f1() 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @f2() 5*9880d681SAndroid Build Coastguard Workerdeclare void @f3() 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i1 %cond) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T1, label %F1 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard WorkerT1: 13*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 14*9880d681SAndroid Build Coastguard Worker br label %Merge 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard WorkerF1: 17*9880d681SAndroid Build Coastguard Worker %v2 = call i32 @f2() 18*9880d681SAndroid Build Coastguard Worker br label %Merge 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard WorkerMerge: 21*9880d681SAndroid Build Coastguard Worker %A = phi i1 [true, %T1], [false, %F1] 22*9880d681SAndroid Build Coastguard Worker %B = phi i32 [%v1, %T1], [%v2, %F1] 23*9880d681SAndroid Build Coastguard Worker br i1 %A, label %T2, label %F2 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard WorkerT2: 26*9880d681SAndroid Build Coastguard Worker; CHECK: T2: 27*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %v1 28*9880d681SAndroid Build Coastguard Worker call void @f3() 29*9880d681SAndroid Build Coastguard Worker ret i32 %B 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard WorkerF2: 32*9880d681SAndroid Build Coastguard Worker; CHECK: F2: 33*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %v2 34*9880d681SAndroid Build Coastguard Worker ret i32 %B 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker;; cond is known false on Entry -> F1 edge! 39*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i1 %cond) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 41*9880d681SAndroid Build Coastguard WorkerEntry: 42*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T1, label %F1 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard WorkerT1: 45*9880d681SAndroid Build Coastguard Worker; CHECK: %v1 = call i32 @f1() 46*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 47 47*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 48*9880d681SAndroid Build Coastguard Worker br label %Merge 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard WorkerF1: 51*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Merge, label %F2 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard WorkerMerge: 54*9880d681SAndroid Build Coastguard Worker %B = phi i32 [47, %T1], [192, %F1] 55*9880d681SAndroid Build Coastguard Worker ret i32 %B 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard WorkerF2: 58*9880d681SAndroid Build Coastguard Worker call void @f3() 59*9880d681SAndroid Build Coastguard Worker ret i32 12 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; Undef handling. 64*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i1 %cond) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: T1: 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 42 68*9880d681SAndroid Build Coastguard Worker br i1 undef, label %T1, label %F1 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard WorkerT1: 71*9880d681SAndroid Build Coastguard Worker ret i32 42 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard WorkerF1: 74*9880d681SAndroid Build Coastguard Worker ret i32 17 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i1 %cond, i1 %cond2) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T1, label %F1 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard WorkerT1: 83*9880d681SAndroid Build Coastguard Worker; CHECK: %v1 = call i32 @f1() 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %T 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 87*9880d681SAndroid Build Coastguard Worker br label %Merge 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard WorkerF1: 90*9880d681SAndroid Build Coastguard Worker %v2 = call i32 @f2() 91*9880d681SAndroid Build Coastguard Worker; CHECK: %v2 = call i32 @f2() 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond2, 93*9880d681SAndroid Build Coastguard Worker br label %Merge 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard WorkerMerge: 96*9880d681SAndroid Build Coastguard Worker %A = phi i1 [undef, %T1], [%cond2, %F1] 97*9880d681SAndroid Build Coastguard Worker %B = phi i32 [%v1, %T1], [%v2, %F1] 98*9880d681SAndroid Build Coastguard Worker br i1 %A, label %T2, label %F2 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard WorkerT2: 101*9880d681SAndroid Build Coastguard Worker call void @f3() 102*9880d681SAndroid Build Coastguard Worker ret i32 %B 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard WorkerF2: 105*9880d681SAndroid Build Coastguard Worker ret i32 %B 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker;; This tests that the branch in 'merge' can be cloned up into T1. 110*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i1 %cond, i1 %cond2) { 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T1, label %F1 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard WorkerT1: 116*9880d681SAndroid Build Coastguard Worker; CHECK: T1: 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v1 = call i32 @f1() 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cond3 = icmp eq i32 %v1, 412 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond3, label %T2, label %F2 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 122*9880d681SAndroid Build Coastguard Worker %cond3 = icmp eq i32 %v1, 412 123*9880d681SAndroid Build Coastguard Worker br label %Merge 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard WorkerF1: 126*9880d681SAndroid Build Coastguard Worker %v2 = call i32 @f2() 127*9880d681SAndroid Build Coastguard Worker br label %Merge 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard WorkerMerge: 130*9880d681SAndroid Build Coastguard Worker %A = phi i1 [%cond3, %T1], [%cond2, %F1] 131*9880d681SAndroid Build Coastguard Worker %B = phi i32 [%v1, %T1], [%v2, %F1] 132*9880d681SAndroid Build Coastguard Worker br i1 %A, label %T2, label %F2 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard WorkerT2: 135*9880d681SAndroid Build Coastguard Worker call void @f3() 136*9880d681SAndroid Build Coastguard Worker ret i32 %B 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard WorkerF2: 139*9880d681SAndroid Build Coastguard Worker ret i32 %B 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker;; Lexically duplicated conditionals should be threaded. 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) { 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 148*9880d681SAndroid Build Coastguard Worker %tmp455 = icmp eq i32 %A, 42 149*9880d681SAndroid Build Coastguard Worker br i1 %tmp455, label %BB1, label %BB2 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f2() 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 3 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f1() 155*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 156*9880d681SAndroid Build Coastguard Worker; CHECK: call void @f3() 157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 158*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 4 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard WorkerBB2: 161*9880d681SAndroid Build Coastguard Worker call i32 @f1() 162*9880d681SAndroid Build Coastguard Worker br label %BB1 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard WorkerBB1: 166*9880d681SAndroid Build Coastguard Worker %tmp459 = icmp eq i32 %A, 42 167*9880d681SAndroid Build Coastguard Worker br i1 %tmp459, label %BB3, label %BB4 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard WorkerBB3: 170*9880d681SAndroid Build Coastguard Worker call i32 @f2() 171*9880d681SAndroid Build Coastguard Worker ret i32 3 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard WorkerBB4: 174*9880d681SAndroid Build Coastguard Worker call void @f3() 175*9880d681SAndroid Build Coastguard Worker ret i32 4 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker;; This tests that the branch in 'merge' can be cloned up into T1. 180*9880d681SAndroid Build Coastguard Worker;; rdar://7367025 181*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i1 %cond, i1 %cond2) { 182*9880d681SAndroid Build Coastguard WorkerEntry: 183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 184*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 185*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Merge, label %F1 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard WorkerF1: 188*9880d681SAndroid Build Coastguard Worker %v2 = call i32 @f2() 189*9880d681SAndroid Build Coastguard Worker br label %Merge 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard WorkerMerge: 192*9880d681SAndroid Build Coastguard Worker %B = phi i32 [%v1, %Entry], [%v2, %F1] 193*9880d681SAndroid Build Coastguard Worker %M = icmp ne i32 %B, %v1 194*9880d681SAndroid Build Coastguard Worker %N = icmp eq i32 %B, 47 195*9880d681SAndroid Build Coastguard Worker %O = and i1 %M, %N 196*9880d681SAndroid Build Coastguard Worker br i1 %O, label %T2, label %F2 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker; CHECK: Merge: 199*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v2 = call i32 @f2() 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard WorkerT2: 203*9880d681SAndroid Build Coastguard Worker call void @f3() 204*9880d681SAndroid Build Coastguard Worker ret i32 %B 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard WorkerF2: 207*9880d681SAndroid Build Coastguard Worker ret i32 %B 208*9880d681SAndroid Build Coastguard Worker; CHECK: F2: 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdeclare i1 @test8a() 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerdefine i32 @test8b(i1 %cond, i1 %cond2) { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8b( 217*9880d681SAndroid Build Coastguard WorkerT0: 218*9880d681SAndroid Build Coastguard Worker %A = call i1 @test8a() 219*9880d681SAndroid Build Coastguard Worker br i1 %A, label %T1, label %F1 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; CHECK: T0: 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %A, label %T1, label %Y 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard WorkerT1: 226*9880d681SAndroid Build Coastguard Worker %B = call i1 @test8a() 227*9880d681SAndroid Build Coastguard Worker br i1 %B, label %T2, label %F1 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; CHECK: T1: 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %B, label %T2, label %Y 232*9880d681SAndroid Build Coastguard WorkerT2: 233*9880d681SAndroid Build Coastguard Worker %C = call i1 @test8a() 234*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T3, label %F1 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; CHECK: T2: 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %T3, label %Y 239*9880d681SAndroid Build Coastguard WorkerT3: 240*9880d681SAndroid Build Coastguard Worker ret i32 0 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard WorkerF1: 243*9880d681SAndroid Build Coastguard Worker %D = phi i32 [0, %T0], [0, %T1], [1, %T2] 244*9880d681SAndroid Build Coastguard Worker %E = icmp eq i32 %D, 1 245*9880d681SAndroid Build Coastguard Worker %F = and i1 %E, %cond 246*9880d681SAndroid Build Coastguard Worker br i1 %F, label %X, label %Y 247*9880d681SAndroid Build Coastguard WorkerX: 248*9880d681SAndroid Build Coastguard Worker call i1 @test8a() 249*9880d681SAndroid Build Coastguard Worker ret i32 1 250*9880d681SAndroid Build Coastguard WorkerY: 251*9880d681SAndroid Build Coastguard Worker ret i32 2 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker;;; Verify that we can handle constraint propagation through "xor x, 1". 256*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i1 %cond, i1 %cond2) { 257*9880d681SAndroid Build Coastguard WorkerEntry: 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 259*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 260*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Merge, label %F1 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker; CHECK: Entry: 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v1 = call i32 @f1() 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %F2, label %Merge 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard WorkerF1: 267*9880d681SAndroid Build Coastguard Worker %v2 = call i32 @f2() 268*9880d681SAndroid Build Coastguard Worker br label %Merge 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard WorkerMerge: 271*9880d681SAndroid Build Coastguard Worker %B = phi i32 [%v1, %Entry], [%v2, %F1] 272*9880d681SAndroid Build Coastguard Worker %M = icmp eq i32 %B, %v1 273*9880d681SAndroid Build Coastguard Worker %M1 = xor i1 %M, 1 274*9880d681SAndroid Build Coastguard Worker %N = icmp eq i32 %B, 47 275*9880d681SAndroid Build Coastguard Worker %O = and i1 %M1, %N 276*9880d681SAndroid Build Coastguard Worker br i1 %O, label %T2, label %F2 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker; CHECK: Merge: 279*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v2 = call i32 @f2() 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard WorkerT2: 283*9880d681SAndroid Build Coastguard Worker %Q = zext i1 %M to i32 284*9880d681SAndroid Build Coastguard Worker ret i32 %Q 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard WorkerF2: 287*9880d681SAndroid Build Coastguard Worker ret i32 %B 288*9880d681SAndroid Build Coastguard Worker; CHECK: F2: 289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 290*9880d681SAndroid Build Coastguard Worker} 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker; CHECK: @test10 295*9880d681SAndroid Build Coastguard Workerdeclare i32 @test10f1() 296*9880d681SAndroid Build Coastguard Workerdeclare i32 @test10f2() 297*9880d681SAndroid Build Coastguard Workerdeclare void @test10f3() 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker;; Non-local condition threading. 300*9880d681SAndroid Build Coastguard Workerdefine i32 @test10g(i1 %cond) { 301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10g( 302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %T2, label %F2 303*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T1, label %F1 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard WorkerT1: 306*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @test10f1() 307*9880d681SAndroid Build Coastguard Worker br label %Merge 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker; CHECK: %v1 = call i32 @test10f1() 310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f3() 311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %v1 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard WorkerF1: 314*9880d681SAndroid Build Coastguard Worker %v2 = call i32 @test10f2() 315*9880d681SAndroid Build Coastguard Worker br label %Merge 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard WorkerMerge: 318*9880d681SAndroid Build Coastguard Worker %B = phi i32 [%v1, %T1], [%v2, %F1] 319*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T2, label %F2 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard WorkerT2: 322*9880d681SAndroid Build Coastguard Worker call void @f3() 323*9880d681SAndroid Build Coastguard Worker ret i32 %B 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard WorkerF2: 326*9880d681SAndroid Build Coastguard Worker ret i32 %B 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker; Impossible conditional constraints should get threaded. BB3 is dead here. 331*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %A) { 332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp 334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %tmp455, label %BB4, label %BB2 335*9880d681SAndroid Build Coastguard Worker %tmp455 = icmp eq i32 %A, 42 336*9880d681SAndroid Build Coastguard Worker br i1 %tmp455, label %BB1, label %BB2 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard WorkerBB2: 339*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f1() 340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %C 341*9880d681SAndroid Build Coastguard Worker %C = call i32 @f1() 342*9880d681SAndroid Build Coastguard Worker ret i32 %C 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard WorkerBB1: 346*9880d681SAndroid Build Coastguard Worker %tmp459 = icmp eq i32 %A, 43 347*9880d681SAndroid Build Coastguard Worker br i1 %tmp459, label %BB3, label %BB4 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard WorkerBB3: 350*9880d681SAndroid Build Coastguard Worker call i32 @f2() 351*9880d681SAndroid Build Coastguard Worker ret i32 3 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard WorkerBB4: 354*9880d681SAndroid Build Coastguard Worker call void @f3() 355*9880d681SAndroid Build Coastguard Worker ret i32 4 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker;; Correlated value through boolean expression. GCC PR18046. 359*9880d681SAndroid Build Coastguard Workerdefine void @test12(i32 %A) { 360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 361*9880d681SAndroid Build Coastguard Workerentry: 362*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %A, 0 363*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %bb, label %bb1 364*9880d681SAndroid Build Coastguard Worker; Should branch to the return block instead of through BB1. 365*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cond = icmp eq i32 %A, 0 367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %bb1, label %return 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerbb: 370*9880d681SAndroid Build Coastguard Worker %B = call i32 @test10f2() 371*9880d681SAndroid Build Coastguard Worker br label %bb1 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workerbb1: 374*9880d681SAndroid Build Coastguard Worker %C = phi i32 [ %A, %entry ], [ %B, %bb ] 375*9880d681SAndroid Build Coastguard Worker %cond4 = icmp eq i32 %C, 0 376*9880d681SAndroid Build Coastguard Worker br i1 %cond4, label %bb2, label %return 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %B = call i32 @test10f2() 380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cond4 = icmp eq i32 %B, 0 381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond4, label %bb2, label %return 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerbb2: 384*9880d681SAndroid Build Coastguard Worker %D = call i32 @test10f2() 385*9880d681SAndroid Build Coastguard Worker ret void 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerreturn: 388*9880d681SAndroid Build Coastguard Worker ret void 389*9880d681SAndroid Build Coastguard Worker} 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker;; Duplicate condition to avoid xor of cond. 393*9880d681SAndroid Build Coastguard Worker;; rdar://7391699 394*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i1 %cond, i1 %cond2) { 395*9880d681SAndroid Build Coastguard WorkerEntry: 396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 397*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 398*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Merge, label %F1 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard WorkerF1: 401*9880d681SAndroid Build Coastguard Worker br label %Merge 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard WorkerMerge: 404*9880d681SAndroid Build Coastguard Worker %B = phi i1 [true, %Entry], [%cond2, %F1] 405*9880d681SAndroid Build Coastguard Worker %C = phi i32 [192, %Entry], [%v1, %F1] 406*9880d681SAndroid Build Coastguard Worker %M = icmp eq i32 %C, 192 407*9880d681SAndroid Build Coastguard Worker %N = xor i1 %B, %M 408*9880d681SAndroid Build Coastguard Worker br i1 %N, label %T2, label %F2 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard WorkerT2: 411*9880d681SAndroid Build Coastguard Worker ret i32 123 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard WorkerF2: 414*9880d681SAndroid Build Coastguard Worker ret i32 %v1 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cond, label %F2, label %Merge 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker; CHECK: Merge: 419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %M = icmp eq i32 %v1, 192 420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %N = xor i1 %cond2, %M 421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %N, label %T2, label %F2 422*9880d681SAndroid Build Coastguard Worker} 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 425*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %in) { 426*9880d681SAndroid Build Coastguard Workerentry: 427*9880d681SAndroid Build Coastguard Worker %A = icmp eq i32 %in, 0 428*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %A, label %right_ret, label %merge 429*9880d681SAndroid Build Coastguard Worker br i1 %A, label %left, label %right 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: left: 432*9880d681SAndroid Build Coastguard Workerleft: 433*9880d681SAndroid Build Coastguard Worker br label %merge 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: right: 436*9880d681SAndroid Build Coastguard Workerright: 437*9880d681SAndroid Build Coastguard Worker %B = call i32 @f1() 438*9880d681SAndroid Build Coastguard Worker br label %merge 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Workermerge: 441*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %C = phi i32 [%in, %left], [%B, %right] 442*9880d681SAndroid Build Coastguard Worker %C = phi i32 [%in, %left], [%B, %right] 443*9880d681SAndroid Build Coastguard Worker %D = add i32 %C, 1 444*9880d681SAndroid Build Coastguard Worker %E = icmp eq i32 %D, 2 445*9880d681SAndroid Build Coastguard Worker br i1 %E, label %left_ret, label %right_ret 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker; CHECK: left_ret: 448*9880d681SAndroid Build Coastguard Workerleft_ret: 449*9880d681SAndroid Build Coastguard Worker ret i32 0 450*9880d681SAndroid Build Coastguard Worker 451*9880d681SAndroid Build Coastguard Workerright_ret: 452*9880d681SAndroid Build Coastguard Worker ret i32 1 453*9880d681SAndroid Build Coastguard Worker} 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Worker; PR5652 456*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 457*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %len) { 458*9880d681SAndroid Build Coastguard Workerentry: 459*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ult i32 %len, 13 460*9880d681SAndroid Build Coastguard Worker %tmp = icmp ult i32 %len, 13 461*9880d681SAndroid Build Coastguard Worker br i1 %tmp, label %check, label %exit0 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Workerexit0: 464*9880d681SAndroid Build Coastguard Worker ret i32 0 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Workercheck: 467*9880d681SAndroid Build Coastguard Worker %tmp9 = icmp ult i32 %len, 21 468*9880d681SAndroid Build Coastguard Worker br i1 %tmp9, label %exit1, label %exit2 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Workerexit2: 471*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ret i32 2 472*9880d681SAndroid Build Coastguard Worker ret i32 2 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Workerexit1: 475*9880d681SAndroid Build Coastguard Worker ret i32 1 476*9880d681SAndroid Build Coastguard Worker; CHECK: } 477*9880d681SAndroid Build Coastguard Worker} 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Worker;;; Verify that we can handle constraint propagation through cast. 480*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i1 %cond) { 481*9880d681SAndroid Build Coastguard WorkerEntry: 482*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 483*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %Merge, label %F1 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Worker; CHECK: Entry: 486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %F2, label %Merge 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard WorkerF1: 489*9880d681SAndroid Build Coastguard Worker %v1 = call i32 @f1() 490*9880d681SAndroid Build Coastguard Worker br label %Merge 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard WorkerMerge: 493*9880d681SAndroid Build Coastguard Worker %B = phi i32 [0, %Entry], [%v1, %F1] 494*9880d681SAndroid Build Coastguard Worker %M = icmp eq i32 %B, 0 495*9880d681SAndroid Build Coastguard Worker %M1 = zext i1 %M to i32 496*9880d681SAndroid Build Coastguard Worker %N = icmp eq i32 %M1, 0 497*9880d681SAndroid Build Coastguard Worker br i1 %N, label %T2, label %F2 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker; CHECK: Merge: 500*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 501*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v1 = call i32 @f1() 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard WorkerT2: 504*9880d681SAndroid Build Coastguard Worker %Q = call i32 @f2() 505*9880d681SAndroid Build Coastguard Worker ret i32 %Q 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard WorkerF2: 508*9880d681SAndroid Build Coastguard Worker ret i32 %B 509*9880d681SAndroid Build Coastguard Worker; CHECK: F2: 510*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 511*9880d681SAndroid Build Coastguard Worker} 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Worker; In this test we check that block duplication is inhibited by the presence 514*9880d681SAndroid Build Coastguard Worker; of a function with the 'noduplicate' attribute. 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Workerdeclare void @g() 517*9880d681SAndroid Build Coastguard Workerdeclare void @j() 518*9880d681SAndroid Build Coastguard Workerdeclare void @k() 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @h(i32 %p) { 521*9880d681SAndroid Build Coastguard Workerdefine void @h(i32 %p) { 522*9880d681SAndroid Build Coastguard Worker %x = icmp ult i32 %p, 5 523*9880d681SAndroid Build Coastguard Worker br i1 %x, label %l1, label %l2 524*9880d681SAndroid Build Coastguard Worker 525*9880d681SAndroid Build Coastguard Workerl1: 526*9880d681SAndroid Build Coastguard Worker call void @j() 527*9880d681SAndroid Build Coastguard Worker br label %l3 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Workerl2: 530*9880d681SAndroid Build Coastguard Worker call void @k() 531*9880d681SAndroid Build Coastguard Worker br label %l3 532*9880d681SAndroid Build Coastguard Worker 533*9880d681SAndroid Build Coastguard Workerl3: 534*9880d681SAndroid Build Coastguard Worker; CHECK: call void @g() [[NOD:#[0-9]+]] 535*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @g() [[NOD]] 536*9880d681SAndroid Build Coastguard Worker call void @g() noduplicate 537*9880d681SAndroid Build Coastguard Worker %y = icmp ult i32 %p, 5 538*9880d681SAndroid Build Coastguard Worker br i1 %y, label %l4, label %l5 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Workerl4: 541*9880d681SAndroid Build Coastguard Worker call void @j() 542*9880d681SAndroid Build Coastguard Worker ret void 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Workerl5: 545*9880d681SAndroid Build Coastguard Worker call void @k() 546*9880d681SAndroid Build Coastguard Worker ret void 547*9880d681SAndroid Build Coastguard Worker; CHECK: } 548*9880d681SAndroid Build Coastguard Worker} 549*9880d681SAndroid Build Coastguard Worker 550*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @h_con(i32 %p) { 551*9880d681SAndroid Build Coastguard Workerdefine void @h_con(i32 %p) { 552*9880d681SAndroid Build Coastguard Worker %x = icmp ult i32 %p, 5 553*9880d681SAndroid Build Coastguard Worker br i1 %x, label %l1, label %l2 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Workerl1: 556*9880d681SAndroid Build Coastguard Worker call void @j() 557*9880d681SAndroid Build Coastguard Worker br label %l3 558*9880d681SAndroid Build Coastguard Worker 559*9880d681SAndroid Build Coastguard Workerl2: 560*9880d681SAndroid Build Coastguard Worker call void @k() 561*9880d681SAndroid Build Coastguard Worker br label %l3 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Workerl3: 564*9880d681SAndroid Build Coastguard Worker; CHECK: call void @g() [[CON:#[0-9]+]] 565*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @g() [[CON]] 566*9880d681SAndroid Build Coastguard Worker call void @g() convergent 567*9880d681SAndroid Build Coastguard Worker %y = icmp ult i32 %p, 5 568*9880d681SAndroid Build Coastguard Worker br i1 %y, label %l4, label %l5 569*9880d681SAndroid Build Coastguard Worker 570*9880d681SAndroid Build Coastguard Workerl4: 571*9880d681SAndroid Build Coastguard Worker call void @j() 572*9880d681SAndroid Build Coastguard Worker ret void 573*9880d681SAndroid Build Coastguard Worker 574*9880d681SAndroid Build Coastguard Workerl5: 575*9880d681SAndroid Build Coastguard Worker call void @k() 576*9880d681SAndroid Build Coastguard Worker ret void 577*9880d681SAndroid Build Coastguard Worker; CHECK: } 578*9880d681SAndroid Build Coastguard Worker} 579*9880d681SAndroid Build Coastguard Worker 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Worker; CHECK: attributes [[NOD]] = { noduplicate } 582*9880d681SAndroid Build Coastguard Worker; CHECK: attributes [[CON]] = { convergent } 583