1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; PR1822 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A, i32 %B) { 9*9880d681SAndroid Build Coastguard Worker %C = select i1 false, i32 %A, i32 %B 10*9880d681SAndroid Build Coastguard Worker ret i32 %C 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 12*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %B 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A, i32 %B) { 16*9880d681SAndroid Build Coastguard Worker %C = select i1 true, i32 %A, i32 %B 17*9880d681SAndroid Build Coastguard Worker ret i32 %C 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 19*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %A 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i1 %C, i32 %I) { 24*9880d681SAndroid Build Coastguard Worker ; V = I 25*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 %I, i32 %I 26*9880d681SAndroid Build Coastguard Worker ret i32 %V 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 28*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %I 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i1 %C) { 32*9880d681SAndroid Build Coastguard Worker ; V = C 33*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i1 true, i1 false 34*9880d681SAndroid Build Coastguard Worker ret i1 %V 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 36*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %C 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i1 @test5(i1 %C) { 40*9880d681SAndroid Build Coastguard Worker ; V = !C 41*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i1 false, i1 true 42*9880d681SAndroid Build Coastguard Worker ret i1 %V 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 44*9880d681SAndroid Build Coastguard Worker; CHECK: xor i1 %C, true 45*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i1 %C) { 49*9880d681SAndroid Build Coastguard Worker ; V = cast C to int 50*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 1, i32 0 51*9880d681SAndroid Build Coastguard Worker ret i32 %V 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 53*9880d681SAndroid Build Coastguard Worker; CHECK: %V = zext i1 %C to i32 54*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(i1 %C, i1 %X) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = or i1 %C, %X 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[R]] 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i1 true, i1 %X 63*9880d681SAndroid Build Coastguard Worker ret i1 %R 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test7vec(<2 x i1> %C, <2 x i1> %X) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7vec( 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = or <2 x i1> %C, %X 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[R]] 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker %R = select <2 x i1> %C, <2 x i1> <i1 true, i1 true>, <2 x i1> %X 72*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %R 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i1 @test8(i1 %C, i1 %X) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = and i1 %C, %X 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[R]] 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i1 %X, i1 false 81*9880d681SAndroid Build Coastguard Worker ret i1 %R 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test8vec(<2 x i1> %C, <2 x i1> %X) { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8vec( 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = and <2 x i1> %C, %X 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[R]] 88*9880d681SAndroid Build Coastguard Worker; 89*9880d681SAndroid Build Coastguard Worker %R = select <2 x i1> %C, <2 x i1> %X, <2 x i1> <i1 false, i1 false> 90*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %R 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i1 %C, i1 %X) { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 %C, true 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = and i1 [[NOT_C]], %X 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[R]] 98*9880d681SAndroid Build Coastguard Worker; 99*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i1 false, i1 %X 100*9880d681SAndroid Build Coastguard Worker ret i1 %R 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test9vec(<2 x i1> %C, <2 x i1> %X) { 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9vec( 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true> 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = and <2 x i1> [[NOT_C]], %X 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[R]] 108*9880d681SAndroid Build Coastguard Worker; 109*9880d681SAndroid Build Coastguard Worker %R = select <2 x i1> %C, <2 x i1> <i1 false, i1 false>, <2 x i1> %X 110*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %R 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine i1 @test10(i1 %C, i1 %X) { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 %C, true 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = or i1 [[NOT_C]], %X 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[R]] 118*9880d681SAndroid Build Coastguard Worker; 119*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i1 %X, i1 true 120*9880d681SAndroid Build Coastguard Worker ret i1 %R 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test10vec(<2 x i1> %C, <2 x i1> %X) { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10vec( 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true> 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = or <2 x i1> [[NOT_C]], %X 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[R]] 128*9880d681SAndroid Build Coastguard Worker; 129*9880d681SAndroid Build Coastguard Worker %R = select <2 x i1> %C, <2 x i1> %X, <2 x i1> <i1 true, i1 true> 130*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %R 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine i1 @test23(i1 %a, i1 %b) { 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i1 %a, %b 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 137*9880d681SAndroid Build Coastguard Worker; 138*9880d681SAndroid Build Coastguard Worker %c = select i1 %a, i1 %b, i1 %a 139*9880d681SAndroid Build Coastguard Worker ret i1 %c 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test23vec(<2 x i1> %a, <2 x i1> %b) { 143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23vec( 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and <2 x i1> %a, %b 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[C]] 146*9880d681SAndroid Build Coastguard Worker; 147*9880d681SAndroid Build Coastguard Worker %c = select <2 x i1> %a, <2 x i1> %b, <2 x i1> %a 148*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i1 @test24(i1 %a, i1 %b) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or i1 %a, %b 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 155*9880d681SAndroid Build Coastguard Worker; 156*9880d681SAndroid Build Coastguard Worker %c = select i1 %a, i1 %a, i1 %b 157*9880d681SAndroid Build Coastguard Worker ret i1 %c 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test24vec(<2 x i1> %a, <2 x i1> %b) { 161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24vec( 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or <2 x i1> %a, %b 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[C]] 164*9880d681SAndroid Build Coastguard Worker; 165*9880d681SAndroid Build Coastguard Worker %c = select <2 x i1> %a, <2 x i1> %a, <2 x i1> %b 166*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefine i1 @test62(i1 %A, i1 %B) { 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62( 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT:%.*]] = xor i1 %A, true 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i1 [[NOT]], %B 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 174*9880d681SAndroid Build Coastguard Worker; 175*9880d681SAndroid Build Coastguard Worker %not = xor i1 %A, true 176*9880d681SAndroid Build Coastguard Worker %C = select i1 %A, i1 %not, i1 %B 177*9880d681SAndroid Build Coastguard Worker ret i1 %C 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test62vec(<2 x i1> %A, <2 x i1> %B) { 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62vec( 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> %A, <i1 true, i1 true> 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and <2 x i1> [[NOT]], %B 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[C]] 185*9880d681SAndroid Build Coastguard Worker; 186*9880d681SAndroid Build Coastguard Worker %not = xor <2 x i1> %A, <i1 true, i1 true> 187*9880d681SAndroid Build Coastguard Worker %C = select <2 x i1> %A, <2 x i1> %not, <2 x i1> %B 188*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %C 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdefine i1 @test63(i1 %A, i1 %B) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test63( 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT:%.*]] = xor i1 %A, true 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or i1 %B, [[NOT]] 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 196*9880d681SAndroid Build Coastguard Worker; 197*9880d681SAndroid Build Coastguard Worker %not = xor i1 %A, true 198*9880d681SAndroid Build Coastguard Worker %C = select i1 %A, i1 %B, i1 %not 199*9880d681SAndroid Build Coastguard Worker ret i1 %C 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test63vec(<2 x i1> %A, <2 x i1> %B) { 203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test63vec( 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> %A, <i1 true, i1 true> 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or <2 x i1> %B, [[NOT]] 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[C]] 207*9880d681SAndroid Build Coastguard Worker; 208*9880d681SAndroid Build Coastguard Worker %not = xor <2 x i1> %A, <i1 true, i1 true> 209*9880d681SAndroid Build Coastguard Worker %C = select <2 x i1> %A, <2 x i1> %B, <2 x i1> %not 210*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %C 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %a) { 214*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %a, 0 215*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i32 0, i32 1 216*9880d681SAndroid Build Coastguard Worker ret i32 %R 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 218*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 %a, 0 219*9880d681SAndroid Build Coastguard Worker; CHECK: %R = zext i1 220*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %R 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i1 %cond, i32 %a) { 224*9880d681SAndroid Build Coastguard Worker %b = or i32 %a, 1 225*9880d681SAndroid Build Coastguard Worker %c = select i1 %cond, i32 %b, i32 %a 226*9880d681SAndroid Build Coastguard Worker ret i32 %c 227*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 228*9880d681SAndroid Build Coastguard Worker; CHECK: %b = zext i1 %cond to i32 229*9880d681SAndroid Build Coastguard Worker; CHECK: %c = or i32 %b, %a 230*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %c 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerdefine i32 @test12a(i1 %cond, i32 %a) { 234*9880d681SAndroid Build Coastguard Worker %b = ashr i32 %a, 1 235*9880d681SAndroid Build Coastguard Worker %c = select i1 %cond, i32 %b, i32 %a 236*9880d681SAndroid Build Coastguard Worker ret i32 %c 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12a( 238*9880d681SAndroid Build Coastguard Worker; CHECK: %b = zext i1 %cond to i32 239*9880d681SAndroid Build Coastguard Worker; CHECK: %c = ashr i32 %a, %b 240*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %c 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine i32 @test12b(i1 %cond, i32 %a) { 244*9880d681SAndroid Build Coastguard Worker %b = ashr i32 %a, 1 245*9880d681SAndroid Build Coastguard Worker %c = select i1 %cond, i32 %a, i32 %b 246*9880d681SAndroid Build Coastguard Worker ret i32 %c 247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12b( 248*9880d681SAndroid Build Coastguard Worker; CHECK: zext i1 %cond to i32 249*9880d681SAndroid Build Coastguard Worker; CHECK: %b = xor i32 250*9880d681SAndroid Build Coastguard Worker; CHECK: %c = ashr i32 %a, %b 251*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %c 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %a, i32 %b) { 255*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %a, %b 256*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 %a, i32 %b 257*9880d681SAndroid Build Coastguard Worker ret i32 %V 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 259*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %b 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdefine i32 @test13a(i32 %a, i32 %b) { 263*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %a, %b 264*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 %a, i32 %b 265*9880d681SAndroid Build Coastguard Worker ret i32 %V 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13a( 267*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %a 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerdefine i32 @test13b(i32 %a, i32 %b) { 271*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %a, %b 272*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 %b, i32 %a 273*9880d681SAndroid Build Coastguard Worker ret i32 %V 274*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13b( 275*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %a 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdefine i1 @test14a(i1 %C, i32 %X) { 279*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 %X, i32 0 280*9880d681SAndroid Build Coastguard Worker ; (X < 1) | !C 281*9880d681SAndroid Build Coastguard Worker %R = icmp slt i32 %V, 1 282*9880d681SAndroid Build Coastguard Worker ret i1 %R 283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14a( 284*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i32 %X, 1 285*9880d681SAndroid Build Coastguard Worker; CHECK: xor i1 %C, true 286*9880d681SAndroid Build Coastguard Worker; CHECK: or i1 287*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %R 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdefine i1 @test14b(i1 %C, i32 %X) { 291*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 0, i32 %X 292*9880d681SAndroid Build Coastguard Worker ; (X < 1) | C 293*9880d681SAndroid Build Coastguard Worker %R = icmp slt i32 %V, 1 294*9880d681SAndroid Build Coastguard Worker ret i1 %R 295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14b( 296*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i32 %X, 1 297*9880d681SAndroid Build Coastguard Worker; CHECK: or i1 298*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %R 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker;; Code sequence for (X & 16) ? 16 : 0 302*9880d681SAndroid Build Coastguard Workerdefine i32 @test15a(i32 %X) { 303*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 16 304*9880d681SAndroid Build Coastguard Worker %t2 = icmp eq i32 %t1, 0 305*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 0, i32 16 306*9880d681SAndroid Build Coastguard Worker ret i32 %t3 307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15a( 308*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = and i32 %X, 16 309*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %t1 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker;; Code sequence for (X & 32) ? 0 : 24 313*9880d681SAndroid Build Coastguard Workerdefine i32 @test15b(i32 %X) { 314*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 32 315*9880d681SAndroid Build Coastguard Worker %t2 = icmp eq i32 %t1, 0 316*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 32, i32 0 317*9880d681SAndroid Build Coastguard Worker ret i32 %t3 318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15b( 319*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = and i32 %X, 32 320*9880d681SAndroid Build Coastguard Worker; CHECK: xor i32 %t1, 32 321*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 322*9880d681SAndroid Build Coastguard Worker} 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker;; Alternate code sequence for (X & 16) ? 16 : 0 325*9880d681SAndroid Build Coastguard Workerdefine i32 @test15c(i32 %X) { 326*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 16 327*9880d681SAndroid Build Coastguard Worker %t2 = icmp eq i32 %t1, 16 328*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 16, i32 0 329*9880d681SAndroid Build Coastguard Worker ret i32 %t3 330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15c( 331*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = and i32 %X, 16 332*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %t1 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker;; Alternate code sequence for (X & 16) ? 16 : 0 336*9880d681SAndroid Build Coastguard Workerdefine i32 @test15d(i32 %X) { 337*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 16 338*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 339*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 16, i32 0 340*9880d681SAndroid Build Coastguard Worker ret i32 %t3 341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15d( 342*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = and i32 %X, 16 343*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %t1 344*9880d681SAndroid Build Coastguard Worker} 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker;; (a & 128) ? 256 : 0 347*9880d681SAndroid Build Coastguard Workerdefine i32 @test15e(i32 %X) { 348*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 128 349*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 350*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 256, i32 0 351*9880d681SAndroid Build Coastguard Worker ret i32 %t3 352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15e( 353*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = shl i32 %X, 1 354*9880d681SAndroid Build Coastguard Worker; CHECK: and i32 %t1, 256 355*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker;; (a & 128) ? 0 : 256 359*9880d681SAndroid Build Coastguard Workerdefine i32 @test15f(i32 %X) { 360*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 128 361*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 362*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 0, i32 256 363*9880d681SAndroid Build Coastguard Worker ret i32 %t3 364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15f( 365*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = shl i32 %X, 1 366*9880d681SAndroid Build Coastguard Worker; CHECK: and i32 %t1, 256 367*9880d681SAndroid Build Coastguard Worker; CHECK: xor i32 %{{.*}}, 256 368*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 369*9880d681SAndroid Build Coastguard Worker} 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Worker;; (a & 8) ? -1 : -9 372*9880d681SAndroid Build Coastguard Workerdefine i32 @test15g(i32 %X) { 373*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 8 374*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 375*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 -1, i32 -9 376*9880d681SAndroid Build Coastguard Worker ret i32 %t3 377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15g( 378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = or i32 %X, -9 379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %1 380*9880d681SAndroid Build Coastguard Worker} 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Worker;; (a & 8) ? -9 : -1 383*9880d681SAndroid Build Coastguard Workerdefine i32 @test15h(i32 %X) { 384*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 8 385*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 386*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 -9, i32 -1 387*9880d681SAndroid Build Coastguard Worker ret i32 %t3 388*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15h( 389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = or i32 %X, -9 390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = xor i32 %1, 8 391*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %2 392*9880d681SAndroid Build Coastguard Worker} 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker;; (a & 2) ? 577 : 1089 395*9880d681SAndroid Build Coastguard Workerdefine i32 @test15i(i32 %X) { 396*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 2 397*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 398*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 577, i32 1089 399*9880d681SAndroid Build Coastguard Worker ret i32 %t3 400*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15i( 401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t1 = shl i32 %X, 8 402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = and i32 %t1, 512 403*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = xor i32 %1, 512 404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %3 = add nuw nsw i32 %2, 577 405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %3 406*9880d681SAndroid Build Coastguard Worker} 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Worker;; (a & 2) ? 1089 : 577 409*9880d681SAndroid Build Coastguard Workerdefine i32 @test15j(i32 %X) { 410*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %X, 2 411*9880d681SAndroid Build Coastguard Worker %t2 = icmp ne i32 %t1, 0 412*9880d681SAndroid Build Coastguard Worker %t3 = select i1 %t2, i32 1089, i32 577 413*9880d681SAndroid Build Coastguard Worker ret i32 %t3 414*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15j( 415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t1 = shl i32 %X, 8 416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = and i32 %t1, 512 417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = add nuw nsw i32 %1, 577 418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %2 419*9880d681SAndroid Build Coastguard Worker} 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i1 %C, i32* %P) { 422*9880d681SAndroid Build Coastguard Worker %P2 = select i1 %C, i32* %P, i32* null 423*9880d681SAndroid Build Coastguard Worker %V = load i32, i32* %P2 424*9880d681SAndroid Build Coastguard Worker ret i32 %V 425*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 426*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %V = load i32, i32* %P 427*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V 428*9880d681SAndroid Build Coastguard Worker} 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Worker;; It may be legal to load from a null address in a non-zero address space 431*9880d681SAndroid Build Coastguard Workerdefine i32 @test16_neg(i1 %C, i32 addrspace(1)* %P) { 432*9880d681SAndroid Build Coastguard Worker %P2 = select i1 %C, i32 addrspace(1)* %P, i32 addrspace(1)* null 433*9880d681SAndroid Build Coastguard Worker %V = load i32, i32 addrspace(1)* %P2 434*9880d681SAndroid Build Coastguard Worker ret i32 %V 435*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16_neg 436*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %P2 = select i1 %C, i32 addrspace(1)* %P, i32 addrspace(1)* null 437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %V = load i32, i32 addrspace(1)* %P2 438*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V 439*9880d681SAndroid Build Coastguard Worker} 440*9880d681SAndroid Build Coastguard Workerdefine i32 @test16_neg2(i1 %C, i32 addrspace(1)* %P) { 441*9880d681SAndroid Build Coastguard Worker %P2 = select i1 %C, i32 addrspace(1)* null, i32 addrspace(1)* %P 442*9880d681SAndroid Build Coastguard Worker %V = load i32, i32 addrspace(1)* %P2 443*9880d681SAndroid Build Coastguard Worker ret i32 %V 444*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16_neg2 445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %P2 = select i1 %C, i32 addrspace(1)* null, i32 addrspace(1)* %P 446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %V = load i32, i32 addrspace(1)* %P2 447*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V 448*9880d681SAndroid Build Coastguard Worker} 449*9880d681SAndroid Build Coastguard Worker 450*9880d681SAndroid Build Coastguard Workerdefine i1 @test17(i32* %X, i1 %C) { 451*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i32* %X, i32* null 452*9880d681SAndroid Build Coastguard Worker %RV = icmp eq i32* %R, null 453*9880d681SAndroid Build Coastguard Worker ret i1 %RV 454*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 455*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32* %X, null 456*9880d681SAndroid Build Coastguard Worker; CHECK: xor i1 %C, true 457*9880d681SAndroid Build Coastguard Worker; CHECK: %RV = or i1 458*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %RV 459*9880d681SAndroid Build Coastguard Worker} 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Workerdefine i32 @test18(i32 %X, i32 %Y, i1 %C) { 462*9880d681SAndroid Build Coastguard Worker %R = select i1 %C, i32 %X, i32 0 463*9880d681SAndroid Build Coastguard Worker %V = sdiv i32 %Y, %R 464*9880d681SAndroid Build Coastguard Worker ret i32 %V 465*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 466*9880d681SAndroid Build Coastguard Worker; CHECK: %V = sdiv i32 %Y, %X 467*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V 468*9880d681SAndroid Build Coastguard Worker} 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %x) { 471*9880d681SAndroid Build Coastguard Worker %tmp = icmp ugt i32 %x, 2147483647 472*9880d681SAndroid Build Coastguard Worker %retval = select i1 %tmp, i32 -1, i32 0 473*9880d681SAndroid Build Coastguard Worker ret i32 %retval 474*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 475*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ashr i32 %x, 31 476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 477*9880d681SAndroid Build Coastguard Worker} 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Workerdefine i32 @test20(i32 %x) { 480*9880d681SAndroid Build Coastguard Worker %tmp = icmp slt i32 %x, 0 481*9880d681SAndroid Build Coastguard Worker %retval = select i1 %tmp, i32 -1, i32 0 482*9880d681SAndroid Build Coastguard Worker ret i32 %retval 483*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 484*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ashr i32 %x, 31 485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 486*9880d681SAndroid Build Coastguard Worker} 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Workerdefine i64 @test21(i32 %x) { 489*9880d681SAndroid Build Coastguard Worker %tmp = icmp slt i32 %x, 0 490*9880d681SAndroid Build Coastguard Worker %retval = select i1 %tmp, i64 -1, i64 0 491*9880d681SAndroid Build Coastguard Worker ret i64 %retval 492*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 493*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ashr i32 %x, 31 494*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sext i32 495*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 496*9880d681SAndroid Build Coastguard Worker} 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Workerdefine i16 @test22(i32 %x) { 499*9880d681SAndroid Build Coastguard Worker %tmp = icmp slt i32 %x, 0 500*9880d681SAndroid Build Coastguard Worker %retval = select i1 %tmp, i16 -1, i16 0 501*9880d681SAndroid Build Coastguard Worker ret i16 %retval 502*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22( 503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ashr i32 %x, 31 504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: trunc i32 505*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 506*9880d681SAndroid Build Coastguard Worker} 507*9880d681SAndroid Build Coastguard Worker 508*9880d681SAndroid Build Coastguard Workerdefine i32 @test25(i1 %c) { 509*9880d681SAndroid Build Coastguard Workerentry: 510*9880d681SAndroid Build Coastguard Worker br i1 %c, label %jump, label %ret 511*9880d681SAndroid Build Coastguard Workerjump: 512*9880d681SAndroid Build Coastguard Worker br label %ret 513*9880d681SAndroid Build Coastguard Workerret: 514*9880d681SAndroid Build Coastguard Worker %a = phi i1 [true, %jump], [false, %entry] 515*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, i32 10, i32 20 516*9880d681SAndroid Build Coastguard Worker ret i32 %b 517*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25( 518*9880d681SAndroid Build Coastguard Worker; CHECK: %a = phi i32 [ 10, %jump ], [ 20, %entry ] 519*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %a 520*9880d681SAndroid Build Coastguard Worker} 521*9880d681SAndroid Build Coastguard Worker 522*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(i1 %cond) { 523*9880d681SAndroid Build Coastguard Workerentry: 524*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %jump, label %ret 525*9880d681SAndroid Build Coastguard Workerjump: 526*9880d681SAndroid Build Coastguard Worker %c = or i1 false, false 527*9880d681SAndroid Build Coastguard Worker br label %ret 528*9880d681SAndroid Build Coastguard Workerret: 529*9880d681SAndroid Build Coastguard Worker %a = phi i1 [true, %entry], [%c, %jump] 530*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, i32 20, i32 10 531*9880d681SAndroid Build Coastguard Worker ret i32 %b 532*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26( 533*9880d681SAndroid Build Coastguard Worker; CHECK: %a = phi i32 [ 20, %entry ], [ 10, %jump ] 534*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %a 535*9880d681SAndroid Build Coastguard Worker} 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Workerdefine i32 @test27(i1 %c, i32 %A, i32 %B) { 538*9880d681SAndroid Build Coastguard Workerentry: 539*9880d681SAndroid Build Coastguard Worker br i1 %c, label %jump, label %ret 540*9880d681SAndroid Build Coastguard Workerjump: 541*9880d681SAndroid Build Coastguard Worker br label %ret 542*9880d681SAndroid Build Coastguard Workerret: 543*9880d681SAndroid Build Coastguard Worker %a = phi i1 [true, %jump], [false, %entry] 544*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, i32 %A, i32 %B 545*9880d681SAndroid Build Coastguard Worker ret i32 %b 546*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27( 547*9880d681SAndroid Build Coastguard Worker; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ] 548*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %a 549*9880d681SAndroid Build Coastguard Worker} 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Workerdefine i32 @test28(i1 %cond, i32 %A, i32 %B) { 552*9880d681SAndroid Build Coastguard Workerentry: 553*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %jump, label %ret 554*9880d681SAndroid Build Coastguard Workerjump: 555*9880d681SAndroid Build Coastguard Worker br label %ret 556*9880d681SAndroid Build Coastguard Workerret: 557*9880d681SAndroid Build Coastguard Worker %c = phi i32 [%A, %jump], [%B, %entry] 558*9880d681SAndroid Build Coastguard Worker %a = phi i1 [true, %jump], [false, %entry] 559*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, i32 %A, i32 %c 560*9880d681SAndroid Build Coastguard Worker ret i32 %b 561*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28( 562*9880d681SAndroid Build Coastguard Worker; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ] 563*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %a 564*9880d681SAndroid Build Coastguard Worker} 565*9880d681SAndroid Build Coastguard Worker 566*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i1 %cond, i32 %A, i32 %B) { 567*9880d681SAndroid Build Coastguard Workerentry: 568*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %jump, label %ret 569*9880d681SAndroid Build Coastguard Workerjump: 570*9880d681SAndroid Build Coastguard Worker br label %ret 571*9880d681SAndroid Build Coastguard Workerret: 572*9880d681SAndroid Build Coastguard Worker %c = phi i32 [%A, %jump], [%B, %entry] 573*9880d681SAndroid Build Coastguard Worker %a = phi i1 [true, %jump], [false, %entry] 574*9880d681SAndroid Build Coastguard Worker br label %next 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Workernext: 577*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, i32 %A, i32 %c 578*9880d681SAndroid Build Coastguard Worker ret i32 %b 579*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29( 580*9880d681SAndroid Build Coastguard Worker; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ] 581*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %a 582*9880d681SAndroid Build Coastguard Worker} 583*9880d681SAndroid Build Coastguard Worker 584*9880d681SAndroid Build Coastguard Worker 585*9880d681SAndroid Build Coastguard Worker; SMAX(SMAX(x, y), x) -> SMAX(x, y) 586*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i32 %x, i32 %y) { 587*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, %y 588*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %x, i32 %y 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp sgt i32 %cond, %x 591*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp5, i32 %cond, i32 %x 592*9880d681SAndroid Build Coastguard Worker ret i32 %retval 593*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30( 594*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 595*9880d681SAndroid Build Coastguard Worker} 596*9880d681SAndroid Build Coastguard Worker 597*9880d681SAndroid Build Coastguard Worker; UMAX(UMAX(x, y), x) -> UMAX(x, y) 598*9880d681SAndroid Build Coastguard Workerdefine i32 @test31(i32 %x, i32 %y) { 599*9880d681SAndroid Build Coastguard Worker %cmp = icmp ugt i32 %x, %y 600*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %x, i32 %y 601*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp ugt i32 %cond, %x 602*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp5, i32 %cond, i32 %x 603*9880d681SAndroid Build Coastguard Worker ret i32 %retval 604*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31( 605*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 606*9880d681SAndroid Build Coastguard Worker} 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Worker; SMIN(SMIN(x, y), x) -> SMIN(x, y) 609*9880d681SAndroid Build Coastguard Workerdefine i32 @test32(i32 %x, i32 %y) { 610*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, %y 611*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %y, i32 %x 612*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp sgt i32 %cond, %x 613*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp5, i32 %x, i32 %cond 614*9880d681SAndroid Build Coastguard Worker ret i32 %retval 615*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32( 616*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 617*9880d681SAndroid Build Coastguard Worker} 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Worker; MAX(MIN(x, y), x) -> x 620*9880d681SAndroid Build Coastguard Workerdefine i32 @test33(i32 %x, i32 %y) { 621*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, %y 622*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %y, i32 %x 623*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp sgt i32 %cond, %x 624*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp5, i32 %cond, i32 %x 625*9880d681SAndroid Build Coastguard Worker ret i32 %retval 626*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33( 627*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 628*9880d681SAndroid Build Coastguard Worker} 629*9880d681SAndroid Build Coastguard Worker 630*9880d681SAndroid Build Coastguard Worker; MIN(MAX(x, y), x) -> x 631*9880d681SAndroid Build Coastguard Workerdefine i32 @test34(i32 %x, i32 %y) { 632*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, %y 633*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %x, i32 %y 634*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp sgt i32 %cond, %x 635*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp5, i32 %x, i32 %cond 636*9880d681SAndroid Build Coastguard Worker ret i32 %retval 637*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34( 638*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 639*9880d681SAndroid Build Coastguard Worker} 640*9880d681SAndroid Build Coastguard Worker 641*9880d681SAndroid Build Coastguard Workerdefine i32 @test35(i32 %x) { 642*9880d681SAndroid Build Coastguard Worker %cmp = icmp sge i32 %x, 0 643*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 60, i32 100 644*9880d681SAndroid Build Coastguard Worker ret i32 %cond 645*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35( 646*9880d681SAndroid Build Coastguard Worker; CHECK: ashr i32 %x, 31 647*9880d681SAndroid Build Coastguard Worker; CHECK: and i32 {{.*}}, 40 648*9880d681SAndroid Build Coastguard Worker; CHECK: add nuw nsw i32 {{.*}}, 60 649*9880d681SAndroid Build Coastguard Worker; CHECK: ret 650*9880d681SAndroid Build Coastguard Worker} 651*9880d681SAndroid Build Coastguard Worker 652*9880d681SAndroid Build Coastguard Workerdefine i32 @test36(i32 %x) { 653*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %x, 0 654*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 60, i32 100 655*9880d681SAndroid Build Coastguard Worker ret i32 %cond 656*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36( 657*9880d681SAndroid Build Coastguard Worker; CHECK: ashr i32 %x, 31 658*9880d681SAndroid Build Coastguard Worker; CHECK: and i32 {{.*}}, -40 659*9880d681SAndroid Build Coastguard Worker; CHECK: add nsw i32 {{.*}}, 100 660*9880d681SAndroid Build Coastguard Worker; CHECK: ret 661*9880d681SAndroid Build Coastguard Worker} 662*9880d681SAndroid Build Coastguard Worker 663*9880d681SAndroid Build Coastguard Workerdefine i32 @test37(i32 %x) { 664*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, -1 665*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 1, i32 -1 666*9880d681SAndroid Build Coastguard Worker ret i32 %cond 667*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37( 668*9880d681SAndroid Build Coastguard Worker; CHECK: ashr i32 %x, 31 669*9880d681SAndroid Build Coastguard Worker; CHECK: or i32 {{.*}}, 1 670*9880d681SAndroid Build Coastguard Worker; CHECK: ret 671*9880d681SAndroid Build Coastguard Worker} 672*9880d681SAndroid Build Coastguard Worker 673*9880d681SAndroid Build Coastguard Workerdefine i1 @test38(i1 %cond) { 674*9880d681SAndroid Build Coastguard Worker %zero = alloca i32 675*9880d681SAndroid Build Coastguard Worker %one = alloca i32 676*9880d681SAndroid Build Coastguard Worker %ptr = select i1 %cond, i32* %zero, i32* %one 677*9880d681SAndroid Build Coastguard Worker %isnull = icmp eq i32* %ptr, null 678*9880d681SAndroid Build Coastguard Worker ret i1 %isnull 679*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38( 680*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 681*9880d681SAndroid Build Coastguard Worker} 682*9880d681SAndroid Build Coastguard Worker 683*9880d681SAndroid Build Coastguard Workerdefine i1 @test39(i1 %cond, double %x) { 684*9880d681SAndroid Build Coastguard Worker %s = select i1 %cond, double %x, double 0x7FF0000000000000 ; RHS = +infty 685*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ule double %x, %s 686*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 687*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39( 688*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 689*9880d681SAndroid Build Coastguard Worker} 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Workerdefine i1 @test40(i1 %cond) { 692*9880d681SAndroid Build Coastguard Worker %a = alloca i32 693*9880d681SAndroid Build Coastguard Worker %b = alloca i32 694*9880d681SAndroid Build Coastguard Worker %c = alloca i32 695*9880d681SAndroid Build Coastguard Worker %s = select i1 %cond, i32* %a, i32* %b 696*9880d681SAndroid Build Coastguard Worker %r = icmp eq i32* %s, %c 697*9880d681SAndroid Build Coastguard Worker ret i1 %r 698*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40( 699*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 700*9880d681SAndroid Build Coastguard Worker} 701*9880d681SAndroid Build Coastguard Worker 702*9880d681SAndroid Build Coastguard Workerdefine i32 @test41(i1 %cond, i32 %x, i32 %y) { 703*9880d681SAndroid Build Coastguard Worker %z = and i32 %x, %y 704*9880d681SAndroid Build Coastguard Worker %s = select i1 %cond, i32 %y, i32 %z 705*9880d681SAndroid Build Coastguard Worker %r = and i32 %x, %s 706*9880d681SAndroid Build Coastguard Worker ret i32 %r 707*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41( 708*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and i32 %x, %y 709*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 710*9880d681SAndroid Build Coastguard Worker} 711*9880d681SAndroid Build Coastguard Worker 712*9880d681SAndroid Build Coastguard Workerdefine i32 @test42(i32 %x, i32 %y) { 713*9880d681SAndroid Build Coastguard Worker %b = add i32 %y, -1 714*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %x, 0 715*9880d681SAndroid Build Coastguard Worker %c = select i1 %cond, i32 %b, i32 %y 716*9880d681SAndroid Build Coastguard Worker ret i32 %c 717*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42( 718*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cond = icmp eq i32 %x, 0 719*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %b = sext i1 %cond to i32 720*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %c = add i32 %b, %y 721*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %c 722*9880d681SAndroid Build Coastguard Worker} 723*9880d681SAndroid Build Coastguard Worker 724*9880d681SAndroid Build Coastguard Workerdefine i64 @test43(i32 %a) nounwind { 725*9880d681SAndroid Build Coastguard Worker %a_ext = sext i32 %a to i64 726*9880d681SAndroid Build Coastguard Worker %is_a_nonnegative = icmp sgt i32 %a, -1 727*9880d681SAndroid Build Coastguard Worker %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 0 728*9880d681SAndroid Build Coastguard Worker ret i64 %max 729*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43( 730*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = sext i32 %a to i64 731*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonnegative = icmp slt i64 %a_ext, 0 732*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 0, i64 %a_ext 733*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %max 734*9880d681SAndroid Build Coastguard Worker} 735*9880d681SAndroid Build Coastguard Worker 736*9880d681SAndroid Build Coastguard Workerdefine i64 @test44(i32 %a) nounwind { 737*9880d681SAndroid Build Coastguard Worker %a_ext = sext i32 %a to i64 738*9880d681SAndroid Build Coastguard Worker %is_a_nonpositive = icmp slt i32 %a, 1 739*9880d681SAndroid Build Coastguard Worker %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 0 740*9880d681SAndroid Build Coastguard Worker ret i64 %min 741*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44( 742*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = sext i32 %a to i64 743*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonpositive = icmp sgt i64 %a_ext, 0 744*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 0, i64 %a_ext 745*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %min 746*9880d681SAndroid Build Coastguard Worker} 747*9880d681SAndroid Build Coastguard Workerdefine i64 @test45(i32 %a) nounwind { 748*9880d681SAndroid Build Coastguard Worker %a_ext = zext i32 %a to i64 749*9880d681SAndroid Build Coastguard Worker %is_a_nonnegative = icmp ugt i32 %a, 2 750*9880d681SAndroid Build Coastguard Worker %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 3 751*9880d681SAndroid Build Coastguard Worker ret i64 %max 752*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45( 753*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = zext i32 %a to i64 754*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonnegative = icmp ult i64 %a_ext, 3 755*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 3, i64 %a_ext 756*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %max 757*9880d681SAndroid Build Coastguard Worker} 758*9880d681SAndroid Build Coastguard Worker 759*9880d681SAndroid Build Coastguard Workerdefine i64 @test46(i32 %a) nounwind { 760*9880d681SAndroid Build Coastguard Worker %a_ext = zext i32 %a to i64 761*9880d681SAndroid Build Coastguard Worker %is_a_nonpositive = icmp ult i32 %a, 3 762*9880d681SAndroid Build Coastguard Worker %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2 763*9880d681SAndroid Build Coastguard Worker ret i64 %min 764*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46( 765*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = zext i32 %a to i64 766*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2 767*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext 768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %min 769*9880d681SAndroid Build Coastguard Worker} 770*9880d681SAndroid Build Coastguard Workerdefine i64 @test47(i32 %a) nounwind { 771*9880d681SAndroid Build Coastguard Worker %a_ext = sext i32 %a to i64 772*9880d681SAndroid Build Coastguard Worker %is_a_nonnegative = icmp ugt i32 %a, 2 773*9880d681SAndroid Build Coastguard Worker %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 3 774*9880d681SAndroid Build Coastguard Worker ret i64 %max 775*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47( 776*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = sext i32 %a to i64 777*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonnegative = icmp ult i64 %a_ext, 3 778*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 3, i64 %a_ext 779*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %max 780*9880d681SAndroid Build Coastguard Worker} 781*9880d681SAndroid Build Coastguard Worker 782*9880d681SAndroid Build Coastguard Workerdefine i64 @test48(i32 %a) nounwind { 783*9880d681SAndroid Build Coastguard Worker %a_ext = sext i32 %a to i64 784*9880d681SAndroid Build Coastguard Worker %is_a_nonpositive = icmp ult i32 %a, 3 785*9880d681SAndroid Build Coastguard Worker %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2 786*9880d681SAndroid Build Coastguard Worker ret i64 %min 787*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48( 788*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = sext i32 %a to i64 789*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2 790*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext 791*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %min 792*9880d681SAndroid Build Coastguard Worker} 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Workerdefine i64 @test49(i32 %a) nounwind { 795*9880d681SAndroid Build Coastguard Worker %a_ext = sext i32 %a to i64 796*9880d681SAndroid Build Coastguard Worker %is_a_nonpositive = icmp ult i32 %a, 3 797*9880d681SAndroid Build Coastguard Worker %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext 798*9880d681SAndroid Build Coastguard Worker ret i64 %min 799*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test49( 800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = sext i32 %a to i64 801*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2 802*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2 803*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %min 804*9880d681SAndroid Build Coastguard Worker} 805*9880d681SAndroid Build Coastguard Workerdefine i64 @test50(i32 %a) nounwind { 806*9880d681SAndroid Build Coastguard Worker %is_a_nonpositive = icmp ult i32 %a, 3 807*9880d681SAndroid Build Coastguard Worker %a_ext = sext i32 %a to i64 808*9880d681SAndroid Build Coastguard Worker %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext 809*9880d681SAndroid Build Coastguard Worker ret i64 %min 810*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test50( 811*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a_ext = sext i32 %a to i64 812*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2 813*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2 814*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %min 815*9880d681SAndroid Build Coastguard Worker} 816*9880d681SAndroid Build Coastguard Worker 817*9880d681SAndroid Build Coastguard Worker; PR8994 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard Worker; This select instruction can't be eliminated because trying to do so would 820*9880d681SAndroid Build Coastguard Worker; change the number of vector elements. This used to assert. 821*9880d681SAndroid Build Coastguard Workerdefine i48 @test51(<3 x i1> %icmp, <3 x i16> %tmp) { 822*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test51( 823*9880d681SAndroid Build Coastguard Worker %select = select <3 x i1> %icmp, <3 x i16> zeroinitializer, <3 x i16> %tmp 824*9880d681SAndroid Build Coastguard Worker; CHECK: select <3 x i1> 825*9880d681SAndroid Build Coastguard Worker %tmp2 = bitcast <3 x i16> %select to i48 826*9880d681SAndroid Build Coastguard Worker ret i48 %tmp2 827*9880d681SAndroid Build Coastguard Worker} 828*9880d681SAndroid Build Coastguard Worker 829*9880d681SAndroid Build Coastguard Worker; Allow select promotion even if there are multiple uses of bitcasted ops. 830*9880d681SAndroid Build Coastguard Worker; Hoisting the selects allows later pattern matching to see that these are min/max ops. 831*9880d681SAndroid Build Coastguard Worker 832*9880d681SAndroid Build Coastguard Workerdefine void @min_max_bitcast(<4 x float> %a, <4 x float> %b, <4 x i32>* %ptr1, <4 x i32>* %ptr2) { 833*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @min_max_bitcast( 834*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> %a, %b 835*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL1_V:%.*]] = select <4 x i1> [[CMP]], <4 x float> %a, <4 x float> %b 836*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL2_V:%.*]] = select <4 x i1> [[CMP]], <4 x float> %b, <4 x float> %a 837*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32>* %ptr1 to <4 x float>* 838*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store <4 x float> [[SEL1_V]], <4 x float>* [[TMP1]], align 16 839*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32>* %ptr2 to <4 x float>* 840*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store <4 x float> [[SEL2_V]], <4 x float>* [[TMP2]], align 16 841*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 842*9880d681SAndroid Build Coastguard Worker; 843*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt <4 x float> %a, %b 844*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x float> %a to <4 x i32> 845*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x float> %b to <4 x i32> 846*9880d681SAndroid Build Coastguard Worker %sel1 = select <4 x i1> %cmp, <4 x i32> %bc1, <4 x i32> %bc2 847*9880d681SAndroid Build Coastguard Worker %sel2 = select <4 x i1> %cmp, <4 x i32> %bc2, <4 x i32> %bc1 848*9880d681SAndroid Build Coastguard Worker store <4 x i32> %sel1, <4 x i32>* %ptr1 849*9880d681SAndroid Build Coastguard Worker store <4 x i32> %sel2, <4 x i32>* %ptr2 850*9880d681SAndroid Build Coastguard Worker ret void 851*9880d681SAndroid Build Coastguard Worker} 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Worker; To avoid potential backend problems, we don't do the same transform for other casts. 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Workerdefine void @truncs_before_selects(<4 x float> %f1, <4 x float> %f2, <4 x i64> %a, <4 x i64> %b, <4 x i32>* %ptr1, <4 x i32>* %ptr2) { 856*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @truncs_before_selects( 857*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> %f1, %f2 858*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BC1:%.*]] = trunc <4 x i64> %a to <4 x i32> 859*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BC2:%.*]] = trunc <4 x i64> %b to <4 x i32> 860*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL1:%.*]] = select <4 x i1> [[CMP]], <4 x i32> [[BC1]], <4 x i32> [[BC2]] 861*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL2:%.*]] = select <4 x i1> [[CMP]], <4 x i32> [[BC2]], <4 x i32> [[BC1]] 862*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store <4 x i32> [[SEL1]], <4 x i32>* %ptr1, align 16 863*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store <4 x i32> [[SEL2]], <4 x i32>* %ptr2, align 16 864*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 865*9880d681SAndroid Build Coastguard Worker; 866*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt <4 x float> %f1, %f2 867*9880d681SAndroid Build Coastguard Worker %bc1 = trunc <4 x i64> %a to <4 x i32> 868*9880d681SAndroid Build Coastguard Worker %bc2 = trunc <4 x i64> %b to <4 x i32> 869*9880d681SAndroid Build Coastguard Worker %sel1 = select <4 x i1> %cmp, <4 x i32> %bc1, <4 x i32> %bc2 870*9880d681SAndroid Build Coastguard Worker %sel2 = select <4 x i1> %cmp, <4 x i32> %bc2, <4 x i32> %bc1 871*9880d681SAndroid Build Coastguard Worker store <4 x i32> %sel1, <4 x i32>* %ptr1, align 16 872*9880d681SAndroid Build Coastguard Worker store <4 x i32> %sel2, <4 x i32>* %ptr2, align 16 873*9880d681SAndroid Build Coastguard Worker ret void 874*9880d681SAndroid Build Coastguard Worker} 875*9880d681SAndroid Build Coastguard Worker 876*9880d681SAndroid Build Coastguard Worker; PR8575 877*9880d681SAndroid Build Coastguard Worker 878*9880d681SAndroid Build Coastguard Workerdefine i32 @test52(i32 %n, i32 %m) nounwind { 879*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test52( 880*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %n, %m 881*9880d681SAndroid Build Coastguard Worker %. = select i1 %cmp, i32 1, i32 3 882*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %., 3 883*9880d681SAndroid Build Coastguard Worker %storemerge = select i1 %cmp, i32 %., i32 %add 884*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %cmp, i32 1, i32 6 885*9880d681SAndroid Build Coastguard Worker ret i32 %storemerge 886*9880d681SAndroid Build Coastguard Worker} 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Worker; PR9454 889*9880d681SAndroid Build Coastguard Workerdefine i32 @test53(i32 %x) nounwind { 890*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 2 891*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, %x 892*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 2, i32 1 893*9880d681SAndroid Build Coastguard Worker ret i32 %sel 894*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test53( 895*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %cmp 896*9880d681SAndroid Build Coastguard Worker; CHECK: ret 897*9880d681SAndroid Build Coastguard Worker} 898*9880d681SAndroid Build Coastguard Worker 899*9880d681SAndroid Build Coastguard Workerdefine i32 @test54(i32 %X, i32 %Y) { 900*9880d681SAndroid Build Coastguard Worker %A = ashr exact i32 %X, %Y 901*9880d681SAndroid Build Coastguard Worker %B = icmp eq i32 %A, 0 902*9880d681SAndroid Build Coastguard Worker %C = select i1 %B, i32 %A, i32 1 903*9880d681SAndroid Build Coastguard Worker ret i32 %C 904*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test54( 905*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ashr 906*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 907*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 %X, 0 908*9880d681SAndroid Build Coastguard Worker; CHECK: zext 909*9880d681SAndroid Build Coastguard Worker; CHECK: ret 910*9880d681SAndroid Build Coastguard Worker} 911*9880d681SAndroid Build Coastguard Worker 912*9880d681SAndroid Build Coastguard Workerdefine i1 @test55(i1 %X, i32 %Y, i32 %Z) { 913*9880d681SAndroid Build Coastguard Worker %A = ashr exact i32 %Y, %Z 914*9880d681SAndroid Build Coastguard Worker %B = select i1 %X, i32 %Y, i32 %A 915*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32 %B, 0 916*9880d681SAndroid Build Coastguard Worker ret i1 %C 917*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test55( 918*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ashr 919*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 920*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq 921*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 922*9880d681SAndroid Build Coastguard Worker} 923*9880d681SAndroid Build Coastguard Worker 924*9880d681SAndroid Build Coastguard Workerdefine i32 @test56(i16 %x) nounwind { 925*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %x, 0 926*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %x to i32 927*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 0, i32 %conv 928*9880d681SAndroid Build Coastguard Worker ret i32 %cond 929*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test56( 930*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext 931*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 932*9880d681SAndroid Build Coastguard Worker} 933*9880d681SAndroid Build Coastguard Worker 934*9880d681SAndroid Build Coastguard Workerdefine i32 @test57(i32 %x, i32 %y) nounwind { 935*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %y 936*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %x, 0 937*9880d681SAndroid Build Coastguard Worker %.and = select i1 %tobool, i32 0, i32 %and 938*9880d681SAndroid Build Coastguard Worker ret i32 %.and 939*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test57( 940*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and i32 %x, %y 941*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 942*9880d681SAndroid Build Coastguard Worker} 943*9880d681SAndroid Build Coastguard Worker 944*9880d681SAndroid Build Coastguard Workerdefine i32 @test58(i16 %x) nounwind { 945*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i16 %x, 1 946*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %x to i32 947*9880d681SAndroid Build Coastguard Worker %cond = select i1 %tobool, i32 %conv, i32 1 948*9880d681SAndroid Build Coastguard Worker ret i32 %cond 949*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test58( 950*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext 951*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 952*9880d681SAndroid Build Coastguard Worker} 953*9880d681SAndroid Build Coastguard Worker 954*9880d681SAndroid Build Coastguard Workerdefine i32 @test59(i32 %x, i32 %y) nounwind { 955*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, %y 956*9880d681SAndroid Build Coastguard Worker %tobool = icmp ne i32 %x, %y 957*9880d681SAndroid Build Coastguard Worker %.and = select i1 %tobool, i32 %and, i32 %y 958*9880d681SAndroid Build Coastguard Worker ret i32 %.and 959*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59( 960*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and i32 %x, %y 961*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 962*9880d681SAndroid Build Coastguard Worker} 963*9880d681SAndroid Build Coastguard Worker 964*9880d681SAndroid Build Coastguard Workerdefine i1 @test60(i32 %x, i1* %y) nounwind { 965*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %x, 0 966*9880d681SAndroid Build Coastguard Worker %load = load i1, i1* %y, align 1 967*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp slt i32 %x, 1 968*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i1 %load, i1 %cmp1 969*9880d681SAndroid Build Coastguard Worker ret i1 %sel 970*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60( 971*9880d681SAndroid Build Coastguard Worker; CHECK: select 972*9880d681SAndroid Build Coastguard Worker} 973*9880d681SAndroid Build Coastguard Worker 974*9880d681SAndroid Build Coastguard Worker@glbl = constant i32 10 975*9880d681SAndroid Build Coastguard Workerdefine i32 @test61(i32* %ptr) { 976*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %ptr 977*9880d681SAndroid Build Coastguard Worker %B = icmp eq i32* %ptr, @glbl 978*9880d681SAndroid Build Coastguard Worker %C = select i1 %B, i32 %A, i32 10 979*9880d681SAndroid Build Coastguard Worker ret i32 %C 980*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61( 981*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 10 982*9880d681SAndroid Build Coastguard Worker} 983*9880d681SAndroid Build Coastguard Worker 984*9880d681SAndroid Build Coastguard Worker; PR14131 985*9880d681SAndroid Build Coastguard Workerdefine void @test64(i32 %p, i16 %b) noreturn nounwind { 986*9880d681SAndroid Build Coastguard Workerentry: 987*9880d681SAndroid Build Coastguard Worker %p.addr.0.insert.mask = and i32 %p, -65536 988*9880d681SAndroid Build Coastguard Worker %conv2 = and i32 %p, 65535 989*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lor.rhs, label %lor.end 990*9880d681SAndroid Build Coastguard Worker 991*9880d681SAndroid Build Coastguard Workerlor.rhs: 992*9880d681SAndroid Build Coastguard Worker %p.addr.0.extract.trunc = trunc i32 %p.addr.0.insert.mask to i16 993*9880d681SAndroid Build Coastguard Worker %phitmp = zext i16 %p.addr.0.extract.trunc to i32 994*9880d681SAndroid Build Coastguard Worker br label %lor.end 995*9880d681SAndroid Build Coastguard Worker 996*9880d681SAndroid Build Coastguard Workerlor.end: 997*9880d681SAndroid Build Coastguard Worker %t.1 = phi i32 [ 0, %entry ], [ %phitmp, %lor.rhs ] 998*9880d681SAndroid Build Coastguard Worker %conv6 = zext i16 %b to i32 999*9880d681SAndroid Build Coastguard Worker %div = udiv i32 %conv6, %t.1 1000*9880d681SAndroid Build Coastguard Worker %tobool8 = icmp eq i32 %div, 0 1001*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %t.1, 0 1002*9880d681SAndroid Build Coastguard Worker %cmp12 = icmp ult i32 %conv2, 2 1003*9880d681SAndroid Build Coastguard Worker %cmp.sink = select i1 %tobool8, i1 %cmp12, i1 %cmp 1004*9880d681SAndroid Build Coastguard Worker br i1 %cmp.sink, label %cond.end17, label %cond.false16 1005*9880d681SAndroid Build Coastguard Worker 1006*9880d681SAndroid Build Coastguard Workercond.false16: 1007*9880d681SAndroid Build Coastguard Worker br label %cond.end17 1008*9880d681SAndroid Build Coastguard Worker 1009*9880d681SAndroid Build Coastguard Workercond.end17: 1010*9880d681SAndroid Build Coastguard Worker br label %while.body 1011*9880d681SAndroid Build Coastguard Worker 1012*9880d681SAndroid Build Coastguard Workerwhile.body: 1013*9880d681SAndroid Build Coastguard Worker br label %while.body 1014*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test64( 1015*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 1016*9880d681SAndroid Build Coastguard Worker} 1017*9880d681SAndroid Build Coastguard Worker 1018*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2( 1019*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 %x, 1 1020*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], 2 1021*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y 1022*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1023*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_eq_and_1_0_or_2(i32 %x, i32 %y) { 1024*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 1 1025*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1026*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 2 1027*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1028*9880d681SAndroid Build Coastguard Worker ret i32 %select 1029*9880d681SAndroid Build Coastguard Worker} 1030*9880d681SAndroid Build Coastguard Worker 1031*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8( 1032*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 2 1033*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 8 1034*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y 1035*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1036*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_eq_and_32_0_or_8(i32 %x, i32 %y) { 1037*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 32 1038*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1039*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 8 1040*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1041*9880d681SAndroid Build Coastguard Worker ret i32 %select 1042*9880d681SAndroid Build Coastguard Worker} 1043*9880d681SAndroid Build Coastguard Worker 1044*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096( 1045*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 4096 1046*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 4096 1047*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y 1048*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1049*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_ne_0_and_4096_or_4096(i32 %x, i32 %y) { 1050*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4096 1051*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 0, %and 1052*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 4096 1053*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1054*9880d681SAndroid Build Coastguard Worker ret i32 %select 1055*9880d681SAndroid Build Coastguard Worker} 1056*9880d681SAndroid Build Coastguard Worker 1057*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096( 1058*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 4096 1059*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y 1060*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1061*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_eq_and_4096_0_or_4096(i32 %x, i32 %y) { 1062*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4096 1063*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1064*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 4096 1065*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1066*9880d681SAndroid Build Coastguard Worker ret i32 %select 1067*9880d681SAndroid Build Coastguard Worker} 1068*9880d681SAndroid Build Coastguard Worker 1069*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1( 1070*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRUNC:%.+]] = trunc i64 %x to i32 1071*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.+]] = and i32 [[TRUNC]], 1 1072*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.+]] = or i32 [[XOR]], %y 1073*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1074*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_eq_0_and_1_or_1(i64 %x, i32 %y) { 1075*9880d681SAndroid Build Coastguard Worker %and = and i64 %x, 1 1076*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i64 %and, 0 1077*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 1 1078*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1079*9880d681SAndroid Build Coastguard Worker ret i32 %select 1080*9880d681SAndroid Build Coastguard Worker} 1081*9880d681SAndroid Build Coastguard Worker 1082*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_32( 1083*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 7 1084*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 32 1085*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 32 1086*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y 1087*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1088*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_ne_0_and_4096_or_32(i32 %x, i32 %y) { 1089*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 4096 1090*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 0, %and 1091*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 32 1092*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1093*9880d681SAndroid Build Coastguard Worker ret i32 %select 1094*9880d681SAndroid Build Coastguard Worker} 1095*9880d681SAndroid Build Coastguard Worker 1096*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096( 1097*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 %x, 7 1098*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], 4096 1099*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 4096 1100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y 1101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1102*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_ne_0_and_32_or_4096(i32 %x, i32 %y) { 1103*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 32 1104*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 0, %and 1105*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 4096 1106*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1107*9880d681SAndroid Build Coastguard Worker ret i32 %select 1108*9880d681SAndroid Build Coastguard Worker} 1109*9880d681SAndroid Build Coastguard Worker 1110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_or_8( 1111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LSHR:%.+]] = lshr i32 %x, 27 1112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRUNC:%.+]] = trunc i32 [[LSHR]] to i8 1113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.+]] = and i8 [[TRUNC]], 8 1114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.+]] = xor i8 [[AND]], 8 1115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.+]] = or i8 [[XOR]], %y 1116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[OR]] 1117*9880d681SAndroid Build Coastguard Workerdefine i8 @select_icmp_ne_0_and_1073741824_or_8(i32 %x, i8 %y) { 1118*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 1073741824 1119*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 0, %and 1120*9880d681SAndroid Build Coastguard Worker %or = or i8 %y, 8 1121*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i8 %y, i8 %or 1122*9880d681SAndroid Build Coastguard Worker ret i8 %select 1123*9880d681SAndroid Build Coastguard Worker} 1124*9880d681SAndroid Build Coastguard Worker 1125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_ne_0_and_8_or_1073741824( 1126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i8 %x, 8 1127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%[a-z0-9]+]] = zext i8 [[AND]] to i32 1128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl nuw nsw i32 [[ZEXT]], 27 1129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[SHL]], 1073741824 1130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y 1131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1132*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_ne_0_and_8_or_1073741824(i8 %x, i32 %y) { 1133*9880d681SAndroid Build Coastguard Worker %and = and i8 %x, 8 1134*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 0, %and 1135*9880d681SAndroid Build Coastguard Worker %or = or i32 %y, 1073741824 1136*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, i32 %y, i32 %or 1137*9880d681SAndroid Build Coastguard Worker ret i32 %select 1138*9880d681SAndroid Build Coastguard Worker} 1139*9880d681SAndroid Build Coastguard Worker 1140*9880d681SAndroid Build Coastguard Worker; We can't combine here, because the cmp is scalar and the or vector. 1141*9880d681SAndroid Build Coastguard Worker; Just make sure we don't assert. 1142*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @select_icmp_eq_and_1_0_or_vector_of_2s(i32 %x, <2 x i32> %y) { 1143*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 1 1144*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1145*9880d681SAndroid Build Coastguard Worker %or = or <2 x i32> %y, <i32 2, i32 2> 1146*9880d681SAndroid Build Coastguard Worker %select = select i1 %cmp, <2 x i32> %y, <2 x i32> %or 1147*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %select 1148*9880d681SAndroid Build Coastguard Worker} 1149*9880d681SAndroid Build Coastguard Worker 1150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_8_ne_0_xor_8( 1151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, -9 1152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]] 1153*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_8_ne_0_xor_8(i32 %x) { 1154*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 1155*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1156*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %x, 8 1157*9880d681SAndroid Build Coastguard Worker %x.xor = select i1 %cmp, i32 %x, i32 %xor 1158*9880d681SAndroid Build Coastguard Worker ret i32 %x.xor 1159*9880d681SAndroid Build Coastguard Worker} 1160*9880d681SAndroid Build Coastguard Worker 1161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_8_eq_0_xor_8( 1162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, 8 1163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1164*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_8_eq_0_xor_8(i32 %x) { 1165*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 1166*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1167*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %x, 8 1168*9880d681SAndroid Build Coastguard Worker %xor.x = select i1 %cmp, i32 %xor, i32 %x 1169*9880d681SAndroid Build Coastguard Worker ret i32 %xor.x 1170*9880d681SAndroid Build Coastguard Worker} 1171*9880d681SAndroid Build Coastguard Worker 1172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_xor_8( 1173*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %cmp, i64 %y, i64 %xor 1174*9880d681SAndroid Build Coastguard Workerdefine i64 @select_icmp_x_and_8_eq_0_y_xor_8(i32 %x, i64 %y) { 1175*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 1176*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1177*9880d681SAndroid Build Coastguard Worker %xor = xor i64 %y, 8 1178*9880d681SAndroid Build Coastguard Worker %y.xor = select i1 %cmp, i64 %y, i64 %xor 1179*9880d681SAndroid Build Coastguard Worker ret i64 %y.xor 1180*9880d681SAndroid Build Coastguard Worker} 1181*9880d681SAndroid Build Coastguard Worker 1182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_xor_8( 1183*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %cmp, i64 %xor, i64 %y 1184*9880d681SAndroid Build Coastguard Workerdefine i64 @select_icmp_x_and_8_ne_0_y_xor_8(i32 %x, i64 %y) { 1185*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 1186*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1187*9880d681SAndroid Build Coastguard Worker %xor = xor i64 %y, 8 1188*9880d681SAndroid Build Coastguard Worker %xor.y = select i1 %cmp, i64 %xor, i64 %y 1189*9880d681SAndroid Build Coastguard Worker ret i64 %xor.y 1190*9880d681SAndroid Build Coastguard Worker} 1191*9880d681SAndroid Build Coastguard Worker 1192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8( 1193*9880d681SAndroid Build Coastguard Worker; CHECK: xor i64 %1, 8 1194*9880d681SAndroid Build Coastguard Worker; CHECK: or i64 %2, %y 1195*9880d681SAndroid Build Coastguard Workerdefine i64 @select_icmp_x_and_8_ne_0_y_or_8(i32 %x, i64 %y) { 1196*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 1197*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1198*9880d681SAndroid Build Coastguard Worker %or = or i64 %y, 8 1199*9880d681SAndroid Build Coastguard Worker %or.y = select i1 %cmp, i64 %or, i64 %y 1200*9880d681SAndroid Build Coastguard Worker ret i64 %or.y 1201*9880d681SAndroid Build Coastguard Worker} 1202*9880d681SAndroid Build Coastguard Worker 1203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_2147483648_ne_0_xor_2147483648( 1204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 2147483647 1205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]] 1206*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_2147483648_ne_0_xor_2147483648(i32 %x) { 1207*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 2147483648 1208*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1209*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %x, 2147483648 1210*9880d681SAndroid Build Coastguard Worker %x.xor = select i1 %cmp, i32 %x, i32 %xor 1211*9880d681SAndroid Build Coastguard Worker ret i32 %x.xor 1212*9880d681SAndroid Build Coastguard Worker} 1213*9880d681SAndroid Build Coastguard Worker 1214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_2147483648_eq_0_xor_2147483648( 1215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, -2147483648 1216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1217*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_2147483648_eq_0_xor_2147483648(i32 %x) { 1218*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 2147483648 1219*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1220*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %x, 2147483648 1221*9880d681SAndroid Build Coastguard Worker %xor.x = select i1 %cmp, i32 %xor, i32 %x 1222*9880d681SAndroid Build Coastguard Worker ret i32 %xor.x 1223*9880d681SAndroid Build Coastguard Worker} 1224*9880d681SAndroid Build Coastguard Worker 1225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_x_and_2147483648_ne_0_or_2147483648( 1226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, -2147483648 1227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 1228*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_x_and_2147483648_ne_0_or_2147483648(i32 %x) { 1229*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 2147483648 1230*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 1231*9880d681SAndroid Build Coastguard Worker %or = or i32 %x, 2147483648 1232*9880d681SAndroid Build Coastguard Worker %or.x = select i1 %cmp, i32 %or, i32 %x 1233*9880d681SAndroid Build Coastguard Worker ret i32 %or.x 1234*9880d681SAndroid Build Coastguard Worker} 1235*9880d681SAndroid Build Coastguard Worker 1236*9880d681SAndroid Build Coastguard Workerdefine i32 @test65(i64 %x) { 1237*9880d681SAndroid Build Coastguard Worker %1 = and i64 %x, 16 1238*9880d681SAndroid Build Coastguard Worker %2 = icmp ne i64 %1, 0 1239*9880d681SAndroid Build Coastguard Worker %3 = select i1 %2, i32 40, i32 42 1240*9880d681SAndroid Build Coastguard Worker ret i32 %3 1241*9880d681SAndroid Build Coastguard Worker 1242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test65( 1243*9880d681SAndroid Build Coastguard Worker; CHECK: %[[TRUNC:.*]] = trunc i64 %x to i32 1244*9880d681SAndroid Build Coastguard Worker; CHECK: %[[LSHR:.*]] = lshr i32 %[[TRUNC]], 3 1245*9880d681SAndroid Build Coastguard Worker; CHECK: %[[AND:.*]] = and i32 %[[LSHR]], 2 1246*9880d681SAndroid Build Coastguard Worker; CHECK: %[[XOR:.*]] = xor i32 %[[AND]], 42 1247*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[XOR]] 1248*9880d681SAndroid Build Coastguard Worker} 1249*9880d681SAndroid Build Coastguard Worker 1250*9880d681SAndroid Build Coastguard Workerdefine i32 @test66(i64 %x) { 1251*9880d681SAndroid Build Coastguard Worker %1 = and i64 %x, 4294967296 1252*9880d681SAndroid Build Coastguard Worker %2 = icmp ne i64 %1, 0 1253*9880d681SAndroid Build Coastguard Worker %3 = select i1 %2, i32 40, i32 42 1254*9880d681SAndroid Build Coastguard Worker ret i32 %3 1255*9880d681SAndroid Build Coastguard Worker 1256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test66( 1257*9880d681SAndroid Build Coastguard Worker; CHECK: select 1258*9880d681SAndroid Build Coastguard Worker} 1259*9880d681SAndroid Build Coastguard Worker 1260*9880d681SAndroid Build Coastguard Workerdefine i32 @test67(i16 %x) { 1261*9880d681SAndroid Build Coastguard Worker %1 = and i16 %x, 4 1262*9880d681SAndroid Build Coastguard Worker %2 = icmp ne i16 %1, 0 1263*9880d681SAndroid Build Coastguard Worker %3 = select i1 %2, i32 40, i32 42 1264*9880d681SAndroid Build Coastguard Worker ret i32 %3 1265*9880d681SAndroid Build Coastguard Worker 1266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test67( 1267*9880d681SAndroid Build Coastguard Worker; CHECK: and i16 %x, 4 1268*9880d681SAndroid Build Coastguard Worker; CHECK: zext i16 %1 to i32 1269*9880d681SAndroid Build Coastguard Worker; CHECK: lshr exact i32 %2, 1 1270*9880d681SAndroid Build Coastguard Worker; CHECK: xor i32 %3, 42 1271*9880d681SAndroid Build Coastguard Worker} 1272*9880d681SAndroid Build Coastguard Worker 1273*9880d681SAndroid Build Coastguard Worker; SMIN(SMIN(X, 11), 92) -> SMIN(X, 11) 1274*9880d681SAndroid Build Coastguard Workerdefine i32 @test68(i32 %x) { 1275*9880d681SAndroid Build Coastguard Workerentry: 1276*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 11, %x 1277*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 11, i32 %x 1278*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp slt i32 92, %cond 1279*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 92, i32 %cond 1280*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68( 1282*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 1283*9880d681SAndroid Build Coastguard Worker} 1284*9880d681SAndroid Build Coastguard Worker 1285*9880d681SAndroid Build Coastguard Worker; MIN(MIN(X, 24), 83) -> MIN(X, 24) 1286*9880d681SAndroid Build Coastguard Workerdefine i32 @test69(i32 %x) { 1287*9880d681SAndroid Build Coastguard Workerentry: 1288*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 24, %x 1289*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 24, i32 %x 1290*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ult i32 83, %cond 1291*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 83, i32 %cond 1292*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1293*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test69( 1294*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 1295*9880d681SAndroid Build Coastguard Worker} 1296*9880d681SAndroid Build Coastguard Worker 1297*9880d681SAndroid Build Coastguard Worker; SMAX(SMAX(X, 75), 36) -> SMAX(X, 75) 1298*9880d681SAndroid Build Coastguard Workerdefine i32 @test70(i32 %x) { 1299*9880d681SAndroid Build Coastguard Workerentry: 1300*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %x, 75 1301*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 75, i32 %x 1302*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp slt i32 %cond, 36 1303*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 36, i32 %cond 1304*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test70( 1306*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 1307*9880d681SAndroid Build Coastguard Worker} 1308*9880d681SAndroid Build Coastguard Worker 1309*9880d681SAndroid Build Coastguard Worker; MAX(MAX(X, 68), 47) -> MAX(X, 68) 1310*9880d681SAndroid Build Coastguard Workerdefine i32 @test71(i32 %x) { 1311*9880d681SAndroid Build Coastguard Workerentry: 1312*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %x, 68 1313*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 68, i32 %x 1314*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ult i32 %cond, 47 1315*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 47, i32 %cond 1316*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test71( 1318*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %cond 1319*9880d681SAndroid Build Coastguard Worker} 1320*9880d681SAndroid Build Coastguard Worker 1321*9880d681SAndroid Build Coastguard Worker; SMIN(SMIN(X, 92), 11) -> SMIN(X, 11) 1322*9880d681SAndroid Build Coastguard Workerdefine i32 @test72(i32 %x) { 1323*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, 92 1324*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 92, i32 %x 1325*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp sgt i32 %cond, 11 1326*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 11, i32 %cond 1327*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1328*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test72( 1329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 11 1330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 11, i32 %x 1331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEL]] 1332*9880d681SAndroid Build Coastguard Worker} 1333*9880d681SAndroid Build Coastguard Worker 1334*9880d681SAndroid Build Coastguard Worker; MIN(MIN(X, 83), 24) -> MIN(X, 24) 1335*9880d681SAndroid Build Coastguard Workerdefine i32 @test73(i32 %x) { 1336*9880d681SAndroid Build Coastguard Worker %cmp = icmp ugt i32 %x, 83 1337*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 83, i32 %x 1338*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ugt i32 %cond, 24 1339*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 24, i32 %cond 1340*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test73( 1342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %x, 24 1343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 24, i32 %x 1344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEL]] 1345*9880d681SAndroid Build Coastguard Worker} 1346*9880d681SAndroid Build Coastguard Worker 1347*9880d681SAndroid Build Coastguard Worker; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75) 1348*9880d681SAndroid Build Coastguard Workerdefine i32 @test74(i32 %x) { 1349*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %x, 36 1350*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 36, i32 %x 1351*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp slt i32 %cond, 75 1352*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 75, i32 %cond 1353*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1354*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test74( 1355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 75 1356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 75, i32 %x 1357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEL]] 1358*9880d681SAndroid Build Coastguard Worker} 1359*9880d681SAndroid Build Coastguard Worker 1360*9880d681SAndroid Build Coastguard Worker; MAX(MAX(X, 47), 68) -> MAX(X, 68) 1361*9880d681SAndroid Build Coastguard Workerdefine i32 @test75(i32 %x) { 1362*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %x, 47 1363*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 47, i32 %x 1364*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ult i32 %cond, 68 1365*9880d681SAndroid Build Coastguard Worker %retval = select i1 %cmp3, i32 68, i32 %cond 1366*9880d681SAndroid Build Coastguard Worker ret i32 %retval 1367*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test75( 1368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %x, 68 1369*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 68, i32 %x 1370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEL]] 1371*9880d681SAndroid Build Coastguard Worker} 1372*9880d681SAndroid Build Coastguard Worker 1373*9880d681SAndroid Build Coastguard Worker@under_aligned = external global i32, align 1 1374*9880d681SAndroid Build Coastguard Worker 1375*9880d681SAndroid Build Coastguard Workerdefine i32 @test76(i1 %flag, i32* %x) { 1376*9880d681SAndroid Build Coastguard Worker; The load here must not be speculated around the select. One side of the 1377*9880d681SAndroid Build Coastguard Worker; select is trivially dereferencable but may have a lower alignment than the 1378*9880d681SAndroid Build Coastguard Worker; load does. 1379*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test76( 1380*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* %x 1381*9880d681SAndroid Build Coastguard Worker; CHECK: %[[P:.*]] = select i1 %flag, i32* @under_aligned, i32* %x 1382*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %[[P]] 1383*9880d681SAndroid Build Coastguard Worker 1384*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %x 1385*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* @under_aligned, i32* %x 1386*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1387*9880d681SAndroid Build Coastguard Worker ret i32 %v 1388*9880d681SAndroid Build Coastguard Worker} 1389*9880d681SAndroid Build Coastguard Worker 1390*9880d681SAndroid Build Coastguard Workerdeclare void @scribble_on_i32(i32*) 1391*9880d681SAndroid Build Coastguard Worker 1392*9880d681SAndroid Build Coastguard Workerdefine i32 @test77(i1 %flag, i32* %x) { 1393*9880d681SAndroid Build Coastguard Worker; The load here must not be speculated around the select. One side of the 1394*9880d681SAndroid Build Coastguard Worker; select is trivially dereferencable but may have a lower alignment than the 1395*9880d681SAndroid Build Coastguard Worker; load does. 1396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test77( 1397*9880d681SAndroid Build Coastguard Worker; CHECK: %[[A:.*]] = alloca i32, align 1 1398*9880d681SAndroid Build Coastguard Worker; CHECK: call void @scribble_on_i32(i32* nonnull %[[A]]) 1399*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* %x 1400*9880d681SAndroid Build Coastguard Worker; CHECK: %[[P:.*]] = select i1 %flag, i32* %[[A]], i32* %x 1401*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %[[P]] 1402*9880d681SAndroid Build Coastguard Worker 1403*9880d681SAndroid Build Coastguard Worker %under_aligned = alloca i32, align 1 1404*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %under_aligned) 1405*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %x 1406*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %under_aligned, i32* %x 1407*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1408*9880d681SAndroid Build Coastguard Worker ret i32 %v 1409*9880d681SAndroid Build Coastguard Worker} 1410*9880d681SAndroid Build Coastguard Worker 1411*9880d681SAndroid Build Coastguard Workerdefine i32 @test78(i1 %flag, i32* %x, i32* %y, i32* %z) { 1412*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the loads around the select even when we can't 1413*9880d681SAndroid Build Coastguard Worker; fold the load completely away. 1414*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test78( 1415*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V1:.*]] = load i32, i32* %x 1416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[V2:.*]] = load i32, i32* %y 1417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[S:.*]] = select i1 %flag, i32 %[[V1]], i32 %[[V2]] 1418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[S]] 1419*9880d681SAndroid Build Coastguard Workerentry: 1420*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %x 1421*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %y 1422*9880d681SAndroid Build Coastguard Worker ; Block forwarding by storing to %z which could alias either %x or %y. 1423*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %z 1424*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %x, i32* %y 1425*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1426*9880d681SAndroid Build Coastguard Worker ret i32 %v 1427*9880d681SAndroid Build Coastguard Worker} 1428*9880d681SAndroid Build Coastguard Worker 1429*9880d681SAndroid Build Coastguard Workerdefine i32 @test78_deref(i1 %flag, i32* dereferenceable(4) %x, i32* dereferenceable(4) %y, i32* %z) { 1430*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the loads around the select even when we can't 1431*9880d681SAndroid Build Coastguard Worker; fold the load completely away. 1432*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test78_deref( 1433*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V1:.*]] = load i32, i32* %x 1434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[V2:.*]] = load i32, i32* %y 1435*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[S:.*]] = select i1 %flag, i32 %[[V1]], i32 %[[V2]] 1436*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[S]] 1437*9880d681SAndroid Build Coastguard Workerentry: 1438*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %x, i32* %y 1439*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1440*9880d681SAndroid Build Coastguard Worker ret i32 %v 1441*9880d681SAndroid Build Coastguard Worker} 1442*9880d681SAndroid Build Coastguard Worker 1443*9880d681SAndroid Build Coastguard Workerdefine i32 @test78_neg(i1 %flag, i32* %x, i32* %y, i32* %z) { 1444*9880d681SAndroid Build Coastguard Worker; The same as @test78 but we can't speculate the load because it can trap 1445*9880d681SAndroid Build Coastguard Worker; if under-aligned. 1446*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test78_neg( 1447*9880d681SAndroid Build Coastguard Worker; CHECK: %p = select i1 %flag, i32* %x, i32* %y 1448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v = load i32, i32* %p, align 16 1449*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %v 1450*9880d681SAndroid Build Coastguard Workerentry: 1451*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %x 1452*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %y 1453*9880d681SAndroid Build Coastguard Worker ; Block forwarding by storing to %z which could alias either %x or %y. 1454*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %z 1455*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %x, i32* %y 1456*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p, align 16 1457*9880d681SAndroid Build Coastguard Worker ret i32 %v 1458*9880d681SAndroid Build Coastguard Worker} 1459*9880d681SAndroid Build Coastguard Worker 1460*9880d681SAndroid Build Coastguard Workerdefine i32 @test78_deref_neg(i1 %flag, i32* dereferenceable(2) %x, i32* dereferenceable(4) %y, i32* %z) { 1461*9880d681SAndroid Build Coastguard Worker; The same as @test78_deref but we can't speculate the load because 1462*9880d681SAndroid Build Coastguard Worker; one of the arguments is not sufficiently dereferenceable. 1463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test78_deref_neg( 1464*9880d681SAndroid Build Coastguard Worker; CHECK: %p = select i1 %flag, i32* %x, i32* %y 1465*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v = load i32, i32* %p 1466*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %v 1467*9880d681SAndroid Build Coastguard Workerentry: 1468*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %x, i32* %y 1469*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1470*9880d681SAndroid Build Coastguard Worker ret i32 %v 1471*9880d681SAndroid Build Coastguard Worker} 1472*9880d681SAndroid Build Coastguard Worker 1473*9880d681SAndroid Build Coastguard Workerdefine float @test79(i1 %flag, float* %x, i32* %y, i32* %z) { 1474*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the loads around the select even when we can't 1475*9880d681SAndroid Build Coastguard Worker; fold the load completely away. 1476*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test79( 1477*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V1:.*]] = load float, float* %x 1478*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[V2:.*]] = load float, float* %y 1479*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[S:.*]] = select i1 %flag, float %[[V1]], float %[[V2]] 1480*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %[[S]] 1481*9880d681SAndroid Build Coastguard Workerentry: 1482*9880d681SAndroid Build Coastguard Worker %x1 = bitcast float* %x to i32* 1483*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i32* %y to float* 1484*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %x1 1485*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %y 1486*9880d681SAndroid Build Coastguard Worker ; Block forwarding by storing to %z which could alias either %x or %y. 1487*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %z 1488*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, float* %x, float* %y1 1489*9880d681SAndroid Build Coastguard Worker %v = load float, float* %p 1490*9880d681SAndroid Build Coastguard Worker ret float %v 1491*9880d681SAndroid Build Coastguard Worker} 1492*9880d681SAndroid Build Coastguard Worker 1493*9880d681SAndroid Build Coastguard Workerdefine i32 @test80(i1 %flag) { 1494*9880d681SAndroid Build Coastguard Worker; Test that when we speculate the loads around the select they fold throug 1495*9880d681SAndroid Build Coastguard Worker; load->load folding and load->store folding. 1496*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80( 1497*9880d681SAndroid Build Coastguard Worker; CHECK: %[[X:.*]] = alloca i32 1498*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = alloca i32 1499*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V:.*]] = load i32, i32* %[[X]] 1500*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 %[[V]], i32* %[[Y]] 1501*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[V]] 1502*9880d681SAndroid Build Coastguard Workerentry: 1503*9880d681SAndroid Build Coastguard Worker %x = alloca i32 1504*9880d681SAndroid Build Coastguard Worker %y = alloca i32 1505*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %x) 1506*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %y) 1507*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %x 1508*9880d681SAndroid Build Coastguard Worker store i32 %tmp, i32* %y 1509*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %x, i32* %y 1510*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1511*9880d681SAndroid Build Coastguard Worker ret i32 %v 1512*9880d681SAndroid Build Coastguard Worker} 1513*9880d681SAndroid Build Coastguard Worker 1514*9880d681SAndroid Build Coastguard Workerdefine float @test81(i1 %flag) { 1515*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the load around the select even though they use 1516*9880d681SAndroid Build Coastguard Worker; differently typed pointers. 1517*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test81( 1518*9880d681SAndroid Build Coastguard Worker; CHECK: %[[X:.*]] = alloca i32 1519*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = alloca i32 1520*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V:.*]] = load i32, i32* %[[X]] 1521*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 %[[V]], i32* %[[Y]] 1522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[C:.*]] = bitcast i32 %[[V]] to float 1523*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %[[C]] 1524*9880d681SAndroid Build Coastguard Workerentry: 1525*9880d681SAndroid Build Coastguard Worker %x = alloca float 1526*9880d681SAndroid Build Coastguard Worker %y = alloca i32 1527*9880d681SAndroid Build Coastguard Worker %x1 = bitcast float* %x to i32* 1528*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i32* %y to float* 1529*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %x1) 1530*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %y) 1531*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %x1 1532*9880d681SAndroid Build Coastguard Worker store i32 %tmp, i32* %y 1533*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, float* %x, float* %y1 1534*9880d681SAndroid Build Coastguard Worker %v = load float, float* %p 1535*9880d681SAndroid Build Coastguard Worker ret float %v 1536*9880d681SAndroid Build Coastguard Worker} 1537*9880d681SAndroid Build Coastguard Worker 1538*9880d681SAndroid Build Coastguard Workerdefine i32 @test82(i1 %flag) { 1539*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the load around the select even though they use 1540*9880d681SAndroid Build Coastguard Worker; differently typed pointers. 1541*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test82( 1542*9880d681SAndroid Build Coastguard Worker; CHECK: %[[X:.*]] = alloca float 1543*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = alloca i32 1544*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[X1:.*]] = bitcast float* %[[X]] to i32* 1545*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y1:.*]] = bitcast i32* %[[Y]] to float* 1546*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V:.*]] = load float, float* %[[X]] 1547*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store float %[[V]], float* %[[Y1]] 1548*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[C:.*]] = bitcast float %[[V]] to i32 1549*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[C]] 1550*9880d681SAndroid Build Coastguard Workerentry: 1551*9880d681SAndroid Build Coastguard Worker %x = alloca float 1552*9880d681SAndroid Build Coastguard Worker %y = alloca i32 1553*9880d681SAndroid Build Coastguard Worker %x1 = bitcast float* %x to i32* 1554*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i32* %y to float* 1555*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %x1) 1556*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i32(i32* %y) 1557*9880d681SAndroid Build Coastguard Worker %tmp = load float, float* %x 1558*9880d681SAndroid Build Coastguard Worker store float %tmp, float* %y1 1559*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i32* %x1, i32* %y 1560*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p 1561*9880d681SAndroid Build Coastguard Worker ret i32 %v 1562*9880d681SAndroid Build Coastguard Worker} 1563*9880d681SAndroid Build Coastguard Worker 1564*9880d681SAndroid Build Coastguard Workerdeclare void @scribble_on_i64(i64*) 1565*9880d681SAndroid Build Coastguard Workerdeclare void @scribble_on_i128(i128*) 1566*9880d681SAndroid Build Coastguard Worker 1567*9880d681SAndroid Build Coastguard Workerdefine i8* @test83(i1 %flag) { 1568*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the load around the select even though they use 1569*9880d681SAndroid Build Coastguard Worker; differently typed pointers and requires inttoptr casts. 1570*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test83( 1571*9880d681SAndroid Build Coastguard Worker; CHECK: %[[X:.*]] = alloca i8* 1572*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = alloca i8* 1573*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: %[[X2:.*]] = bitcast i8** %[[X]] to i64* 1574*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: %[[Y2:.*]] = bitcast i8** %[[Y]] to i64* 1575*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V:.*]] = load i64, i64* %[[X2]] 1576*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i64 %[[V]], i64* %[[Y2]] 1577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[C:.*]] = inttoptr i64 %[[V]] to i8* 1578*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8* %[[S]] 1579*9880d681SAndroid Build Coastguard Workerentry: 1580*9880d681SAndroid Build Coastguard Worker %x = alloca i8* 1581*9880d681SAndroid Build Coastguard Worker %y = alloca i64 1582*9880d681SAndroid Build Coastguard Worker %x1 = bitcast i8** %x to i64* 1583*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i64* %y to i8** 1584*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i64(i64* %x1) 1585*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i64(i64* %y) 1586*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* %x1 1587*9880d681SAndroid Build Coastguard Worker store i64 %tmp, i64* %y 1588*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i8** %x, i8** %y1 1589*9880d681SAndroid Build Coastguard Worker %v = load i8*, i8** %p 1590*9880d681SAndroid Build Coastguard Worker ret i8* %v 1591*9880d681SAndroid Build Coastguard Worker} 1592*9880d681SAndroid Build Coastguard Worker 1593*9880d681SAndroid Build Coastguard Workerdefine i64 @test84(i1 %flag) { 1594*9880d681SAndroid Build Coastguard Worker; Test that we can speculate the load around the select even though they use 1595*9880d681SAndroid Build Coastguard Worker; differently typed pointers and requires a ptrtoint cast. 1596*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test84( 1597*9880d681SAndroid Build Coastguard Worker; CHECK: %[[X:.*]] = alloca i8* 1598*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = alloca i8* 1599*9880d681SAndroid Build Coastguard Worker; CHECK: %[[V:.*]] = load i8*, i8** %[[X]] 1600*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* %[[V]], i8** %[[Y]] 1601*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[C:.*]] = ptrtoint i8* %[[V]] to i64 1602*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %[[C]] 1603*9880d681SAndroid Build Coastguard Workerentry: 1604*9880d681SAndroid Build Coastguard Worker %x = alloca i8* 1605*9880d681SAndroid Build Coastguard Worker %y = alloca i64 1606*9880d681SAndroid Build Coastguard Worker %x1 = bitcast i8** %x to i64* 1607*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i64* %y to i8** 1608*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i64(i64* %x1) 1609*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i64(i64* %y) 1610*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %x 1611*9880d681SAndroid Build Coastguard Worker store i8* %tmp, i8** %y1 1612*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i64* %x1, i64* %y 1613*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* %p 1614*9880d681SAndroid Build Coastguard Worker ret i64 %v 1615*9880d681SAndroid Build Coastguard Worker} 1616*9880d681SAndroid Build Coastguard Worker 1617*9880d681SAndroid Build Coastguard Workerdefine i8* @test85(i1 %flag) { 1618*9880d681SAndroid Build Coastguard Worker; Test that we can't speculate the load around the select. The load of the 1619*9880d681SAndroid Build Coastguard Worker; pointer doesn't load all of the stored integer bits. We could fix this, but it 1620*9880d681SAndroid Build Coastguard Worker; would require endianness checks and other nastiness. 1621*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test85( 1622*9880d681SAndroid Build Coastguard Worker; CHECK: %[[T:.*]] = load i128, i128* 1623*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i128 %[[T]], i128* 1624*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[X:.*]] = load i8*, i8** 1625*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = load i8*, i8** 1626*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[V:.*]] = select i1 %flag, i8* %[[X]], i8* %[[Y]] 1627*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8* %[[V]] 1628*9880d681SAndroid Build Coastguard Workerentry: 1629*9880d681SAndroid Build Coastguard Worker %x = alloca [2 x i8*] 1630*9880d681SAndroid Build Coastguard Worker %y = alloca i128 1631*9880d681SAndroid Build Coastguard Worker %x1 = bitcast [2 x i8*]* %x to i8** 1632*9880d681SAndroid Build Coastguard Worker %x2 = bitcast i8** %x1 to i128* 1633*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i128* %y to i8** 1634*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i128(i128* %x2) 1635*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i128(i128* %y) 1636*9880d681SAndroid Build Coastguard Worker %tmp = load i128, i128* %x2 1637*9880d681SAndroid Build Coastguard Worker store i128 %tmp, i128* %y 1638*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i8** %x1, i8** %y1 1639*9880d681SAndroid Build Coastguard Worker %v = load i8*, i8** %p 1640*9880d681SAndroid Build Coastguard Worker ret i8* %v 1641*9880d681SAndroid Build Coastguard Worker} 1642*9880d681SAndroid Build Coastguard Worker 1643*9880d681SAndroid Build Coastguard Workerdefine i128 @test86(i1 %flag) { 1644*9880d681SAndroid Build Coastguard Worker; Test that we can't speculate the load around the select when the integer size 1645*9880d681SAndroid Build Coastguard Worker; is larger than the pointer size. The store of the pointer doesn't store to all 1646*9880d681SAndroid Build Coastguard Worker; the bits of the integer. 1647*9880d681SAndroid Build Coastguard Worker; 1648*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test86( 1649*9880d681SAndroid Build Coastguard Worker; CHECK: %[[T:.*]] = load i8*, i8** 1650*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* %[[T]], i8** 1651*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[X:.*]] = load i128, i128* 1652*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[Y:.*]] = load i128, i128* 1653*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[V:.*]] = select i1 %flag, i128 %[[X]], i128 %[[Y]] 1654*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i128 %[[V]] 1655*9880d681SAndroid Build Coastguard Workerentry: 1656*9880d681SAndroid Build Coastguard Worker %x = alloca [2 x i8*] 1657*9880d681SAndroid Build Coastguard Worker %y = alloca i128 1658*9880d681SAndroid Build Coastguard Worker %x1 = bitcast [2 x i8*]* %x to i8** 1659*9880d681SAndroid Build Coastguard Worker %x2 = bitcast i8** %x1 to i128* 1660*9880d681SAndroid Build Coastguard Worker %y1 = bitcast i128* %y to i8** 1661*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i128(i128* %x2) 1662*9880d681SAndroid Build Coastguard Worker call void @scribble_on_i128(i128* %y) 1663*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %x1 1664*9880d681SAndroid Build Coastguard Worker store i8* %tmp, i8** %y1 1665*9880d681SAndroid Build Coastguard Worker %p = select i1 %flag, i128* %x2, i128* %y 1666*9880d681SAndroid Build Coastguard Worker %v = load i128, i128* %p 1667*9880d681SAndroid Build Coastguard Worker ret i128 %v 1668*9880d681SAndroid Build Coastguard Worker} 1669*9880d681SAndroid Build Coastguard Worker 1670*9880d681SAndroid Build Coastguard Workerdefine i32 @test_select_select0(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) { 1671*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: @test_select_select0( 1672*9880d681SAndroid Build Coastguard Worker ; CHECK: %[[C0:.*]] = icmp sge i32 %a, %v1 1673*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: %[[C1:.*]] = icmp slt i32 %a, %v2 1674*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: %[[C:.*]] = and i1 %[[C1]], %[[C0]] 1675*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: %[[SEL:.*]] = select i1 %[[C]], i32 %r0, i32 %r1 1676*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret i32 %[[SEL]] 1677*9880d681SAndroid Build Coastguard Worker %c0 = icmp sge i32 %a, %v1 1678*9880d681SAndroid Build Coastguard Worker %s0 = select i1 %c0, i32 %r0, i32 %r1 1679*9880d681SAndroid Build Coastguard Worker %c1 = icmp slt i32 %a, %v2 1680*9880d681SAndroid Build Coastguard Worker %s1 = select i1 %c1, i32 %s0, i32 %r1 1681*9880d681SAndroid Build Coastguard Worker ret i32 %s1 1682*9880d681SAndroid Build Coastguard Worker} 1683*9880d681SAndroid Build Coastguard Worker 1684*9880d681SAndroid Build Coastguard Workerdefine i32 @test_select_select1(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) { 1685*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: @test_select_select1( 1686*9880d681SAndroid Build Coastguard Worker ; CHECK: %[[C0:.*]] = icmp sge i32 %a, %v1 1687*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: %[[C1:.*]] = icmp slt i32 %a, %v2 1688*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: %[[C:.*]] = or i1 %[[C1]], %[[C0]] 1689*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: %[[SEL:.*]] = select i1 %[[C]], i32 %r0, i32 %r1 1690*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret i32 %[[SEL]] 1691*9880d681SAndroid Build Coastguard Worker %c0 = icmp sge i32 %a, %v1 1692*9880d681SAndroid Build Coastguard Worker %s0 = select i1 %c0, i32 %r0, i32 %r1 1693*9880d681SAndroid Build Coastguard Worker %c1 = icmp slt i32 %a, %v2 1694*9880d681SAndroid Build Coastguard Worker %s1 = select i1 %c1, i32 %r0, i32 %s0 1695*9880d681SAndroid Build Coastguard Worker ret i32 %s1 1696*9880d681SAndroid Build Coastguard Worker} 1697*9880d681SAndroid Build Coastguard Worker 1698*9880d681SAndroid Build Coastguard Workerdefine i32 @test_max_of_min(i32 %a) { 1699*9880d681SAndroid Build Coastguard Worker; MAX(MIN(%a, -1), -1) == -1 1700*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_max_of_min( 1701*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 -1 1702*9880d681SAndroid Build Coastguard Worker %not_a = xor i32 %a, -1 1703*9880d681SAndroid Build Coastguard Worker %c0 = icmp sgt i32 %a, 0 1704*9880d681SAndroid Build Coastguard Worker %s0 = select i1 %c0, i32 %not_a, i32 -1 1705*9880d681SAndroid Build Coastguard Worker %c1 = icmp sgt i32 %s0, -1 1706*9880d681SAndroid Build Coastguard Worker %s1 = select i1 %c1, i32 %s0, i32 -1 1707*9880d681SAndroid Build Coastguard Worker ret i32 %s1 1708*9880d681SAndroid Build Coastguard Worker} 1709*9880d681SAndroid Build Coastguard Worker 1710*9880d681SAndroid Build Coastguard Worker 1711*9880d681SAndroid Build Coastguard Workerdefine i32 @PR23757(i32 %x) { 1712*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR23757 1713*9880d681SAndroid Build Coastguard Worker; CHECK: %[[cmp:.*]] = icmp eq i32 %x, 2147483647 1714*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[add:.*]] = add nsw i32 %x, 1 1715*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[sel:.*]] = select i1 %[[cmp]], i32 -2147483648, i32 %[[add]] 1716*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[sel]] 1717*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %x, 2147483647 1718*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %x, 1 1719*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 -2147483648, i32 %add 1720*9880d681SAndroid Build Coastguard Worker ret i32 %sel 1721*9880d681SAndroid Build Coastguard Worker} 1722*9880d681SAndroid Build Coastguard Worker 1723*9880d681SAndroid Build Coastguard Worker 1724*9880d681SAndroid Build Coastguard Workerdefine i32 @PR27137(i32 %a) { 1725*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR27137( 1726*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %not_a = xor i32 %a, -1 1727*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %c0 = icmp slt i32 %a, 0 1728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %s0 = select i1 %c0, i32 %not_a, i32 -1 1729*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %c1 = icmp sgt i32 %s0, -1 1730*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %s1 = select i1 %c1, i32 %s0, i32 -1 1731*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %s1 1732*9880d681SAndroid Build Coastguard Worker 1733*9880d681SAndroid Build Coastguard Worker %not_a = xor i32 %a, -1 1734*9880d681SAndroid Build Coastguard Worker %c0 = icmp slt i32 %a, 0 1735*9880d681SAndroid Build Coastguard Worker %s0 = select i1 %c0, i32 %not_a, i32 -1 1736*9880d681SAndroid Build Coastguard Worker %c1 = icmp sgt i32 %s0, -1 1737*9880d681SAndroid Build Coastguard Worker %s1 = select i1 %c1, i32 %s0, i32 -1 1738*9880d681SAndroid Build Coastguard Worker ret i32 %s1 1739*9880d681SAndroid Build Coastguard Worker} 1740