[llvm] 3d837ad - Revert "[ValueTracking] computeKnownBitsFromShiftOperator - remove non-zero shift amount handling."

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 24 06:06:44 PST 2021


Author: Nico Weber
Date: 2021-02-24T09:06:12-05:00
New Revision: 3d837ad7041f88c9bf308d9de0b941e2e7eb4a6c

URL: https://github.com/llvm/llvm-project/commit/3d837ad7041f88c9bf308d9de0b941e2e7eb4a6c
DIFF: https://github.com/llvm/llvm-project/commit/3d837ad7041f88c9bf308d9de0b941e2e7eb4a6c.diff

LOG: Revert "[ValueTracking] computeKnownBitsFromShiftOperator - remove non-zero shift amount handling."

This reverts commit d37400168ce2f1f9ccc91847431f5b8c020a7d67.
Breaks Analysis/./AnalysisTests/ComputeKnownBitsTest.KnownNonZeroShift

Added: 
    

Modified: 
    llvm/lib/Analysis/ValueTracking.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index a979a7d8cbf2..9e5c8b49767e 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1018,10 +1018,15 @@ static void computeKnownBitsFromShiftOperator(
   // If we know the shifter operand is nonzero, we can sometimes infer more
   // known bits. However this is expensive to compute, so be lazy about it and
   // only compute it when absolutely necessary.
+  Optional<bool> ShifterOperandIsNonZero;
+
   // Early exit if we can't constrain any well-defined shift amount.
   if (!(ShiftAmtKZ & (PowerOf2Ceil(BitWidth) - 1)) &&
       !(ShiftAmtKO & (PowerOf2Ceil(BitWidth) - 1))) {
-    return;
+    ShifterOperandIsNonZero =
+        isKnownNonZero(I->getOperand(1), DemandedElts, Depth + 1, Q);
+    if (!*ShifterOperandIsNonZero)
+      return;
   }
 
   Known.Zero.setAllBits();
@@ -1033,6 +1038,17 @@ static void computeKnownBitsFromShiftOperator(
       continue;
     if ((ShiftAmt | ShiftAmtKO) != ShiftAmt)
       continue;
+    // If we know the shifter is nonzero, we may be able to infer more known
+    // bits. This check is sunk down as far as possible to avoid the expensive
+    // call to isKnownNonZero if the cheaper checks above fail.
+    if (ShiftAmt == 0) {
+      if (!ShifterOperandIsNonZero.hasValue())
+        ShifterOperandIsNonZero =
+            isKnownNonZero(I->getOperand(1), DemandedElts, Depth + 1, Q);
+      if (*ShifterOperandIsNonZero)
+        continue;
+    }
+
     Known = KnownBits::commonBits(
         Known, KF(Known2, KnownBits::makeConstant(APInt(32, ShiftAmt))));
   }


        


More information about the llvm-commits mailing list