mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 09:21:13 +00:00
[ValueTracking] Replace all uses of ComputeSignBit with computeKnownBits.
This patch finishes off the conversion of ComputeSignBit to computeKnownBits. Differential Revision: https://reviews.llvm.org/D33166 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303035 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
89bddde655
commit
32a237d8c0
@ -73,14 +73,6 @@ template <typename T> class ArrayRef;
|
||||
const Instruction *CxtI = nullptr,
|
||||
const DominatorTree *DT = nullptr);
|
||||
|
||||
/// Determine whether the sign bit is known to be zero or one. Convenience
|
||||
/// wrapper around computeKnownBits.
|
||||
void ComputeSignBit(const Value *V, bool &KnownZero, bool &KnownOne,
|
||||
const DataLayout &DL, unsigned Depth = 0,
|
||||
AssumptionCache *AC = nullptr,
|
||||
const Instruction *CxtI = nullptr,
|
||||
const DominatorTree *DT = nullptr);
|
||||
|
||||
/// Return true if the given value is known to have exactly one bit set when
|
||||
/// defined. For vectors return true if every element is known to be a power
|
||||
/// of two when defined. Supports values with integer or pointer type and
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include <algorithm>
|
||||
|
||||
#define DEBUG_TYPE "basicaa"
|
||||
@ -1283,8 +1284,9 @@ AliasResult BasicAAResult::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,
|
||||
// give up if we can't determine conditions that hold for every cycle:
|
||||
const Value *V = DecompGEP1.VarIndices[i].V;
|
||||
|
||||
bool SignKnownZero, SignKnownOne;
|
||||
ComputeSignBit(V, SignKnownZero, SignKnownOne, DL, 0, &AC, nullptr, DT);
|
||||
KnownBits Known = computeKnownBits(V, DL, 0, &AC, nullptr, DT);
|
||||
bool SignKnownZero = Known.isNonNegative();
|
||||
bool SignKnownOne = Known.isNegative();
|
||||
|
||||
// Zero-extension widens the variable, and so forces the sign
|
||||
// bit to zero.
|
||||
|
@ -2304,7 +2304,6 @@ static Value *simplifyICmpWithZero(CmpInst::Predicate Pred, Value *LHS,
|
||||
return nullptr;
|
||||
|
||||
Type *ITy = GetCompareTy(LHS); // The return type.
|
||||
bool LHSKnownNonNegative, LHSKnownNegative;
|
||||
switch (Pred) {
|
||||
default:
|
||||
llvm_unreachable("Unknown ICmp predicate!");
|
||||
@ -2322,39 +2321,41 @@ static Value *simplifyICmpWithZero(CmpInst::Predicate Pred, Value *LHS,
|
||||
if (isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT))
|
||||
return getTrue(ITy);
|
||||
break;
|
||||
case ICmpInst::ICMP_SLT:
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (LHSKnownNegative)
|
||||
case ICmpInst::ICMP_SLT: {
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (LHSKnown.isNegative())
|
||||
return getTrue(ITy);
|
||||
if (LHSKnownNonNegative)
|
||||
if (LHSKnown.isNonNegative())
|
||||
return getFalse(ITy);
|
||||
break;
|
||||
case ICmpInst::ICMP_SLE:
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (LHSKnownNegative)
|
||||
}
|
||||
case ICmpInst::ICMP_SLE: {
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (LHSKnown.isNegative())
|
||||
return getTrue(ITy);
|
||||
if (LHSKnownNonNegative && isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT))
|
||||
if (LHSKnown.isNonNegative() &&
|
||||
isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT))
|
||||
return getFalse(ITy);
|
||||
break;
|
||||
case ICmpInst::ICMP_SGE:
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (LHSKnownNegative)
|
||||
}
|
||||
case ICmpInst::ICMP_SGE: {
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (LHSKnown.isNegative())
|
||||
return getFalse(ITy);
|
||||
if (LHSKnownNonNegative)
|
||||
if (LHSKnown.isNonNegative())
|
||||
return getTrue(ITy);
|
||||
break;
|
||||
case ICmpInst::ICMP_SGT:
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (LHSKnownNegative)
|
||||
}
|
||||
case ICmpInst::ICMP_SGT: {
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (LHSKnown.isNegative())
|
||||
return getFalse(ITy);
|
||||
if (LHSKnownNonNegative && isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT))
|
||||
if (LHSKnown.isNonNegative() &&
|
||||
isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT))
|
||||
return getTrue(ITy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -2637,15 +2638,11 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
|
||||
return getTrue(ITy);
|
||||
|
||||
if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
|
||||
bool RHSKnownNonNegative, RHSKnownNegative;
|
||||
bool YKnownNonNegative, YKnownNegative;
|
||||
ComputeSignBit(RHS, RHSKnownNonNegative, RHSKnownNegative, Q.DL, 0,
|
||||
Q.AC, Q.CxtI, Q.DT);
|
||||
ComputeSignBit(Y, YKnownNonNegative, YKnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (RHSKnownNonNegative && YKnownNegative)
|
||||
KnownBits RHSKnown = computeKnownBits(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
KnownBits YKnown = computeKnownBits(Y, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (RHSKnown.isNonNegative() && YKnown.isNegative())
|
||||
return Pred == ICmpInst::ICMP_SLT ? getTrue(ITy) : getFalse(ITy);
|
||||
if (RHSKnownNegative || YKnownNonNegative)
|
||||
if (RHSKnown.isNegative() || YKnown.isNonNegative())
|
||||
return Pred == ICmpInst::ICMP_SLT ? getFalse(ITy) : getTrue(ITy);
|
||||
}
|
||||
}
|
||||
@ -2657,15 +2654,11 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
|
||||
return getFalse(ITy);
|
||||
|
||||
if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLE) {
|
||||
bool LHSKnownNonNegative, LHSKnownNegative;
|
||||
bool YKnownNonNegative, YKnownNegative;
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.DL, 0,
|
||||
Q.AC, Q.CxtI, Q.DT);
|
||||
ComputeSignBit(Y, YKnownNonNegative, YKnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (LHSKnownNonNegative && YKnownNegative)
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
KnownBits YKnown = computeKnownBits(Y, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (LHSKnown.isNonNegative() && YKnown.isNegative())
|
||||
return Pred == ICmpInst::ICMP_SGT ? getTrue(ITy) : getFalse(ITy);
|
||||
if (LHSKnownNegative || YKnownNonNegative)
|
||||
if (LHSKnown.isNegative() || YKnown.isNonNegative())
|
||||
return Pred == ICmpInst::ICMP_SGT ? getFalse(ITy) : getTrue(ITy);
|
||||
}
|
||||
}
|
||||
@ -2712,28 +2705,27 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
|
||||
|
||||
// icmp pred (urem X, Y), Y
|
||||
if (LBO && match(LBO, m_URem(m_Value(), m_Specific(RHS)))) {
|
||||
bool KnownNonNegative, KnownNegative;
|
||||
switch (Pred) {
|
||||
default:
|
||||
break;
|
||||
case ICmpInst::ICMP_SGT:
|
||||
case ICmpInst::ICMP_SGE:
|
||||
ComputeSignBit(RHS, KnownNonNegative, KnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (!KnownNonNegative)
|
||||
case ICmpInst::ICMP_SGE: {
|
||||
KnownBits Known = computeKnownBits(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (!Known.isNonNegative())
|
||||
break;
|
||||
LLVM_FALLTHROUGH;
|
||||
}
|
||||
case ICmpInst::ICMP_EQ:
|
||||
case ICmpInst::ICMP_UGT:
|
||||
case ICmpInst::ICMP_UGE:
|
||||
return getFalse(ITy);
|
||||
case ICmpInst::ICMP_SLT:
|
||||
case ICmpInst::ICMP_SLE:
|
||||
ComputeSignBit(RHS, KnownNonNegative, KnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (!KnownNonNegative)
|
||||
case ICmpInst::ICMP_SLE: {
|
||||
KnownBits Known = computeKnownBits(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (!Known.isNonNegative())
|
||||
break;
|
||||
LLVM_FALLTHROUGH;
|
||||
}
|
||||
case ICmpInst::ICMP_NE:
|
||||
case ICmpInst::ICMP_ULT:
|
||||
case ICmpInst::ICMP_ULE:
|
||||
@ -2743,28 +2735,27 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
|
||||
|
||||
// icmp pred X, (urem Y, X)
|
||||
if (RBO && match(RBO, m_URem(m_Value(), m_Specific(LHS)))) {
|
||||
bool KnownNonNegative, KnownNegative;
|
||||
switch (Pred) {
|
||||
default:
|
||||
break;
|
||||
case ICmpInst::ICMP_SGT:
|
||||
case ICmpInst::ICMP_SGE:
|
||||
ComputeSignBit(LHS, KnownNonNegative, KnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (!KnownNonNegative)
|
||||
case ICmpInst::ICMP_SGE: {
|
||||
KnownBits Known = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (!Known.isNonNegative())
|
||||
break;
|
||||
LLVM_FALLTHROUGH;
|
||||
}
|
||||
case ICmpInst::ICMP_NE:
|
||||
case ICmpInst::ICMP_UGT:
|
||||
case ICmpInst::ICMP_UGE:
|
||||
return getTrue(ITy);
|
||||
case ICmpInst::ICMP_SLT:
|
||||
case ICmpInst::ICMP_SLE:
|
||||
ComputeSignBit(LHS, KnownNonNegative, KnownNegative, Q.DL, 0, Q.AC,
|
||||
Q.CxtI, Q.DT);
|
||||
if (!KnownNonNegative)
|
||||
case ICmpInst::ICMP_SLE: {
|
||||
KnownBits Known = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
|
||||
if (!Known.isNonNegative())
|
||||
break;
|
||||
LLVM_FALLTHROUGH;
|
||||
}
|
||||
case ICmpInst::ICMP_EQ:
|
||||
case ICmpInst::ICMP_ULT:
|
||||
case ICmpInst::ICMP_ULE:
|
||||
|
@ -6661,13 +6661,12 @@ ScalarEvolution::ExitLimit ScalarEvolution::computeShiftCompareExitLimit(
|
||||
// {K,ashr,<positive-constant>} stabilizes to signum(K) in at most
|
||||
// bitwidth(K) iterations.
|
||||
Value *FirstValue = PN->getIncomingValueForBlock(Predecessor);
|
||||
bool KnownZero, KnownOne;
|
||||
ComputeSignBit(FirstValue, KnownZero, KnownOne, DL, 0, nullptr,
|
||||
Predecessor->getTerminator(), &DT);
|
||||
KnownBits Known = computeKnownBits(FirstValue, DL, 0, nullptr,
|
||||
Predecessor->getTerminator(), &DT);
|
||||
auto *Ty = cast<IntegerType>(RHS->getType());
|
||||
if (KnownZero)
|
||||
if (Known.isNonNegative())
|
||||
StableValue = ConstantInt::get(Ty, 0);
|
||||
else if (KnownOne)
|
||||
else if (Known.isNegative())
|
||||
StableValue = ConstantInt::get(Ty, -1, true);
|
||||
else
|
||||
return getCouldNotCompute();
|
||||
|
@ -169,15 +169,6 @@ bool llvm::haveNoCommonBitsSet(const Value *LHS, const Value *RHS,
|
||||
}
|
||||
|
||||
|
||||
void llvm::ComputeSignBit(const Value *V, bool &KnownZero, bool &KnownOne,
|
||||
const DataLayout &DL, unsigned Depth,
|
||||
AssumptionCache *AC, const Instruction *CxtI,
|
||||
const DominatorTree *DT) {
|
||||
KnownBits Known = computeKnownBits(V, DL, Depth, AC, CxtI, DT);
|
||||
KnownZero = Known.isNonNegative();
|
||||
KnownOne = Known.isNegative();
|
||||
}
|
||||
|
||||
static bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero, unsigned Depth,
|
||||
const Query &Q);
|
||||
|
||||
|
@ -882,13 +882,9 @@ bool InstCombiner::WillNotOverflowSignedSub(Value *LHS, Value *RHS,
|
||||
bool InstCombiner::WillNotOverflowUnsignedSub(Value *LHS, Value *RHS,
|
||||
Instruction &CxtI) {
|
||||
// If the LHS is negative and the RHS is non-negative, no unsigned wrap.
|
||||
bool LHSKnownNonNegative, LHSKnownNegative;
|
||||
bool RHSKnownNonNegative, RHSKnownNegative;
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, /*Depth=*/0,
|
||||
&CxtI);
|
||||
ComputeSignBit(RHS, RHSKnownNonNegative, RHSKnownNegative, /*Depth=*/0,
|
||||
&CxtI);
|
||||
if (LHSKnownNegative && RHSKnownNonNegative)
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, /*Depth=*/0, &CxtI);
|
||||
KnownBits RHSKnown = computeKnownBits(RHS, /*Depth=*/0, &CxtI);
|
||||
if (LHSKnown.isNegative() && RHSKnown.isNonNegative())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -698,9 +698,8 @@ Value *InstCombiner::simplifyRangeCheck(ICmpInst *Cmp0, ICmpInst *Cmp1,
|
||||
}
|
||||
|
||||
// This simplification is only valid if the upper range is not negative.
|
||||
bool IsNegative, IsNotNegative;
|
||||
ComputeSignBit(RangeEnd, IsNotNegative, IsNegative, /*Depth=*/0, Cmp1);
|
||||
if (!IsNotNegative)
|
||||
KnownBits Known = computeKnownBits(RangeEnd, /*Depth=*/0, Cmp1);
|
||||
if (!Known.isNonNegative())
|
||||
return nullptr;
|
||||
|
||||
if (Inverted)
|
||||
|
@ -1188,9 +1188,8 @@ Instruction *InstCombiner::visitSExt(SExtInst &CI) {
|
||||
|
||||
// If we know that the value being extended is positive, we can use a zext
|
||||
// instead.
|
||||
bool KnownZero, KnownOne;
|
||||
ComputeSignBit(Src, KnownZero, KnownOne, 0, &CI);
|
||||
if (KnownZero) {
|
||||
KnownBits Known = computeKnownBits(Src, 0, &CI);
|
||||
if (Known.isNonNegative()) {
|
||||
Value *ZExt = Builder->CreateZExt(Src, DestTy);
|
||||
return replaceInstUsesWith(CI, ZExt);
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
|
||||
@ -505,6 +506,10 @@ public:
|
||||
unsigned Depth, Instruction *CxtI) const {
|
||||
llvm::computeKnownBits(V, Known, DL, Depth, &AC, CxtI, &DT);
|
||||
}
|
||||
KnownBits computeKnownBits(Value *V, unsigned Depth,
|
||||
Instruction *CxtI) const {
|
||||
return llvm::computeKnownBits(V, DL, Depth, &AC, CxtI, &DT);
|
||||
}
|
||||
|
||||
bool MaskedValueIsZero(Value *V, const APInt &Mask, unsigned Depth = 0,
|
||||
Instruction *CxtI = nullptr) const {
|
||||
@ -514,10 +519,6 @@ public:
|
||||
Instruction *CxtI = nullptr) const {
|
||||
return llvm::ComputeNumSignBits(Op, DL, Depth, &AC, CxtI, &DT);
|
||||
}
|
||||
void ComputeSignBit(Value *V, bool &KnownZero, bool &KnownOne,
|
||||
unsigned Depth = 0, Instruction *CxtI = nullptr) const {
|
||||
llvm::ComputeSignBit(V, KnownZero, KnownOne, DL, Depth, &AC, CxtI, &DT);
|
||||
}
|
||||
OverflowResult computeOverflowForUnsignedMul(Value *LHS, Value *RHS,
|
||||
const Instruction *CxtI) {
|
||||
return llvm::computeOverflowForUnsignedMul(LHS, RHS, DL, &AC, CxtI, &DT);
|
||||
|
@ -885,10 +885,8 @@ static bool canReplaceGEPIdxWithZero(InstCombiner &IC, GetElementPtrInst *GEPI,
|
||||
// first non-zero index.
|
||||
auto IsAllNonNegative = [&]() {
|
||||
for (unsigned i = Idx+1, e = GEPI->getNumOperands(); i != e; ++i) {
|
||||
bool KnownNonNegative, KnownNegative;
|
||||
IC.ComputeSignBit(GEPI->getOperand(i), KnownNonNegative,
|
||||
KnownNegative, 0, MemI);
|
||||
if (KnownNonNegative)
|
||||
KnownBits Known = IC.computeKnownBits(GEPI->getOperand(i), 0, MemI);
|
||||
if (Known.isNonNegative())
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
|
@ -162,11 +162,9 @@ bool InstCombiner::WillNotOverflowSignedMul(Value *LHS, Value *RHS,
|
||||
// product is exactly the minimum negative number.
|
||||
// E.g. mul i16 with 17 sign bits: 0xff00 * 0xff80 = 0x8000
|
||||
// For simplicity we just check if at least one side is not negative.
|
||||
bool LHSNonNegative, LHSNegative;
|
||||
bool RHSNonNegative, RHSNegative;
|
||||
ComputeSignBit(LHS, LHSNonNegative, LHSNegative, /*Depth=*/0, &CxtI);
|
||||
ComputeSignBit(RHS, RHSNonNegative, RHSNegative, /*Depth=*/0, &CxtI);
|
||||
if (LHSNonNegative || RHSNonNegative)
|
||||
KnownBits LHSKnown = computeKnownBits(LHS, /*Depth=*/0, &CxtI);
|
||||
KnownBits RHSKnown = computeKnownBits(RHS, /*Depth=*/0, &CxtI);
|
||||
if (LHSKnown.isNonNegative() || RHSKnown.isNonNegative())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/GraphWriter.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||
#include "llvm/Transforms/Vectorize.h"
|
||||
@ -3695,10 +3696,8 @@ void BoUpSLP::computeMinimumValueSizes() {
|
||||
// Determine if the sign bit of all the roots is known to be zero. If not,
|
||||
// IsKnownPositive is set to False.
|
||||
IsKnownPositive = all_of(TreeRoot, [&](Value *R) {
|
||||
bool KnownZero = false;
|
||||
bool KnownOne = false;
|
||||
ComputeSignBit(R, KnownZero, KnownOne, *DL);
|
||||
return KnownZero;
|
||||
KnownBits Known = computeKnownBits(R, *DL);
|
||||
return Known.isNonNegative();
|
||||
});
|
||||
|
||||
// Determine the maximum number of bits required to store the scalar
|
||||
|
Loading…
Reference in New Issue
Block a user