diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -1990,7 +1990,7 @@ /// Test if the given value is known to have exactly one bit set. This differs /// from computeKnownBits in that it doesn't necessarily determine which bit /// is set. - bool isKnownToBeAPowerOfTwo(SDValue Val) const; + bool isKnownToBeAPowerOfTwo(SDValue Val, unsigned Depth = 0) const; /// Return the number of times the sign bit of the register is replicated into /// the other bits. We know that at least 1 bit is always equal to the sign @@ -2098,7 +2098,7 @@ bool isKnownNeverZeroFloat(SDValue Op) const; /// Test whether the given SDValue is known to contain non-zero value(s). - bool isKnownNeverZero(SDValue Op) const; + bool isKnownNeverZero(SDValue Op, unsigned Depth = 0) const; /// Test whether two SDValues are known to compare equal. This /// is true if they are the same value, or if one is negative zero and the diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -3975,7 +3975,10 @@ return OFK_Sometime; } -bool SelectionDAG::isKnownToBeAPowerOfTwo(SDValue Val) const { +bool SelectionDAG::isKnownToBeAPowerOfTwo(SDValue Val, unsigned Depth) const { + if (Depth++ >= MaxRecursionDepth) + return false; // Limit search depth. + EVT OpVT = Val.getValueType(); unsigned BitWidth = OpVT.getScalarSizeInBits(); @@ -4017,14 +4020,14 @@ // vscale(power-of-two) is a power-of-two for some targets if (Val.getOpcode() == ISD::VSCALE && getTargetLoweringInfo().isVScaleKnownToBeAPowerOfTwo() && - isKnownToBeAPowerOfTwo(Val.getOperand(0))) + isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth)) return true; // More could be done here, though the above checks are enough // to handle some common cases. // Fall back to computeKnownBits to catch other known cases. - KnownBits Known = computeKnownBits(Val); + KnownBits Known = computeKnownBits(Val, Depth - 1); return (Known.countMaxPopulation() == 1) && (Known.countMinPopulation() == 1); } @@ -4992,7 +4995,10 @@ return false; } -bool SelectionDAG::isKnownNeverZero(SDValue Op) const { +bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const { + if (Depth++ >= MaxRecursionDepth) + return false; // Limit search depth. + assert(!Op.getValueType().isFloatingPoint() && "Floating point types unsupported - use isKnownNeverZeroFloat"); @@ -5005,8 +5011,8 @@ switch (Op.getOpcode()) { default: break; case ISD::OR: - if (isKnownNeverZero(Op.getOperand(1)) || - isKnownNeverZero(Op.getOperand(0))) + if (isKnownNeverZero(Op.getOperand(1), Depth) || + isKnownNeverZero(Op.getOperand(0), Depth)) return true; break; }