diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index a200aa29f95ca..0cf101e8420dd 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -10042,7 +10042,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerBswap(MachineInstr &MI) { // Set i-th high/low byte in Res to i-th low/high byte from Src. for (unsigned i = 1; i < SizeInBytes / 2; ++i) { // AND with Mask leaves byte i unchanged and sets remaining bytes to 0. - APInt APMask(SizeInBytes * 8, 0xFF << (i * 8)); + APInt APMask = APInt::getBitsSet(SizeInBytes * 8, i * 8, i * 8 + 8); auto Mask = MIRBuilder.buildConstant(Ty, APMask); auto ShiftAmt = MIRBuilder.buildConstant(Ty, BaseShiftAmt - 16 * i); // Low byte shifted left to place of high byte: (Src & Mask) << ShiftAmt. diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-bswap-rv64.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-bswap-rv64.mir index b5d28765889e1..be4c8e7c2a12e 100644 --- a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-bswap-rv64.mir +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-bswap-rv64.mir @@ -117,7 +117,7 @@ body: | ; RV64I-NEXT: [[LSHR2:%[0-9]+]]:_(s64) = G_LSHR [[COPY]], [[C4]](s64) ; RV64I-NEXT: [[AND3:%[0-9]+]]:_(s64) = G_AND [[LSHR2]], [[C3]] ; RV64I-NEXT: [[OR4:%[0-9]+]]:_(s64) = G_OR [[OR3]], [[AND3]] - ; RV64I-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 -16777216 + ; RV64I-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 4278190080 ; RV64I-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 8 ; RV64I-NEXT: [[AND4:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C5]] ; RV64I-NEXT: [[SHL3:%[0-9]+]]:_(s64) = G_SHL [[AND4]], [[C6]](s64) diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 809d8880faaed..0e9f571ed5175 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -3373,6 +3373,34 @@ TEST_F(AArch64GISelMITest, LowerBSWAP) { EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } +// Test lowering of scalar s64 G_BSWAP. +TEST_F(AArch64GISelMITest, LowerBSWAPScalarS64) { + setUp(); + if (!TM) + GTEST_SKIP(); + + DefineLegalizerInfo(A, {}); + + auto BSwap = B.buildBSwap(LLT::scalar(64), Copies[0]); + AInfo Info(MF->getSubtarget()); + DummyGISelObserver Observer; + LegalizerHelper Helper(*MF, Info, Observer, B, &*LibcallLowering); + EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, + Helper.lower(*BSwap, 0, LLT())); + + // Per-byte AND masks the lowering loop emits for i = 1, 2, 3: + // 0x000000000000FF00 = 65280 + // 0x0000000000FF0000 = 16711680 + // 0x00000000FF000000 = 4278190080 + auto CheckStr = R"( + CHECK-DAG: G_CONSTANT i64 65280 + CHECK-DAG: G_CONSTANT i64 16711680 + CHECK-DAG: G_CONSTANT i64 4278190080 + )"; + + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; +} + // Test lowering of G_SDIVREM into G_SDIV and G_SREM TEST_F(AArch64GISelMITest, LowerSDIVREM) { setUp();