OSDN Git Service

[SelectionDAG] computeKnownBits - use ashrInPlace on known bits of ISD::SRA input...
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 1 Nov 2017 13:16:48 +0000 (13:16 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 1 Nov 2017 13:16:48 +0000 (13:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317087 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 5a9e798..e5de280 100644 (file)
@@ -2479,17 +2479,9 @@ void SelectionDAG::computeKnownBits(SDValue Op, KnownBits &Known,
   case ISD::SRA:
     if (const APInt *ShAmt = getValidShiftAmountConstant(Op)) {
       computeKnownBits(Op.getOperand(0), Known, DemandedElts, Depth + 1);
-      Known.Zero.lshrInPlace(*ShAmt);
-      Known.One.lshrInPlace(*ShAmt);
-      // If we know the value of the sign bit, then we know it is copied across
-      // the high bits by the shift amount.
-      APInt SignMask = APInt::getSignMask(BitWidth);
-      SignMask.lshrInPlace(*ShAmt);  // Adjust to where it is now in the mask.
-      if (Known.Zero.intersects(SignMask)) {
-        Known.Zero.setHighBits(ShAmt->getZExtValue());// New bits are known zero.
-      } else if (Known.One.intersects(SignMask)) {
-        Known.One.setHighBits(ShAmt->getZExtValue()); // New bits are known one.
-      }
+      // Sign extend known zero/one bit (else is unknown).
+      Known.Zero.ashrInPlace(*ShAmt);
+      Known.One.ashrInPlace(*ShAmt);
     }
     break;
   case ISD::SIGN_EXTEND_INREG: {