@@ -1278,3 +1278,115 @@ define <4 x i32> @or_tree_with_mismatching_shifts_vec_i32(<4 x i32> %a, <4 x i32
12781278 %r = or <4 x i32 > %or.ab , %or.cd
12791279 ret <4 x i32 > %r
12801280}
1281+
1282+ define arm_aapcscc i32 @test_shift15_and510 (ptr nocapture %p ) {
1283+ ; CHECK-ARM-LABEL: test_shift15_and510:
1284+ ; CHECK-ARM: @ %bb.0: @ %entry
1285+ ; CHECK-ARM-NEXT: ldrb r0, [r0, #2]
1286+ ; CHECK-ARM-NEXT: lsl r0, r0, #1
1287+ ; CHECK-ARM-NEXT: bx lr
1288+ ;
1289+ ; CHECK-BE-LABEL: test_shift15_and510:
1290+ ; CHECK-BE: @ %bb.0: @ %entry
1291+ ; CHECK-BE-NEXT: ldrb r0, [r0, #1]
1292+ ; CHECK-BE-NEXT: lsl r0, r0, #1
1293+ ; CHECK-BE-NEXT: bx lr
1294+ ;
1295+ ; CHECK-THUMB-LABEL: test_shift15_and510:
1296+ ; CHECK-THUMB: @ %bb.0: @ %entry
1297+ ; CHECK-THUMB-NEXT: ldrb r0, [r0, #2]
1298+ ; CHECK-THUMB-NEXT: lsls r0, r0, #1
1299+ ; CHECK-THUMB-NEXT: bx lr
1300+ ;
1301+ ; CHECK-ALIGN-LABEL: test_shift15_and510:
1302+ ; CHECK-ALIGN: @ %bb.0: @ %entry
1303+ ; CHECK-ALIGN-NEXT: ldrb r0, [r0, #2]
1304+ ; CHECK-ALIGN-NEXT: lsls r0, r0, #1
1305+ ; CHECK-ALIGN-NEXT: bx lr
1306+ ;
1307+ ; CHECK-V6M-LABEL: test_shift15_and510:
1308+ ; CHECK-V6M: @ %bb.0: @ %entry
1309+ ; CHECK-V6M-NEXT: ldrb r0, [r0, #2]
1310+ ; CHECK-V6M-NEXT: lsls r0, r0, #1
1311+ ; CHECK-V6M-NEXT: bx lr
1312+ entry:
1313+ %load = load i32 , ptr %p , align 4
1314+ %lshr = lshr i32 %load , 15
1315+ %and = and i32 %lshr , 510
1316+ ret i32 %and
1317+ }
1318+
1319+ define arm_aapcscc i32 @test_shift22_and1020 (ptr nocapture %p ) {
1320+ ; CHECK-ARM-LABEL: test_shift22_and1020:
1321+ ; CHECK-ARM: @ %bb.0: @ %entry
1322+ ; CHECK-ARM-NEXT: ldrb r0, [r0, #3]
1323+ ; CHECK-ARM-NEXT: lsl r0, r0, #2
1324+ ; CHECK-ARM-NEXT: bx lr
1325+ ;
1326+ ; CHECK-BE-LABEL: test_shift22_and1020:
1327+ ; CHECK-BE: @ %bb.0: @ %entry
1328+ ; CHECK-BE-NEXT: ldrb r0, [r0]
1329+ ; CHECK-BE-NEXT: lsl r0, r0, #2
1330+ ; CHECK-BE-NEXT: bx lr
1331+ ;
1332+ ; CHECK-THUMB-LABEL: test_shift22_and1020:
1333+ ; CHECK-THUMB: @ %bb.0: @ %entry
1334+ ; CHECK-THUMB-NEXT: ldrb r0, [r0, #3]
1335+ ; CHECK-THUMB-NEXT: lsls r0, r0, #2
1336+ ; CHECK-THUMB-NEXT: bx lr
1337+ ;
1338+ ; CHECK-ALIGN-LABEL: test_shift22_and1020:
1339+ ; CHECK-ALIGN: @ %bb.0: @ %entry
1340+ ; CHECK-ALIGN-NEXT: ldrb r0, [r0, #3]
1341+ ; CHECK-ALIGN-NEXT: lsls r0, r0, #2
1342+ ; CHECK-ALIGN-NEXT: bx lr
1343+ ;
1344+ ; CHECK-V6M-LABEL: test_shift22_and1020:
1345+ ; CHECK-V6M: @ %bb.0: @ %entry
1346+ ; CHECK-V6M-NEXT: ldrb r0, [r0, #3]
1347+ ; CHECK-V6M-NEXT: lsls r0, r0, #2
1348+ ; CHECK-V6M-NEXT: bx lr
1349+ entry:
1350+ %load = load i32 , ptr %p , align 4
1351+ %lshr = lshr i32 %load , 22
1352+ %and = and i32 %lshr , 1020
1353+ ret i32 %and
1354+ }
1355+
1356+ define arm_aapcscc i32 @test_zext_shift5_and2040 (ptr nocapture %p ) {
1357+ ; CHECK-ARM-LABEL: test_zext_shift5_and2040:
1358+ ; CHECK-ARM: @ %bb.0: @ %entry
1359+ ; CHECK-ARM-NEXT: ldrb r0, [r0, #1]
1360+ ; CHECK-ARM-NEXT: lsl r0, r0, #3
1361+ ; CHECK-ARM-NEXT: bx lr
1362+ ;
1363+ ; CHECK-BE-LABEL: test_zext_shift5_and2040:
1364+ ; CHECK-BE: @ %bb.0: @ %entry
1365+ ; CHECK-BE-NEXT: ldrb r0, [r0]
1366+ ; CHECK-BE-NEXT: lsl r0, r0, #3
1367+ ; CHECK-BE-NEXT: bx lr
1368+ ;
1369+ ; CHECK-THUMB-LABEL: test_zext_shift5_and2040:
1370+ ; CHECK-THUMB: @ %bb.0: @ %entry
1371+ ; CHECK-THUMB-NEXT: ldrb r0, [r0, #1]
1372+ ; CHECK-THUMB-NEXT: lsls r0, r0, #3
1373+ ; CHECK-THUMB-NEXT: bx lr
1374+ ;
1375+ ; CHECK-ALIGN-LABEL: test_zext_shift5_and2040:
1376+ ; CHECK-ALIGN: @ %bb.0: @ %entry
1377+ ; CHECK-ALIGN-NEXT: ldrb r0, [r0, #1]
1378+ ; CHECK-ALIGN-NEXT: lsls r0, r0, #3
1379+ ; CHECK-ALIGN-NEXT: bx lr
1380+ ;
1381+ ; CHECK-V6M-LABEL: test_zext_shift5_and2040:
1382+ ; CHECK-V6M: @ %bb.0: @ %entry
1383+ ; CHECK-V6M-NEXT: ldrb r0, [r0, #1]
1384+ ; CHECK-V6M-NEXT: lsls r0, r0, #3
1385+ ; CHECK-V6M-NEXT: bx lr
1386+ entry:
1387+ %load = load i16 , ptr %p , align 2
1388+ %zext = zext i16 %load to i32
1389+ %lshr = lshr i32 %zext , 5
1390+ %and = and i32 %lshr , 2040
1391+ ret i32 %and
1392+ }
0 commit comments