1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARM 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-darwin -mcpu=cortex-a9 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARM 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7m-none-eabi | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-THUMB 4*9880d681SAndroid Build Coastguard Worker; rdar://8576755 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %X, i32 %Y, i8 %sh) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 9*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: add r0, r0, r1, lsl r2 10*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: lsls r1, r2 11*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: add r0, r1 12*9880d681SAndroid Build Coastguard Worker %shift.upgrd.1 = zext i8 %sh to i32 13*9880d681SAndroid Build Coastguard Worker %A = shl i32 %Y, %shift.upgrd.1 14*9880d681SAndroid Build Coastguard Worker %B = add i32 %X, %A 15*9880d681SAndroid Build Coastguard Worker ret i32 %B 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %X, i32 %Y, i8 %sh) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 20*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: bic r0, r0, r1, asr r2 21*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: asrs r1, r2 22*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bics r0, r1 23*9880d681SAndroid Build Coastguard Worker %shift.upgrd.2 = zext i8 %sh to i32 24*9880d681SAndroid Build Coastguard Worker %A = ashr i32 %Y, %shift.upgrd.2 25*9880d681SAndroid Build Coastguard Worker %B = xor i32 %A, -1 26*9880d681SAndroid Build Coastguard Worker %C = and i32 %X, %B 27*9880d681SAndroid Build Coastguard Worker ret i32 %C 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %base, i32 %base2, i32 %offset) { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 33*9880d681SAndroid Build Coastguard Worker; CHECK: ldr{{(.w)?}} r0, [r0, r2, lsl #2] 34*9880d681SAndroid Build Coastguard Worker; CHECK: ldr{{(.w)?}} r1, [r1, r2, lsl #2] 35*9880d681SAndroid Build Coastguard Worker %tmp1 = shl i32 %offset, 2 36*9880d681SAndroid Build Coastguard Worker %tmp2 = add i32 %base, %tmp1 37*9880d681SAndroid Build Coastguard Worker %tmp3 = inttoptr i32 %tmp2 to i32* 38*9880d681SAndroid Build Coastguard Worker %tmp4 = add i32 %base2, %tmp1 39*9880d681SAndroid Build Coastguard Worker %tmp5 = inttoptr i32 %tmp4 to i32* 40*9880d681SAndroid Build Coastguard Worker %tmp6 = load i32, i32* %tmp3 41*9880d681SAndroid Build Coastguard Worker %tmp7 = load i32, i32* %tmp5 42*9880d681SAndroid Build Coastguard Worker %tmp8 = add i32 %tmp7, %tmp6 43*9880d681SAndroid Build Coastguard Worker ret i32 %tmp8 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdeclare i8* @malloc(...) 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine fastcc void @test4(i16 %addr) nounwind { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 51*9880d681SAndroid Build Coastguard Worker; CHECK: ldr{{(.w)?}} [[REG:r[0-9]+]], [r0, r1, lsl #2] 52*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldr{{(.w)?}} [[REG:r[0-9]+]], [r0, r1, lsl #2]! 53*9880d681SAndroid Build Coastguard Worker; CHECK: str{{(.w)?}} [[REG]], [r0, r1, lsl #2] 54*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: str{{(.w)?}} [[REG]], [r0] 55*9880d681SAndroid Build Coastguard Worker %0 = tail call i8* (...) @malloc(i32 undef) nounwind 56*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8* %0 to i32* 57*9880d681SAndroid Build Coastguard Worker %2 = sext i16 %addr to i32 58*9880d681SAndroid Build Coastguard Worker %3 = getelementptr inbounds i32, i32* %1, i32 %2 59*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* %3, align 4 60*9880d681SAndroid Build Coastguard Worker %5 = add nsw i32 %4, 1 61*9880d681SAndroid Build Coastguard Worker store i32 %5, i32* %3, align 4 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @test_orr_extract_from_mul_1(i32 %x, i32 %y) { 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_orr_extract_from_mul_1 68*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 69*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 70*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: orr r0, r1, r0 71*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 72*9880d681SAndroid Build Coastguard Worker; CHECk-THUMB: orrs r0, r1 73*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %y, 63767 74*9880d681SAndroid Build Coastguard Worker %or = or i32 %mul, %x 75*9880d681SAndroid Build Coastguard Worker ret i32 %or 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32 @test_orr_extract_from_mul_2(i32 %x, i32 %y) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_orr_extract_from_mul_2 80*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 81*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 82*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 83*9880d681SAndroid Build Coastguard Worker; CHECK: orr{{(.w)?}} r0, r0, r1, lsl #1 84*9880d681SAndroid Build Coastguard Workerentry: 85*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 127534 86*9880d681SAndroid Build Coastguard Worker %or = or i32 %mul1, %x 87*9880d681SAndroid Build Coastguard Worker ret i32 %or 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i32 @test_orr_extract_from_mul_3(i32 %x, i32 %y) { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_orr_extract_from_mul_3 92*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 93*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 94*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 95*9880d681SAndroid Build Coastguard Worker; CHECK: orr{{(.w)?}} r0, r0, r1, lsl #2 96*9880d681SAndroid Build Coastguard Workerentry: 97*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 255068 98*9880d681SAndroid Build Coastguard Worker %or = or i32 %mul1, %x 99*9880d681SAndroid Build Coastguard Worker ret i32 %or 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine i32 @test_orr_extract_from_mul_4(i32 %x, i32 %y) { 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_orr_extract_from_mul_4 104*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 105*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 106*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 107*9880d681SAndroid Build Coastguard Worker; CHECK: orr{{(.w)?}} r0, r0, r1, lsl #3 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 510136 110*9880d681SAndroid Build Coastguard Worker %or = or i32 %mul1, %x 111*9880d681SAndroid Build Coastguard Worker ret i32 %or 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine i32 @test_orr_extract_from_mul_5(i32 %x, i32 %y) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_orr_extract_from_mul_5 116*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 117*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 118*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 119*9880d681SAndroid Build Coastguard Worker; CHECK: orr{{(.w)?}} r0, r0, r1, lsl #4 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 1020272 122*9880d681SAndroid Build Coastguard Worker %or = or i32 %mul1, %x 123*9880d681SAndroid Build Coastguard Worker ret i32 %or 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i32 @test_orr_extract_from_mul_6(i32 %x, i32 %y) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_orr_extract_from_mul_6 128*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 129*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 130*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 131*9880d681SAndroid Build Coastguard Worker; CHECK: orr{{(.w)?}} r0, r0, r1, lsl #16 132*9880d681SAndroid Build Coastguard Workerentry: 133*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %y, -115933184 134*9880d681SAndroid Build Coastguard Worker %or = or i32 %mul, %x 135*9880d681SAndroid Build Coastguard Worker ret i32 %or 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine i32 @test_load_extract_from_mul_1(i8* %x, i32 %y) { 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_extract_from_mul_1 140*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 141*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 142*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 143*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb r0, [r0, r1] 144*9880d681SAndroid Build Coastguard Workerentry: 145*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %y, 63767 146*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %x, i32 %mul 147*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx, align 1 148*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %0 to i32 149*9880d681SAndroid Build Coastguard Worker ret i32 %conv 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine i32 @test_load_extract_from_mul_2(i8* %x, i32 %y) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_extract_from_mul_2 154*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 155*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 156*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 157*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb{{(.w)?}} r0, [r0, r1, lsl #1] 158*9880d681SAndroid Build Coastguard Workerentry: 159*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 127534 160*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %x, i32 %mul1 161*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx, align 1 162*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %0 to i32 163*9880d681SAndroid Build Coastguard Worker ret i32 %conv 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine i32 @test_load_extract_from_mul_3(i8* %x, i32 %y) { 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_extract_from_mul_3 168*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 169*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 170*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 171*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb{{(.w)?}} r0, [r0, r1, lsl #2] 172*9880d681SAndroid Build Coastguard Workerentry: 173*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 255068 174*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %x, i32 %mul1 175*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx, align 1 176*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %0 to i32 177*9880d681SAndroid Build Coastguard Worker ret i32 %conv 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerdefine i32 @test_load_extract_from_mul_4(i8* %x, i32 %y) { 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_extract_from_mul_4 182*9880d681SAndroid Build Coastguard Worker; CHECK: movw r2, #63767 183*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 184*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 185*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb{{(.w)?}} r0, [r0, r1, lsl #3] 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 510136 188*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %x, i32 %mul1 189*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx, align 1 190*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %0 to i32 191*9880d681SAndroid Build Coastguard Worker ret i32 %conv 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i32 @test_load_extract_from_mul_5(i8* %x, i32 %y) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_extract_from_mul_5 196*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: movw r2, #63767 197*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 198*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: ldrb r0, [r0, r1, lsl #4] 199*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movw r2, #37232 200*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movt r2, #15 201*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 202*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrb r0, [r0, r1] 203*9880d681SAndroid Build Coastguard Workerentry: 204*9880d681SAndroid Build Coastguard Worker %mul1 = mul i32 %y, 1020272 205*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %x, i32 %mul1 206*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx, align 1 207*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %0 to i32 208*9880d681SAndroid Build Coastguard Worker ret i32 %conv 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerdefine i32 @test_load_extract_from_mul_6(i8* %x, i32 %y) { 212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_extract_from_mul_6 213*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: movw r2, #63767 214*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul r1, r1, r2 215*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: ldrb r0, [r0, r1, lsl #16] 216*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movs r2, #0 217*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movt r2, #63767 218*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: muls r1, r2, r1 219*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrb r0, [r0, r1] 220*9880d681SAndroid Build Coastguard Workerentry: 221*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %y, -115933184 222*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %x, i32 %mul 223*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx, align 1 224*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %0 to i32 225*9880d681SAndroid Build Coastguard Worker ret i32 %conv 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdefine void @test_well_formed_dag(i32 %in1, i32 %in2, i32* %addr) { 230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_well_formed_dag: 231*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: movw [[SMALL_CONST:r[0-9]+]], #675 232*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: mul [[SMALL_PROD:r[0-9]+]], r0, [[SMALL_CONST]] 233*9880d681SAndroid Build Coastguard Worker; CHECK-ARM: add {{r[0-9]+}}, r1, [[SMALL_PROD]], lsl #7 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker %mul.small = mul i32 %in1, 675 236*9880d681SAndroid Build Coastguard Worker store i32 %mul.small, i32* %addr 237*9880d681SAndroid Build Coastguard Worker %mul.big = mul i32 %in1, 86400 238*9880d681SAndroid Build Coastguard Worker %add = add i32 %in2, %mul.big 239*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %addr 240*9880d681SAndroid Build Coastguard Worker ret void 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine { i32, i32 } @test_multi_use_add(i32 %base, i32 %offset) { 244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_multi_use_add: 245*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movs [[CONST:r[0-9]+]], #28 246*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movt [[CONST]], #1 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker %prod = mul i32 %offset, 65564 249*9880d681SAndroid Build Coastguard Worker %sum = add i32 %base, %prod 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i32 %sum to i32* 252*9880d681SAndroid Build Coastguard Worker %loaded = load i32, i32* %ptr 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker %ret.tmp = insertvalue { i32, i32 } undef, i32 %sum, 0 255*9880d681SAndroid Build Coastguard Worker %ret = insertvalue { i32, i32 } %ret.tmp, i32 %loaded, 1 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker ret { i32, i32 } %ret 258*9880d681SAndroid Build Coastguard Worker} 259