xref: /llvm-project/llvm/test/CodeGen/RISCV/narrow-shl-cst.ll (revision a2b5b584a576b253165e17e32d8c5627021ac881)
18d87f71eSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
28d87f71eSCraig Topper; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=RV32
38d87f71eSCraig Topper; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=RV64
48d87f71eSCraig Topper
58d87f71eSCraig Topperdefine signext i32 @test1(i32 signext %x) nounwind {
68d87f71eSCraig Topper; RV32-LABEL: test1:
78d87f71eSCraig Topper; RV32:       # %bb.0:
8a304d70eSCraig Topper; RV32-NEXT:    ori a0, a0, 31
98d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 10
108d87f71eSCraig Topper; RV32-NEXT:    ret
118d87f71eSCraig Topper;
128d87f71eSCraig Topper; RV64-LABEL: test1:
138d87f71eSCraig Topper; RV64:       # %bb.0:
14a304d70eSCraig Topper; RV64-NEXT:    ori a0, a0, 31
158d87f71eSCraig Topper; RV64-NEXT:    slliw a0, a0, 10
168d87f71eSCraig Topper; RV64-NEXT:    ret
178d87f71eSCraig Topper  %or = shl i32 %x, 10
188d87f71eSCraig Topper  %shl = or i32 %or, 31744
198d87f71eSCraig Topper  ret i32 %shl
208d87f71eSCraig Topper}
218d87f71eSCraig Topper
228d87f71eSCraig Topperdefine signext i32 @test2(i32 signext %x) nounwind {
238d87f71eSCraig Topper; RV32-LABEL: test2:
248d87f71eSCraig Topper; RV32:       # %bb.0:
25a304d70eSCraig Topper; RV32-NEXT:    xori a0, a0, 31
268d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 10
278d87f71eSCraig Topper; RV32-NEXT:    ret
288d87f71eSCraig Topper;
298d87f71eSCraig Topper; RV64-LABEL: test2:
308d87f71eSCraig Topper; RV64:       # %bb.0:
31a304d70eSCraig Topper; RV64-NEXT:    xori a0, a0, 31
328d87f71eSCraig Topper; RV64-NEXT:    slliw a0, a0, 10
338d87f71eSCraig Topper; RV64-NEXT:    ret
348d87f71eSCraig Topper  %xor = shl i32 %x, 10
358d87f71eSCraig Topper  %shl = xor i32 %xor, 31744
368d87f71eSCraig Topper  ret i32 %shl
378d87f71eSCraig Topper}
388d87f71eSCraig Topper
398d87f71eSCraig Topperdefine i64 @test3(i64 %x) nounwind {
408d87f71eSCraig Topper; RV32-LABEL: test3:
418d87f71eSCraig Topper; RV32:       # %bb.0:
42*a2b5b584SCraig Topper; RV32-NEXT:    andi a1, a0, 241
43*a2b5b584SCraig Topper; RV32-NEXT:    slli a1, a1, 8
448d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
458d87f71eSCraig Topper; RV32-NEXT:    ret
468d87f71eSCraig Topper;
478d87f71eSCraig Topper; RV64-LABEL: test3:
488d87f71eSCraig Topper; RV64:       # %bb.0:
49a304d70eSCraig Topper; RV64-NEXT:    andi a0, a0, 241
508d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 40
518d87f71eSCraig Topper; RV64-NEXT:    ret
528d87f71eSCraig Topper  %and = shl i64 %x, 40
538d87f71eSCraig Topper  %shl = and i64 %and, 264982302294016
548d87f71eSCraig Topper  ret i64 %shl
558d87f71eSCraig Topper}
568d87f71eSCraig Topper
578d87f71eSCraig Topperdefine i64 @test4(i64 %x) nounwind {
588d87f71eSCraig Topper; RV32-LABEL: test4:
598d87f71eSCraig Topper; RV32:       # %bb.0:
60*a2b5b584SCraig Topper; RV32-NEXT:    ori a1, a0, 241
61*a2b5b584SCraig Topper; RV32-NEXT:    slli a1, a1, 8
628d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
638d87f71eSCraig Topper; RV32-NEXT:    ret
648d87f71eSCraig Topper;
658d87f71eSCraig Topper; RV64-LABEL: test4:
668d87f71eSCraig Topper; RV64:       # %bb.0:
67a304d70eSCraig Topper; RV64-NEXT:    ori a0, a0, 241
688d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 40
698d87f71eSCraig Topper; RV64-NEXT:    ret
708d87f71eSCraig Topper  %or = shl i64 %x, 40
718d87f71eSCraig Topper  %shl = or i64 %or, 264982302294016
728d87f71eSCraig Topper  ret i64 %shl
738d87f71eSCraig Topper}
748d87f71eSCraig Topper
758d87f71eSCraig Topperdefine i64 @test5(i64 %x) nounwind {
768d87f71eSCraig Topper; RV32-LABEL: test5:
778d87f71eSCraig Topper; RV32:       # %bb.0:
78*a2b5b584SCraig Topper; RV32-NEXT:    ori a1, a0, 31
79*a2b5b584SCraig Topper; RV32-NEXT:    slli a1, a1, 8
808d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
818d87f71eSCraig Topper; RV32-NEXT:    ret
828d87f71eSCraig Topper;
838d87f71eSCraig Topper; RV64-LABEL: test5:
848d87f71eSCraig Topper; RV64:       # %bb.0:
85a304d70eSCraig Topper; RV64-NEXT:    ori a0, a0, 31
868d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 40
878d87f71eSCraig Topper; RV64-NEXT:    ret
888d87f71eSCraig Topper  %or = shl i64 %x, 40
898d87f71eSCraig Topper  %shl = or i64 %or, 34084860461056
908d87f71eSCraig Topper  ret i64 %shl
918d87f71eSCraig Topper}
928d87f71eSCraig Topper
938d87f71eSCraig Topperdefine i64 @test6(i64 %x) nounwind {
948d87f71eSCraig Topper; RV32-LABEL: test6:
958d87f71eSCraig Topper; RV32:       # %bb.0:
96*a2b5b584SCraig Topper; RV32-NEXT:    xori a1, a0, 241
97*a2b5b584SCraig Topper; RV32-NEXT:    slli a1, a1, 8
988d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
998d87f71eSCraig Topper; RV32-NEXT:    ret
1008d87f71eSCraig Topper;
1018d87f71eSCraig Topper; RV64-LABEL: test6:
1028d87f71eSCraig Topper; RV64:       # %bb.0:
103a304d70eSCraig Topper; RV64-NEXT:    xori a0, a0, 241
1048d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 40
1058d87f71eSCraig Topper; RV64-NEXT:    ret
1068d87f71eSCraig Topper  %xor = shl i64 %x, 40
1078d87f71eSCraig Topper  %shl = xor i64 %xor, 264982302294016
1088d87f71eSCraig Topper  ret i64 %shl
1098d87f71eSCraig Topper}
1108d87f71eSCraig Topper
1118d87f71eSCraig Topperdefine i64 @test7(i64 %x) nounwind {
1128d87f71eSCraig Topper; RV32-LABEL: test7:
1138d87f71eSCraig Topper; RV32:       # %bb.0:
114*a2b5b584SCraig Topper; RV32-NEXT:    xori a1, a0, 31
115*a2b5b584SCraig Topper; RV32-NEXT:    slli a1, a1, 8
1168d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
1178d87f71eSCraig Topper; RV32-NEXT:    ret
1188d87f71eSCraig Topper;
1198d87f71eSCraig Topper; RV64-LABEL: test7:
1208d87f71eSCraig Topper; RV64:       # %bb.0:
121a304d70eSCraig Topper; RV64-NEXT:    xori a0, a0, 31
1228d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 40
1238d87f71eSCraig Topper; RV64-NEXT:    ret
1248d87f71eSCraig Topper  %xor = shl i64 %x, 40
1258d87f71eSCraig Topper  %shl = xor i64 %xor, 34084860461056
1268d87f71eSCraig Topper  ret i64 %shl
1278d87f71eSCraig Topper}
1288d87f71eSCraig Topper
1298d87f71eSCraig Topperdefine i64 @test8(i64 %x) nounwind {
1308d87f71eSCraig Topper; RV32-LABEL: test8:
1318d87f71eSCraig Topper; RV32:       # %bb.0:
1328d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 1
1338d87f71eSCraig Topper; RV32-NEXT:    andi a1, a0, -482
1348d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
1358d87f71eSCraig Topper; RV32-NEXT:    ret
1368d87f71eSCraig Topper;
1378d87f71eSCraig Topper; RV64-LABEL: test8:
1388d87f71eSCraig Topper; RV64:       # %bb.0:
139a304d70eSCraig Topper; RV64-NEXT:    andi a0, a0, -241
1408d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 33
1418d87f71eSCraig Topper; RV64-NEXT:    ret
1428d87f71eSCraig Topper  %xor = shl i64 %x, 33
1438d87f71eSCraig Topper  %shl = and i64 %xor, -2070174236672
1448d87f71eSCraig Topper  ret i64 %shl
1458d87f71eSCraig Topper}
1468d87f71eSCraig Topper
1478d87f71eSCraig Topperdefine i64 @test9(i64 %x) nounwind {
1488d87f71eSCraig Topper; RV32-LABEL: test9:
1498d87f71eSCraig Topper; RV32:       # %bb.0:
1508d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 1
1518d87f71eSCraig Topper; RV32-NEXT:    ori a1, a0, -482
1528d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
1538d87f71eSCraig Topper; RV32-NEXT:    ret
1548d87f71eSCraig Topper;
1558d87f71eSCraig Topper; RV64-LABEL: test9:
1568d87f71eSCraig Topper; RV64:       # %bb.0:
157a304d70eSCraig Topper; RV64-NEXT:    ori a0, a0, -241
1588d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 33
1598d87f71eSCraig Topper; RV64-NEXT:    ret
1608d87f71eSCraig Topper  %xor = shl i64 %x, 33
1618d87f71eSCraig Topper  %shl = or i64 %xor, -2070174236672
1628d87f71eSCraig Topper  ret i64 %shl
1638d87f71eSCraig Topper}
1648d87f71eSCraig Topper
1658d87f71eSCraig Topperdefine i64 @test10(i64 %x) nounwind {
1668d87f71eSCraig Topper; RV32-LABEL: test10:
1678d87f71eSCraig Topper; RV32:       # %bb.0:
1688d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 1
1698d87f71eSCraig Topper; RV32-NEXT:    xori a1, a0, -482
1708d87f71eSCraig Topper; RV32-NEXT:    li a0, 0
1718d87f71eSCraig Topper; RV32-NEXT:    ret
1728d87f71eSCraig Topper;
1738d87f71eSCraig Topper; RV64-LABEL: test10:
1748d87f71eSCraig Topper; RV64:       # %bb.0:
175a304d70eSCraig Topper; RV64-NEXT:    xori a0, a0, -241
1768d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 33
1778d87f71eSCraig Topper; RV64-NEXT:    ret
1788d87f71eSCraig Topper  %xor = shl i64 %x, 33
1798d87f71eSCraig Topper  %shl = xor i64 %xor, -2070174236672
1808d87f71eSCraig Topper  ret i64 %shl
1818d87f71eSCraig Topper}
1828d87f71eSCraig Topper
1838d87f71eSCraig Topperdefine signext i32 @test11(i32 signext %x) nounwind {
1848d87f71eSCraig Topper; RV32-LABEL: test11:
1858d87f71eSCraig Topper; RV32:       # %bb.0:
186a304d70eSCraig Topper; RV32-NEXT:    andi a0, a0, -241
1878d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 17
1888d87f71eSCraig Topper; RV32-NEXT:    ret
1898d87f71eSCraig Topper;
1908d87f71eSCraig Topper; RV64-LABEL: test11:
1918d87f71eSCraig Topper; RV64:       # %bb.0:
1924830fa18SCraig Topper; RV64-NEXT:    andi a0, a0, -241
1938d87f71eSCraig Topper; RV64-NEXT:    slliw a0, a0, 17
1948d87f71eSCraig Topper; RV64-NEXT:    ret
1958d87f71eSCraig Topper  %or = shl i32 %x, 17
1968d87f71eSCraig Topper  %shl = and i32 %or, -31588352
1978d87f71eSCraig Topper  ret i32 %shl
1988d87f71eSCraig Topper}
1998d87f71eSCraig Topper
2008d87f71eSCraig Topperdefine signext i32 @test12(i32 signext %x) nounwind {
2018d87f71eSCraig Topper; RV32-LABEL: test12:
2028d87f71eSCraig Topper; RV32:       # %bb.0:
203a304d70eSCraig Topper; RV32-NEXT:    ori a0, a0, -241
2048d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 17
2058d87f71eSCraig Topper; RV32-NEXT:    ret
2068d87f71eSCraig Topper;
2078d87f71eSCraig Topper; RV64-LABEL: test12:
2088d87f71eSCraig Topper; RV64:       # %bb.0:
209a304d70eSCraig Topper; RV64-NEXT:    ori a0, a0, -241
2108d87f71eSCraig Topper; RV64-NEXT:    slli a0, a0, 17
2118d87f71eSCraig Topper; RV64-NEXT:    ret
2128d87f71eSCraig Topper  %or = shl i32 %x, 17
2138d87f71eSCraig Topper  %shl = or i32 %or, -31588352
2148d87f71eSCraig Topper  ret i32 %shl
2158d87f71eSCraig Topper}
2168d87f71eSCraig Topper
2178d87f71eSCraig Topperdefine signext i32 @test13(i32 signext %x) nounwind {
2188d87f71eSCraig Topper; RV32-LABEL: test13:
2198d87f71eSCraig Topper; RV32:       # %bb.0:
220a304d70eSCraig Topper; RV32-NEXT:    xori a0, a0, -241
2218d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 17
2228d87f71eSCraig Topper; RV32-NEXT:    ret
2238d87f71eSCraig Topper;
2248d87f71eSCraig Topper; RV64-LABEL: test13:
2258d87f71eSCraig Topper; RV64:       # %bb.0:
226a304d70eSCraig Topper; RV64-NEXT:    xori a0, a0, -241
2278d87f71eSCraig Topper; RV64-NEXT:    slliw a0, a0, 17
2288d87f71eSCraig Topper; RV64-NEXT:    ret
2298d87f71eSCraig Topper  %or = shl i32 %x, 17
2308d87f71eSCraig Topper  %shl = xor i32 %or, -31588352
2318d87f71eSCraig Topper  ret i32 %shl
2328d87f71eSCraig Topper}
2338d87f71eSCraig Topper
2348d87f71eSCraig Topper; Negative test. Can't transform because the constant has a 1 in the bits
2358d87f71eSCraig Topper; cleared by the shl.
2368d87f71eSCraig Topperdefine signext i32 @test14(i32 signext %x) nounwind {
2378d87f71eSCraig Topper; RV32-LABEL: test14:
2388d87f71eSCraig Topper; RV32:       # %bb.0:
2398d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 10
2408d87f71eSCraig Topper; RV32-NEXT:    lui a1, 8
2418d87f71eSCraig Topper; RV32-NEXT:    addi a1, a1, -1027
2428d87f71eSCraig Topper; RV32-NEXT:    or a0, a0, a1
2438d87f71eSCraig Topper; RV32-NEXT:    ret
2448d87f71eSCraig Topper;
2458d87f71eSCraig Topper; RV64-LABEL: test14:
2468d87f71eSCraig Topper; RV64:       # %bb.0:
2478d87f71eSCraig Topper; RV64-NEXT:    slliw a0, a0, 10
2488d87f71eSCraig Topper; RV64-NEXT:    lui a1, 8
2498d87f71eSCraig Topper; RV64-NEXT:    addiw a1, a1, -1027
2508d87f71eSCraig Topper; RV64-NEXT:    or a0, a0, a1
2518d87f71eSCraig Topper; RV64-NEXT:    ret
2528d87f71eSCraig Topper  %or = shl i32 %x, 10
2538d87f71eSCraig Topper  %shl = or i32 %or, 31741
2548d87f71eSCraig Topper  ret i32 %shl
2558d87f71eSCraig Topper}
2568d87f71eSCraig Topper
2578d87f71eSCraig Topper; Negative test. Can't transform because the constant has a 1 in the bits
2588d87f71eSCraig Topper; cleared by the shl.
2598d87f71eSCraig Topperdefine signext i32 @test15(i32 signext %x) nounwind {
2608d87f71eSCraig Topper; RV32-LABEL: test15:
2618d87f71eSCraig Topper; RV32:       # %bb.0:
2628d87f71eSCraig Topper; RV32-NEXT:    slli a0, a0, 10
2638d87f71eSCraig Topper; RV32-NEXT:    lui a1, 8
2648d87f71eSCraig Topper; RV32-NEXT:    addi a1, a1, -515
2658d87f71eSCraig Topper; RV32-NEXT:    xor a0, a0, a1
2668d87f71eSCraig Topper; RV32-NEXT:    ret
2678d87f71eSCraig Topper;
2688d87f71eSCraig Topper; RV64-LABEL: test15:
2698d87f71eSCraig Topper; RV64:       # %bb.0:
2708d87f71eSCraig Topper; RV64-NEXT:    slliw a0, a0, 10
2718d87f71eSCraig Topper; RV64-NEXT:    lui a1, 8
2728d87f71eSCraig Topper; RV64-NEXT:    addiw a1, a1, -515
2738d87f71eSCraig Topper; RV64-NEXT:    xor a0, a0, a1
2748d87f71eSCraig Topper; RV64-NEXT:    ret
2758d87f71eSCraig Topper  %xor = shl i32 %x, 10
2768d87f71eSCraig Topper  %shl = xor i32 %xor, 32253
2778d87f71eSCraig Topper  ret i32 %shl
2788d87f71eSCraig Topper}
279