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 @@ -2013,7 +2013,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 @@ -2121,7 +2121,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 @@ -4019,7 +4019,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(); @@ -4061,7 +4064,7 @@ // 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 + 1)) return true; // More could be done here, though the above checks are enough @@ -5039,7 +5042,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"); @@ -5052,8 +5058,8 @@ switch (Op.getOpcode()) { default: break; case ISD::OR: - if (isKnownNeverZero(Op.getOperand(1)) || - isKnownNeverZero(Op.getOperand(0))) + if (isKnownNeverZero(Op.getOperand(1), Depth + 1) || + isKnownNeverZero(Op.getOperand(0), Depth + 1)) return true; break; }