1*9880d681SAndroid Build Coastguard Worker; This test makes sure that mul instructions are properly eliminated. 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 6*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 1 ; <i32> [#uses=1] 7*9880d681SAndroid Build Coastguard Worker ret i32 %B 8*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %A 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 13*9880d681SAndroid Build Coastguard Worker ; Should convert to an add instruction 14*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 2 ; <i32> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker ret i32 %B 16*9880d681SAndroid Build Coastguard Worker; CHECK: shl i32 %A, 1 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 21*9880d681SAndroid Build Coastguard Worker ; This should disappear entirely 22*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 0 ; <i32> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker ret i32 %B 24*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine double @test4(double %A) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 29*9880d681SAndroid Build Coastguard Worker ; This is safe for FP 30*9880d681SAndroid Build Coastguard Worker %B = fmul double 1.000000e+00, %A ; <double> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker ret double %B 32*9880d681SAndroid Build Coastguard Worker; CHECK: ret double %A 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 37*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 8 ; <i32> [#uses=1] 38*9880d681SAndroid Build Coastguard Worker ret i32 %B 39*9880d681SAndroid Build Coastguard Worker; CHECK: shl i32 %A, 3 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine i8 @test6(i8 %A) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 44*9880d681SAndroid Build Coastguard Worker %B = mul i8 %A, 8 ; <i8> [#uses=1] 45*9880d681SAndroid Build Coastguard Worker %C = mul i8 %B, 8 ; <i8> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker ret i8 %C 47*9880d681SAndroid Build Coastguard Worker; CHECK: shl i8 %A, 6 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %i) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 52*9880d681SAndroid Build Coastguard Worker %tmp = mul i32 %i, -1 ; <i32> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 54*9880d681SAndroid Build Coastguard Worker; CHECK: sub i32 0, %i 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i64 @test8(i64 %i) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 59*9880d681SAndroid Build Coastguard Worker %j = mul i64 %i, -1 ; <i64> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker ret i64 %j 61*9880d681SAndroid Build Coastguard Worker; CHECK: sub i64 0, %i 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %i) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 66*9880d681SAndroid Build Coastguard Worker %j = mul i32 %i, -1 ; <i32> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker ret i32 %j 68*9880d681SAndroid Build Coastguard Worker; CHECK: sub i32 0, %i 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %a, i32 %b) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 73*9880d681SAndroid Build Coastguard Worker %c = icmp slt i32 %a, 0 ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %d = zext i1 %c to i32 ; <i32> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker ; e = b & (a >> 31) 76*9880d681SAndroid Build Coastguard Worker %e = mul i32 %d, %b ; <i32> [#uses=1] 77*9880d681SAndroid Build Coastguard Worker ret i32 %e 78*9880d681SAndroid Build Coastguard Worker; CHECK: [[TEST10:%.*]] = ashr i32 %a, 31 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %e = and i32 [[TEST10]], %b 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %e 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %a, i32 %b) { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 85*9880d681SAndroid Build Coastguard Worker %c = icmp sle i32 %a, -1 ; <i1> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker %d = zext i1 %c to i32 ; <i32> [#uses=1] 87*9880d681SAndroid Build Coastguard Worker ; e = b & (a >> 31) 88*9880d681SAndroid Build Coastguard Worker %e = mul i32 %d, %b ; <i32> [#uses=1] 89*9880d681SAndroid Build Coastguard Worker ret i32 %e 90*9880d681SAndroid Build Coastguard Worker; CHECK: [[TEST11:%.*]] = ashr i32 %a, 31 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %e = and i32 [[TEST11]], %b 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %e 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %a, i32 %b) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 97*9880d681SAndroid Build Coastguard Worker %c = icmp ugt i32 %a, 2147483647 ; <i1> [#uses=1] 98*9880d681SAndroid Build Coastguard Worker %d = zext i1 %c to i32 ; <i32> [#uses=1] 99*9880d681SAndroid Build Coastguard Worker %e = mul i32 %d, %b ; <i32> [#uses=1] 100*9880d681SAndroid Build Coastguard Worker ret i32 %e 101*9880d681SAndroid Build Coastguard Worker; CHECK: [[TEST12:%.*]] = ashr i32 %a, 31 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %e = and i32 [[TEST12]], %b 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %e 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; PR2642 108*9880d681SAndroid Build Coastguard Workerdefine internal void @test13(<4 x float>*) { 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 110*9880d681SAndroid Build Coastguard Worker load <4 x float>, <4 x float>* %0, align 1 111*9880d681SAndroid Build Coastguard Worker fmul <4 x float> %2, < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 > 112*9880d681SAndroid Build Coastguard Worker store <4 x float> %3, <4 x float>* %0, align 1 113*9880d681SAndroid Build Coastguard Worker ret void 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test14(<16 x i8> %a) { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 119*9880d681SAndroid Build Coastguard Worker %b = mul <16 x i8> %a, zeroinitializer 120*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %b 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> zeroinitializer 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; rdar://7293527 125*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %A, i32 %B) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 127*9880d681SAndroid Build Coastguard Workerentry: 128*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %B 129*9880d681SAndroid Build Coastguard Worker %m = mul i32 %shl, %A 130*9880d681SAndroid Build Coastguard Worker ret i32 %m 131*9880d681SAndroid Build Coastguard Worker; CHECK: shl i32 %A, %B 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; X * Y (when Y is 0 or 1) --> x & (0-Y) 135*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i32 %b, i1 %c) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 137*9880d681SAndroid Build Coastguard Worker %d = zext i1 %c to i32 ; <i32> [#uses=1] 138*9880d681SAndroid Build Coastguard Worker ; e = b & (a >> 31) 139*9880d681SAndroid Build Coastguard Worker %e = mul i32 %d, %b ; <i32> [#uses=1] 140*9880d681SAndroid Build Coastguard Worker ret i32 %e 141*9880d681SAndroid Build Coastguard Worker; CHECK: [[TEST16:%.*]] = select i1 %c, i32 %b, i32 0 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TEST16]] 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; X * Y (when Y is 0 or 1) --> x & (0-Y) 146*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(i32 %a, i32 %b) { 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 148*9880d681SAndroid Build Coastguard Worker %a.lobit = lshr i32 %a, 31 149*9880d681SAndroid Build Coastguard Worker %e = mul i32 %a.lobit, %b 150*9880d681SAndroid Build Coastguard Worker ret i32 %e 151*9880d681SAndroid Build Coastguard Worker; CHECK: [[TEST17:%.*]] = ashr i32 %a, 31 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %e = and i32 [[TEST17]], %b 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %e 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine i32 @test18(i32 %A, i32 %B) { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 158*9880d681SAndroid Build Coastguard Worker %C = and i32 %A, 1 159*9880d681SAndroid Build Coastguard Worker %D = and i32 %B, 1 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker %E = mul i32 %C, %D 162*9880d681SAndroid Build Coastguard Worker %F = and i32 %E, 16 163*9880d681SAndroid Build Coastguard Worker ret i32 %F 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdeclare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) 168*9880d681SAndroid Build Coastguard Workerdeclare void @use(i1) 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %A, i32 %B) { 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 172*9880d681SAndroid Build Coastguard Worker %C = and i32 %A, 1 173*9880d681SAndroid Build Coastguard Worker %D = and i32 %B, 1 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; It would be nice if we also started proving that this doesn't overflow. 176*9880d681SAndroid Build Coastguard Worker %E = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %C, i32 %D) 177*9880d681SAndroid Build Coastguard Worker %F = extractvalue {i32, i1} %E, 0 178*9880d681SAndroid Build Coastguard Worker %G = extractvalue {i32, i1} %E, 1 179*9880d681SAndroid Build Coastguard Worker call void @use(i1 %G) 180*9880d681SAndroid Build Coastguard Worker %H = and i32 %F, 16 181*9880d681SAndroid Build Coastguard Worker ret i32 %H 182*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test20(<2 x i64> %A) { 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 187*9880d681SAndroid Build Coastguard Worker %B = add <2 x i64> %A, <i64 12, i64 14> 188*9880d681SAndroid Build Coastguard Worker %C = mul <2 x i64> %B, <i64 3, i64 2> 189*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %C 190*9880d681SAndroid Build Coastguard Worker; CHECK: mul <2 x i64> %A, <i64 3, i64 2> 191*9880d681SAndroid Build Coastguard Worker; CHECK: add <2 x i64> %{{.}}, <i64 36, i64 28> 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test21(<2 x i1> %A, <2 x i1> %B) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 196*9880d681SAndroid Build Coastguard Worker %C = mul <2 x i1> %A, %B 197*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %C 198*9880d681SAndroid Build Coastguard Worker; CHECK: %C = and <2 x i1> %A, %B 199*9880d681SAndroid Build Coastguard Worker} 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerdefine i32 @test22(i32 %A) { 202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22( 203*9880d681SAndroid Build Coastguard Worker %B = mul nsw i32 %A, -1 204*9880d681SAndroid Build Coastguard Worker ret i32 %B 205*9880d681SAndroid Build Coastguard Worker; CHECK: sub nsw i32 0, %A 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerdefine i32 @test23(i32 %A) { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 210*9880d681SAndroid Build Coastguard Worker %B = shl nuw i32 %A, 1 211*9880d681SAndroid Build Coastguard Worker %C = mul nuw i32 %B, 3 212*9880d681SAndroid Build Coastguard Worker ret i32 %C 213*9880d681SAndroid Build Coastguard Worker; CHECK: mul nuw i32 %A, 6 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine i32 @test24(i32 %A) { 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 218*9880d681SAndroid Build Coastguard Worker %B = shl nsw i32 %A, 1 219*9880d681SAndroid Build Coastguard Worker %C = mul nsw i32 %B, 3 220*9880d681SAndroid Build Coastguard Worker ret i32 %C 221*9880d681SAndroid Build Coastguard Worker; CHECK: mul nsw i32 %A, 6 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerdefine i32 @test25(i32 %A, i32 %B) { 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25( 226*9880d681SAndroid Build Coastguard Worker %C = sub nsw i32 0, %A 227*9880d681SAndroid Build Coastguard Worker %D = sub nsw i32 0, %B 228*9880d681SAndroid Build Coastguard Worker %E = mul nsw i32 %C, %D 229*9880d681SAndroid Build Coastguard Worker ret i32 %E 230*9880d681SAndroid Build Coastguard Worker; CHECK: mul nsw i32 %A, %B 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(i32 %A, i32 %B) { 234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26( 235*9880d681SAndroid Build Coastguard Worker %C = shl nsw i32 1, %B 236*9880d681SAndroid Build Coastguard Worker %D = mul nsw i32 %A, %C 237*9880d681SAndroid Build Coastguard Worker ret i32 %D 238*9880d681SAndroid Build Coastguard Worker; CHECK: shl nsw i32 %A, %B 239*9880d681SAndroid Build Coastguard Worker} 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerdefine i32 @test27(i32 %A, i32 %B) { 242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27( 243*9880d681SAndroid Build Coastguard Worker %C = shl i32 1, %B 244*9880d681SAndroid Build Coastguard Worker %D = mul nuw i32 %A, %C 245*9880d681SAndroid Build Coastguard Worker ret i32 %D 246*9880d681SAndroid Build Coastguard Worker; CHECK: shl nuw i32 %A, %B 247*9880d681SAndroid Build Coastguard Worker} 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Workerdefine i32 @test28(i32 %A) { 250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28( 251*9880d681SAndroid Build Coastguard Worker %B = shl i32 1, %A 252*9880d681SAndroid Build Coastguard Worker %C = mul nsw i32 %B, %B 253*9880d681SAndroid Build Coastguard Worker ret i32 %C 254*9880d681SAndroid Build Coastguard Worker; CHECK: %[[shl1:.*]] = shl i32 1, %A 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[shl2:.*]] = shl i32 %[[shl1]], %A 256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[shl2]] 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine i64 @test29(i31 %A, i31 %B) { 260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29( 261*9880d681SAndroid Build Coastguard Worker %C = sext i31 %A to i64 262*9880d681SAndroid Build Coastguard Worker %D = sext i31 %B to i64 263*9880d681SAndroid Build Coastguard Worker %E = mul i64 %C, %D 264*9880d681SAndroid Build Coastguard Worker ret i64 %E 265*9880d681SAndroid Build Coastguard Worker; CHECK: %[[sext1:.*]] = sext i31 %A to i64 266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[sext2:.*]] = sext i31 %B to i64 267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[mul:.*]] = mul nsw i64 %[[sext1]], %[[sext2]] 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %[[mul]] 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerdefine i64 @test30(i32 %A, i32 %B) { 272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30( 273*9880d681SAndroid Build Coastguard Worker %C = zext i32 %A to i64 274*9880d681SAndroid Build Coastguard Worker %D = zext i32 %B to i64 275*9880d681SAndroid Build Coastguard Worker %E = mul i64 %C, %D 276*9880d681SAndroid Build Coastguard Worker ret i64 %E 277*9880d681SAndroid Build Coastguard Worker; CHECK: %[[zext1:.*]] = zext i32 %A to i64 278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[zext2:.*]] = zext i32 %B to i64 279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[mul:.*]] = mul nuw i64 %[[zext1]], %[[zext2]] 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %[[mul]] 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker@PR22087 = external global i32 284*9880d681SAndroid Build Coastguard Workerdefine i32 @test31(i32 %V) { 285*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31 286*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %V, shl (i32 1, i32 zext (i1 icmp ne (i32* inttoptr (i64 1 to i32*), i32* @PR22087) to i32)) 287*9880d681SAndroid Build Coastguard Worker ret i32 %mul 288*9880d681SAndroid Build Coastguard Worker; CHECK: %[[mul:.*]] = shl i32 %V, zext (i1 icmp ne (i32* inttoptr (i64 1 to i32*), i32* @PR22087) to i32) 289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[mul]] 290*9880d681SAndroid Build Coastguard Worker} 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Workerdefine i32 @test32(i32 %X) { 293*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32 294*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %X, -2147483648 295*9880d681SAndroid Build Coastguard Worker ret i32 %mul 296*9880d681SAndroid Build Coastguard Worker; CHECK: %[[shl:.*]] = shl i32 %X, 31 297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[shl]] 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdefine i32 @test33(i32 %X) { 301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33 302*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %X, 1073741824 303*9880d681SAndroid Build Coastguard Worker; CHECK: %[[shl:.*]] = shl nsw i32 %X, 30 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[shl]] 305*9880d681SAndroid Build Coastguard Worker ret i32 %mul 306*9880d681SAndroid Build Coastguard Worker} 307