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