[GlobalISel] Fix known bits for G_BSWAP and B_BITREVERSE not doing anything.
authorAmara Emerson <amara@apple.com>
Sun, 18 Jul 2021 06:03:52 +0000 (23:03 -0700)
committerAmara Emerson <amara@apple.com>
Sun, 18 Jul 2021 06:07:16 +0000 (23:07 -0700)
llvm::KnownBits::byteSwap() and reverse() don't modify in-place, so
we weren't actually computing anything. This was causing a miscompile on an
arm64 stage2 bootstrap clang build.

llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp
llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
llvm/unittests/CodeGen/GlobalISel/KnownBitsVectorTest.cpp

index a7f0d5f..8146a67 100644 (file)
@@ -501,13 +501,13 @@ void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
   case TargetOpcode::G_BSWAP: {
     Register SrcReg = MI.getOperand(1).getReg();
     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
-    Known.byteSwap();
+    Known = Known.byteSwap();
     break;
   }
   case TargetOpcode::G_BITREVERSE: {
     Register SrcReg = MI.getOperand(1).getReg();
     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
-    Known.reverseBits();
+    Known = Known.reverseBits();
     break;
   }
   case TargetOpcode::G_UBFX: {
index 2615316..e948f15 100644 (file)
@@ -1369,7 +1369,8 @@ TEST_F(AArch64GISelMITest, TestKnownBitsBSwapBitReverse) {
   if (!TM)
     return;
 
-  const uint32_t TestVal = 0x11223344;
+  const uint32_t ByteSwappedVal = 0x44332211;
+  const uint32_t BitSwappedVal = 0x22cc4488;
 
   Register CopyBSwap = Copies[Copies.size() - 2];
   Register CopyBitReverse = Copies[Copies.size() - 1];
@@ -1378,13 +1379,13 @@ TEST_F(AArch64GISelMITest, TestKnownBitsBSwapBitReverse) {
 
   KnownBits BSwapKnown = Info.getKnownBits(CopyBSwap);
   EXPECT_EQ(32u, BSwapKnown.getBitWidth());
-  EXPECT_EQ(TestVal, BSwapKnown.One.getZExtValue());
-  EXPECT_EQ(~TestVal, BSwapKnown.Zero.getZExtValue());
+  EXPECT_EQ(ByteSwappedVal, BSwapKnown.One.getZExtValue());
+  EXPECT_EQ(~ByteSwappedVal, BSwapKnown.Zero.getZExtValue());
 
   KnownBits BitReverseKnown = Info.getKnownBits(CopyBitReverse);
   EXPECT_EQ(32u, BitReverseKnown.getBitWidth());
-  EXPECT_EQ(TestVal, BitReverseKnown.One.getZExtValue());
-  EXPECT_EQ(~TestVal, BitReverseKnown.Zero.getZExtValue());
+  EXPECT_EQ(BitSwappedVal, BitReverseKnown.One.getZExtValue());
+  EXPECT_EQ(~BitSwappedVal, BitReverseKnown.Zero.getZExtValue());
 }
 
 TEST_F(AArch64GISelMITest, TestKnownBitsUMAX) {
index 6def988..a4767ea 100644 (file)
@@ -1227,7 +1227,8 @@ TEST_F(AArch64GISelMITest, TestVectorKnownBitsBSwapBitReverse) {
   if (!TM)
     return;
 
-  const uint32_t TestVal = 0x11223344;
+  const uint32_t ByteSwappedVal = 0x44332211;
+  const uint32_t BitSwappedVal = 0x22cc4488;
 
   Register CopyBSwap = Copies[Copies.size() - 2];
   Register CopyBitReverse = Copies[Copies.size() - 1];
@@ -1236,13 +1237,13 @@ TEST_F(AArch64GISelMITest, TestVectorKnownBitsBSwapBitReverse) {
 
   KnownBits BSwapKnown = Info.getKnownBits(CopyBSwap);
   EXPECT_EQ(32u, BSwapKnown.getBitWidth());
-  EXPECT_EQ(TestVal, BSwapKnown.One.getZExtValue());
-  EXPECT_EQ(~TestVal, BSwapKnown.Zero.getZExtValue());
+  EXPECT_EQ(ByteSwappedVal, BSwapKnown.One.getZExtValue());
+  EXPECT_EQ(~ByteSwappedVal, BSwapKnown.Zero.getZExtValue());
 
   KnownBits BitReverseKnown = Info.getKnownBits(CopyBitReverse);
   EXPECT_EQ(32u, BitReverseKnown.getBitWidth());
-  EXPECT_EQ(TestVal, BitReverseKnown.One.getZExtValue());
-  EXPECT_EQ(~TestVal, BitReverseKnown.Zero.getZExtValue());
+  EXPECT_EQ(BitSwappedVal, BitReverseKnown.One.getZExtValue());
+  EXPECT_EQ(~BitSwappedVal, BitReverseKnown.Zero.getZExtValue());
 }
 
 TEST_F(AArch64GISelMITest, TestKnownBitsVectorUMAX) {