1*9880d681SAndroid Build Coastguard Worker; This test makes sure that rem instructions are properly eliminated. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker; END. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 9*9880d681SAndroid Build Coastguard Worker %B = srem i32 %A, 1 ; ISA constant 0 10*9880d681SAndroid Build Coastguard Worker ret i32 %B 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A) { ; 0 % X = 0, we don't need to preserve traps 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 16*9880d681SAndroid Build Coastguard Worker %B = srem i32 0, %A 17*9880d681SAndroid Build Coastguard Worker ret i32 %B 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A) { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %A, 7 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]] 24*9880d681SAndroid Build Coastguard Worker %B = urem i32 %A, 8 25*9880d681SAndroid Build Coastguard Worker ret i32 %B 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vec_power_of_2_constant_splat_divisor(<2 x i32> %A) { 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_power_of_2_constant_splat_divisor( 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and <2 x i32> %A, <i32 7, i32 7> 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> [[B]] 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Worker %B = urem <2 x i32> %A, <i32 8, i32 8> 34*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %B 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine <2 x i19> @weird_vec_power_of_2_constant_splat_divisor(<2 x i19> %A) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @weird_vec_power_of_2_constant_splat_divisor( 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = and <2 x i19> %A, <i19 7, i19 7> 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i19> [[B]] 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker %B = urem <2 x i19> %A, <i19 8, i19 8> 43*9880d681SAndroid Build Coastguard Worker ret <2 x i19> %B 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i1 @test3a(i32 %A) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3a( 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %A, 7 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[CMP]] 51*9880d681SAndroid Build Coastguard Worker %B = srem i32 %A, -8 52*9880d681SAndroid Build Coastguard Worker %C = icmp ne i32 %B, 0 53*9880d681SAndroid Build Coastguard Worker ret i1 %C 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %X, i1 %C) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL:%.*]] = select i1 %C, i32 0, i32 7 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[SEL]], %X 60*9880d681SAndroid Build Coastguard Worker %V = select i1 %C, i32 1, i32 8 61*9880d681SAndroid Build Coastguard Worker %R = urem i32 %X, %V 62*9880d681SAndroid Build Coastguard Worker ret i32 %R 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %X, i8 %B) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 %B to i32 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 32, [[ZEXT]] 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SHL]], -1 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[ADD]], %X 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]] 72*9880d681SAndroid Build Coastguard Worker %shift.upgrd.1 = zext i8 %B to i32 73*9880d681SAndroid Build Coastguard Worker %Amt = shl i32 32, %shift.upgrd.1 74*9880d681SAndroid Build Coastguard Worker %V = urem i32 %X, %Amt 75*9880d681SAndroid Build Coastguard Worker ret i32 %V 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef 81*9880d681SAndroid Build Coastguard Worker %B = srem i32 %A, 0 ;; undef 82*9880d681SAndroid Build Coastguard Worker ret i32 %B 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 88*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 8 89*9880d681SAndroid Build Coastguard Worker %C = srem i32 %B, 4 90*9880d681SAndroid Build Coastguard Worker ret i32 %C 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %A) { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 96*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 4 97*9880d681SAndroid Build Coastguard Worker %C = srem i32 %B, 8 98*9880d681SAndroid Build Coastguard Worker ret i32 %C 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %A) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 104*9880d681SAndroid Build Coastguard Worker %B = mul i32 %A, 64 105*9880d681SAndroid Build Coastguard Worker %C = urem i32 %B, 32 106*9880d681SAndroid Build Coastguard Worker ret i32 %C 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i8 %c) { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 112*9880d681SAndroid Build Coastguard Worker %tmp.1 = zext i8 %c to i32 113*9880d681SAndroid Build Coastguard Worker %tmp.2 = mul i32 %tmp.1, 4 114*9880d681SAndroid Build Coastguard Worker %tmp.3 = sext i32 %tmp.2 to i64 115*9880d681SAndroid Build Coastguard Worker %tmp.5 = urem i64 %tmp.3, 4 116*9880d681SAndroid Build Coastguard Worker %tmp.6 = trunc i64 %tmp.5 to i32 117*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.6 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %i) { 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 123*9880d681SAndroid Build Coastguard Worker %tmp.1 = and i32 %i, -2 124*9880d681SAndroid Build Coastguard Worker %tmp.3 = mul i32 %tmp.1, 2 125*9880d681SAndroid Build Coastguard Worker %tmp.5 = urem i32 %tmp.3, 4 126*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.5 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %i) { 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 132*9880d681SAndroid Build Coastguard Worker %tmp.1 = and i32 %i, -4 133*9880d681SAndroid Build Coastguard Worker %tmp.5 = srem i32 %tmp.1, 2 134*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.5 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %i) { 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 140*9880d681SAndroid Build Coastguard Worker %x = srem i32 %i, %i 141*9880d681SAndroid Build Coastguard Worker ret i32 %x 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine i64 @test14(i64 %x, i32 %y) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl i32 1, %y 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[SHL]] to i64 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[ZEXT]], -1 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i64 [[ADD]], %x 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[AND]] 151*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %y 152*9880d681SAndroid Build Coastguard Worker %zext = zext i32 %shl to i64 153*9880d681SAndroid Build Coastguard Worker %urem = urem i64 %x, %zext 154*9880d681SAndroid Build Coastguard Worker ret i64 %urem 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdefine i64 @test15(i32 %x, i32 %y) { 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 1, %y 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SHL]], -1 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[ADD]], %x 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[AND]] to i64 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[ZEXT]] 164*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %y 165*9880d681SAndroid Build Coastguard Worker %zext0 = zext i32 %shl to i64 166*9880d681SAndroid Build Coastguard Worker %zext1 = zext i32 %x to i64 167*9880d681SAndroid Build Coastguard Worker %urem = urem i64 %zext1, %zext0 168*9880d681SAndroid Build Coastguard Worker ret i64 %urem 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i32 %x, i32 %y) { 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR:%.*]] = lshr i32 %y, 11 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[SHR]], 4 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[AND]], 3 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM:%.*]] = and i32 [[OR]], %x 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[REM]] 178*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %y, 11 179*9880d681SAndroid Build Coastguard Worker %and = and i32 %shr, 4 180*9880d681SAndroid Build Coastguard Worker %add = add i32 %and, 4 181*9880d681SAndroid Build Coastguard Worker %rem = urem i32 %x, %add 182*9880d681SAndroid Build Coastguard Worker ret i32 %rem 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(i32 %X) { 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %X, 1 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext i1 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 190*9880d681SAndroid Build Coastguard Worker %A = urem i32 1, %X 191*9880d681SAndroid Build Coastguard Worker ret i32 %A 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i32 @test18(i16 %x, i32 %y) { 195*9880d681SAndroid Build Coastguard Worker; CHECK: @test18 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i16 %x, 4 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[AND]] to i32 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[EXT]], 3 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[SHL]], 63 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM:%.*]] = and i32 [[XOR]], %y 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[REM]] 202*9880d681SAndroid Build Coastguard Worker %1 = and i16 %x, 4 203*9880d681SAndroid Build Coastguard Worker %2 = icmp ne i16 %1, 0 204*9880d681SAndroid Build Coastguard Worker %3 = select i1 %2, i32 32, i32 64 205*9880d681SAndroid Build Coastguard Worker %4 = urem i32 %y, %3 206*9880d681SAndroid Build Coastguard Worker ret i32 %4 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %x, i32 %y) { 210*9880d681SAndroid Build Coastguard Worker; CHECK: @test19 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL1:%.*]] = shl i32 1, %x 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL2:%.*]] = shl i32 1, %y 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[SHL1]], [[SHL2]] 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 [[AND]], [[SHL1]] 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SUB:%.*]] = add i32 [[ADD]], -1 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM:%.*]] = and i32 [[SUB]], %y 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[REM]] 218*9880d681SAndroid Build Coastguard Worker %A = shl i32 1, %x 219*9880d681SAndroid Build Coastguard Worker %B = shl i32 1, %y 220*9880d681SAndroid Build Coastguard Worker %C = and i32 %A, %B 221*9880d681SAndroid Build Coastguard Worker %D = add i32 %C, %A 222*9880d681SAndroid Build Coastguard Worker %E = urem i32 %y, %D 223*9880d681SAndroid Build Coastguard Worker ret i32 %E 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test20(<2 x i64> %X, <2 x i1> %C) { 227*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select <2 x i1> %C, <2 x i64> <i64 1, i64 2>, <2 x i64> zeroinitializer 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> 230*9880d681SAndroid Build Coastguard Worker %V = select <2 x i1> %C, <2 x i64> <i64 1, i64 2>, <2 x i64> <i64 8, i64 9> 231*9880d681SAndroid Build Coastguard Worker %R = urem <2 x i64> %V, <i64 2, i64 3> 232*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %R 233*9880d681SAndroid Build Coastguard Worker} 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdefine i32 @test21(i1 %c0, i32* %val) { 236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %if.then, label %if.end 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerif.then: 241*9880d681SAndroid Build Coastguard Worker; CHECK: if.then: 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v = load volatile i32, i32* %val, align 4 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %phitmp = srem i32 %v, 5 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker %v = load volatile i32, i32* %val 246*9880d681SAndroid Build Coastguard Worker br label %if.end 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerif.end: 249*9880d681SAndroid Build Coastguard Worker; CHECK: if.end: 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %lhs = phi i32 [ %phitmp, %if.then ], [ 0, %entry ] 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %lhs 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ] 254*9880d681SAndroid Build Coastguard Worker %rem = srem i32 %lhs, 5 255*9880d681SAndroid Build Coastguard Worker ret i32 %rem 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker@a = common global [5 x i16] zeroinitializer, align 2 259*9880d681SAndroid Build Coastguard Worker@b = common global i16 0, align 2 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_0(i1 %c0, i32* %val) { 262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_0( 263*9880d681SAndroid Build Coastguard Workerentry: 264*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %if.then, label %if.end 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Workerif.then: 267*9880d681SAndroid Build Coastguard Worker %v = load volatile i32, i32* %val 268*9880d681SAndroid Build Coastguard Worker br label %if.end 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker; CHECK: if.then: 271*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: srem 272*9880d681SAndroid Build Coastguard Worker; CHECK: br label %if.end 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerif.end: 275*9880d681SAndroid Build Coastguard Worker %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ] 276*9880d681SAndroid Build Coastguard Worker br i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b), label %rem.is.safe, label %rem.is.unsafe 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerrem.is.safe: 279*9880d681SAndroid Build Coastguard Worker; CHECK: rem.is.safe: 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %rem = srem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32) 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %rem 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker %rem = srem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32) 284*9880d681SAndroid Build Coastguard Worker ret i32 %rem 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Workerrem.is.unsafe: 287*9880d681SAndroid Build Coastguard Worker ret i32 0 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_1(i1 %c0, i1 %always_false, i32* %val) { 291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_1( 292*9880d681SAndroid Build Coastguard Workerentry: 293*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %if.then, label %if.end 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerif.then: 296*9880d681SAndroid Build Coastguard Worker %v = load volatile i32, i32* %val 297*9880d681SAndroid Build Coastguard Worker br label %if.end 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker; CHECK: if.then: 300*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: srem 301*9880d681SAndroid Build Coastguard Worker; CHECK: br label %if.end 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Workerif.end: 304*9880d681SAndroid Build Coastguard Worker %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ] 305*9880d681SAndroid Build Coastguard Worker br i1 %always_false, label %rem.is.safe, label %rem.is.unsafe 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerrem.is.safe: 308*9880d681SAndroid Build Coastguard Worker %rem = srem i32 %lhs, -2147483648 309*9880d681SAndroid Build Coastguard Worker ret i32 %rem 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker; CHECK: rem.is.safe: 312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %rem = srem i32 %lhs, -2147483648 313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %rem 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Workerrem.is.unsafe: 316*9880d681SAndroid Build Coastguard Worker ret i32 0 317*9880d681SAndroid Build Coastguard Worker} 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_2(i1 %c0, i32* %val) { 320*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_2( 321*9880d681SAndroid Build Coastguard Workerentry: 322*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %if.then, label %if.end 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Workerif.then: 325*9880d681SAndroid Build Coastguard Worker %v = load volatile i32, i32* %val 326*9880d681SAndroid Build Coastguard Worker br label %if.end 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker; CHECK: if.then: 329*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: urem 330*9880d681SAndroid Build Coastguard Worker; CHECK: br label %if.end 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerif.end: 333*9880d681SAndroid Build Coastguard Worker %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ] 334*9880d681SAndroid Build Coastguard Worker br i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b), label %rem.is.safe, label %rem.is.unsafe 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Workerrem.is.safe: 337*9880d681SAndroid Build Coastguard Worker; CHECK: rem.is.safe: 338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %rem = urem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32) 339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %rem 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker %rem = urem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32) 342*9880d681SAndroid Build Coastguard Worker ret i32 %rem 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerrem.is.unsafe: 345*9880d681SAndroid Build Coastguard Worker ret i32 0 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_3(i1 %c0, i1 %always_false, i32* %val) { 349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_3( 350*9880d681SAndroid Build Coastguard Workerentry: 351*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %if.then, label %if.end 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerif.then: 354*9880d681SAndroid Build Coastguard Worker %v = load volatile i32, i32* %val 355*9880d681SAndroid Build Coastguard Worker br label %if.end 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker; CHECK: if.then: 358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %v = load volatile i32, i32* %val, align 4 359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %phitmp = and i32 %v, 2147483647 360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %if.end 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerif.end: 363*9880d681SAndroid Build Coastguard Worker %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ] 364*9880d681SAndroid Build Coastguard Worker br i1 %always_false, label %rem.is.safe, label %rem.is.unsafe 365*9880d681SAndroid Build Coastguard Worker 366*9880d681SAndroid Build Coastguard Workerrem.is.safe: 367*9880d681SAndroid Build Coastguard Worker %rem = urem i32 %lhs, -2147483648 368*9880d681SAndroid Build Coastguard Worker ret i32 %rem 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Workerrem.is.unsafe: 371*9880d681SAndroid Build Coastguard Worker ret i32 0 372*9880d681SAndroid Build Coastguard Worker} 373