Revert "[GlobalISel] GISelKnownBits::computeKnownBitsImpl - Replace TargetOpcode...
authorFangrui Song <i@maskray.me>
Wed, 4 Nov 2020 17:54:04 +0000 (09:54 -0800)
committerFangrui Song <i@maskray.me>
Wed, 4 Nov 2020 17:54:04 +0000 (09:54 -0800)
This reverts commit 0b8711e1af97d6c82dc9d25c12c5a06af060cc56 which broke GlobalISelTests AArch64GISelMITest.TestKnownBits

llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp

index 862764f..81a89a6 100644 (file)
@@ -287,7 +287,20 @@ void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
                          Depth + 1);
     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
                          Depth + 1);
-    Known = KnownBits::computeForMul(Known, Known2);
+    // If low bits are zero in either operand, output low known-0 bits.
+    // Also compute a conservative estimate for high known-0 bits.
+    // More trickiness is possible, but this is sufficient for the
+    // interesting case of alignment computation.
+    unsigned TrailZ =
+        Known.countMinTrailingZeros() + Known2.countMinTrailingZeros();
+    unsigned LeadZ =
+        std::max(Known.countMinLeadingZeros() + Known2.countMinLeadingZeros(),
+                 BitWidth) -
+        BitWidth;
+
+    Known.resetAll();
+    Known.Zero.setLowBits(std::min(TrailZ, BitWidth));
+    Known.Zero.setHighBits(std::min(LeadZ, BitWidth));
     break;
   }
   case TargetOpcode::G_SELECT: {