mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-05 11:17:53 +00:00
Rename ComputeMaskedBits to computeKnownBits. "Masked" has been
inappropriate since it lost its Mask parameter in r154011. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208811 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -44,10 +44,10 @@ static unsigned getBitWidth(Type *Ty, const DataLayout *TD) {
|
||||
return TD ? TD->getPointerTypeSizeInBits(Ty) : 0;
|
||||
}
|
||||
|
||||
static void ComputeMaskedBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
|
||||
APInt &KnownZero, APInt &KnownOne,
|
||||
APInt &KnownZero2, APInt &KnownOne2,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
static void computeKnownBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
|
||||
APInt &KnownZero, APInt &KnownOne,
|
||||
APInt &KnownZero2, APInt &KnownOne2,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
if (!Add) {
|
||||
if (ConstantInt *CLHS = dyn_cast<ConstantInt>(Op0)) {
|
||||
// We know that the top bits of C-X are clear if X contains less bits
|
||||
@@ -58,7 +58,7 @@ static void ComputeMaskedBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
|
||||
unsigned NLZ = (CLHS->getValue()+1).countLeadingZeros();
|
||||
// NLZ can't be BitWidth with no sign bit
|
||||
APInt MaskV = APInt::getHighBitsSet(BitWidth, NLZ+1);
|
||||
llvm::ComputeMaskedBits(Op1, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
llvm::computeKnownBits(Op1, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
|
||||
// If all of the MaskV bits are known to be zero, then we know the
|
||||
// output top bits are zero, because we now know that the output is
|
||||
@@ -79,12 +79,12 @@ static void ComputeMaskedBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
|
||||
// result. For an add, this works with either operand. For a subtract,
|
||||
// this only works if the known zeros are in the right operand.
|
||||
APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
|
||||
llvm::ComputeMaskedBits(Op0, LHSKnownZero, LHSKnownOne, TD, Depth+1);
|
||||
llvm::computeKnownBits(Op0, LHSKnownZero, LHSKnownOne, TD, Depth+1);
|
||||
assert((LHSKnownZero & LHSKnownOne) == 0 &&
|
||||
"Bits known to be one AND zero?");
|
||||
unsigned LHSKnownZeroOut = LHSKnownZero.countTrailingOnes();
|
||||
|
||||
llvm::ComputeMaskedBits(Op1, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
llvm::computeKnownBits(Op1, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
unsigned RHSKnownZeroOut = KnownZero2.countTrailingOnes();
|
||||
|
||||
@@ -130,13 +130,13 @@ static void ComputeMaskedBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
|
||||
}
|
||||
}
|
||||
|
||||
static void ComputeMaskedBitsMul(Value *Op0, Value *Op1, bool NSW,
|
||||
APInt &KnownZero, APInt &KnownOne,
|
||||
APInt &KnownZero2, APInt &KnownOne2,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
static void computeKnownBitsMul(Value *Op0, Value *Op1, bool NSW,
|
||||
APInt &KnownZero, APInt &KnownOne,
|
||||
APInt &KnownZero2, APInt &KnownOne2,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
unsigned BitWidth = KnownZero.getBitWidth();
|
||||
ComputeMaskedBits(Op1, KnownZero, KnownOne, TD, Depth+1);
|
||||
ComputeMaskedBits(Op0, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(Op1, KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(Op0, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
@@ -192,7 +192,7 @@ static void ComputeMaskedBitsMul(Value *Op0, Value *Op1, bool NSW,
|
||||
KnownOne.setBit(BitWidth - 1);
|
||||
}
|
||||
|
||||
void llvm::computeMaskedBitsLoad(const MDNode &Ranges, APInt &KnownZero) {
|
||||
void llvm::computeKnownBitsLoad(const MDNode &Ranges, APInt &KnownZero) {
|
||||
unsigned BitWidth = KnownZero.getBitWidth();
|
||||
unsigned NumRanges = Ranges.getNumOperands() / 2;
|
||||
assert(NumRanges >= 1);
|
||||
@@ -211,8 +211,8 @@ void llvm::computeMaskedBitsLoad(const MDNode &Ranges, APInt &KnownZero) {
|
||||
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, MinLeadingZeros);
|
||||
}
|
||||
/// ComputeMaskedBits - Determine which bits of V are known to be either zero
|
||||
/// or one and return them in the KnownZero/KnownOne bit sets.
|
||||
/// Determine which bits of V are known to be either zero or one and return
|
||||
/// them in the KnownZero/KnownOne bit sets.
|
||||
///
|
||||
/// NOTE: we cannot consider 'undef' to be "IsZero" here. The problem is that
|
||||
/// we cannot optimize based on the assumption that it is zero without changing
|
||||
@@ -226,8 +226,8 @@ void llvm::computeMaskedBitsLoad(const MDNode &Ranges, APInt &KnownZero) {
|
||||
/// where V is a vector, known zero, and known one values are the
|
||||
/// same width as the vector element, and the bit is set only if it is true
|
||||
/// for all of the elements in the vector.
|
||||
void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
assert(V && "No Value?");
|
||||
assert(Depth <= MaxDepth && "Limit Search Depth");
|
||||
unsigned BitWidth = KnownZero.getBitWidth();
|
||||
@@ -303,7 +303,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
if (GA->mayBeOverridden()) {
|
||||
KnownZero.clearAllBits(); KnownOne.clearAllBits();
|
||||
} else {
|
||||
ComputeMaskedBits(GA->getAliasee(), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(GA->getAliasee(), KnownZero, KnownOne, TD, Depth+1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -341,12 +341,12 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
default: break;
|
||||
case Instruction::Load:
|
||||
if (MDNode *MD = cast<LoadInst>(I)->getMetadata(LLVMContext::MD_range))
|
||||
computeMaskedBitsLoad(*MD, KnownZero);
|
||||
computeKnownBitsLoad(*MD, KnownZero);
|
||||
return;
|
||||
case Instruction::And: {
|
||||
// If either the LHS or the RHS are Zero, the result is zero.
|
||||
ComputeMaskedBits(I->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
@@ -357,8 +357,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
return;
|
||||
}
|
||||
case Instruction::Or: {
|
||||
ComputeMaskedBits(I->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
@@ -369,8 +369,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
return;
|
||||
}
|
||||
case Instruction::Xor: {
|
||||
ComputeMaskedBits(I->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
@@ -383,7 +383,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
}
|
||||
case Instruction::Mul: {
|
||||
bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
|
||||
ComputeMaskedBitsMul(I->getOperand(0), I->getOperand(1), NSW,
|
||||
computeKnownBitsMul(I->getOperand(0), I->getOperand(1), NSW,
|
||||
KnownZero, KnownOne, KnownZero2, KnownOne2, TD, Depth);
|
||||
break;
|
||||
}
|
||||
@@ -391,12 +391,12 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// For the purposes of computing leading zeros we can conservatively
|
||||
// treat a udiv as a logical right shift by the power of 2 known to
|
||||
// be less than the denominator.
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
unsigned LeadZ = KnownZero2.countLeadingOnes();
|
||||
|
||||
KnownOne2.clearAllBits();
|
||||
KnownZero2.clearAllBits();
|
||||
ComputeMaskedBits(I->getOperand(1), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(1), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
unsigned RHSUnknownLeadingOnes = KnownOne2.countLeadingZeros();
|
||||
if (RHSUnknownLeadingOnes != BitWidth)
|
||||
LeadZ = std::min(BitWidth,
|
||||
@@ -406,8 +406,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
return;
|
||||
}
|
||||
case Instruction::Select:
|
||||
ComputeMaskedBits(I->getOperand(2), KnownZero, KnownOne, TD, Depth+1);
|
||||
ComputeMaskedBits(I->getOperand(1), KnownZero2, KnownOne2, TD,
|
||||
computeKnownBits(I->getOperand(2), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(1), KnownZero2, KnownOne2, TD,
|
||||
Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
@@ -445,7 +445,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
assert(SrcBitWidth && "SrcBitWidth can't be zero");
|
||||
KnownZero = KnownZero.zextOrTrunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.zextOrTrunc(SrcBitWidth);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
KnownZero = KnownZero.zextOrTrunc(BitWidth);
|
||||
KnownOne = KnownOne.zextOrTrunc(BitWidth);
|
||||
// Any top bits are known to be zero.
|
||||
@@ -459,7 +459,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// TODO: For now, not handling conversions like:
|
||||
// (bitcast i64 %x to <2 x i32>)
|
||||
!I->getType()->isVectorTy()) {
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -470,7 +470,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
|
||||
KnownZero = KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.trunc(SrcBitWidth);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
@@ -487,7 +487,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0
|
||||
if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
uint64_t ShiftAmt = SA->getLimitedValue(BitWidth);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero <<= ShiftAmt;
|
||||
KnownOne <<= ShiftAmt;
|
||||
@@ -502,7 +502,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
uint64_t ShiftAmt = SA->getLimitedValue(BitWidth);
|
||||
|
||||
// Unsigned shift right.
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero,KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero,KnownOne, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero = APIntOps::lshr(KnownZero, ShiftAmt);
|
||||
KnownOne = APIntOps::lshr(KnownOne, ShiftAmt);
|
||||
@@ -518,7 +518,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
uint64_t ShiftAmt = SA->getLimitedValue(BitWidth-1);
|
||||
|
||||
// Signed shift right.
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero = APIntOps::lshr(KnownZero, ShiftAmt);
|
||||
KnownOne = APIntOps::lshr(KnownOne, ShiftAmt);
|
||||
@@ -533,14 +533,14 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
break;
|
||||
case Instruction::Sub: {
|
||||
bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
|
||||
ComputeMaskedBitsAddSub(false, I->getOperand(0), I->getOperand(1), NSW,
|
||||
computeKnownBitsAddSub(false, I->getOperand(0), I->getOperand(1), NSW,
|
||||
KnownZero, KnownOne, KnownZero2, KnownOne2, TD,
|
||||
Depth);
|
||||
break;
|
||||
}
|
||||
case Instruction::Add: {
|
||||
bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
|
||||
ComputeMaskedBitsAddSub(true, I->getOperand(0), I->getOperand(1), NSW,
|
||||
computeKnownBitsAddSub(true, I->getOperand(0), I->getOperand(1), NSW,
|
||||
KnownZero, KnownOne, KnownZero2, KnownOne2, TD,
|
||||
Depth);
|
||||
break;
|
||||
@@ -550,7 +550,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
APInt RA = Rem->getValue().abs();
|
||||
if (RA.isPowerOf2()) {
|
||||
APInt LowBits = RA - 1;
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
|
||||
// The low bits of the first operand are unchanged by the srem.
|
||||
KnownZero = KnownZero2 & LowBits;
|
||||
@@ -574,8 +574,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// remainder is zero.
|
||||
if (KnownZero.isNonNegative()) {
|
||||
APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(I->getOperand(0), LHSKnownZero, LHSKnownOne, TD,
|
||||
Depth+1);
|
||||
computeKnownBits(I->getOperand(0), LHSKnownZero, LHSKnownOne, TD,
|
||||
Depth+1);
|
||||
// If it's known zero, our sign bit is also zero.
|
||||
if (LHSKnownZero.isNegative())
|
||||
KnownZero.setBit(BitWidth - 1);
|
||||
@@ -587,8 +587,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
APInt RA = Rem->getValue();
|
||||
if (RA.isPowerOf2()) {
|
||||
APInt LowBits = (RA - 1);
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD,
|
||||
Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD,
|
||||
Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero |= ~LowBits;
|
||||
KnownOne &= LowBits;
|
||||
@@ -598,8 +598,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
|
||||
// Since the result is less than or equal to either operand, any leading
|
||||
// zero bits in either operand must also exist in the result.
|
||||
ComputeMaskedBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
ComputeMaskedBits(I->getOperand(1), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(I->getOperand(1), KnownZero2, KnownOne2, TD, Depth+1);
|
||||
|
||||
unsigned Leaders = std::max(KnownZero.countLeadingOnes(),
|
||||
KnownZero2.countLeadingOnes());
|
||||
@@ -622,8 +622,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// Analyze all of the subscripts of this getelementptr instruction
|
||||
// to determine if we can prove known low zero bits.
|
||||
APInt LocalKnownZero(BitWidth, 0), LocalKnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(I->getOperand(0), LocalKnownZero, LocalKnownOne, TD,
|
||||
Depth+1);
|
||||
computeKnownBits(I->getOperand(0), LocalKnownZero, LocalKnownOne, TD,
|
||||
Depth+1);
|
||||
unsigned TrailZ = LocalKnownZero.countTrailingOnes();
|
||||
|
||||
gep_type_iterator GTI = gep_type_begin(I);
|
||||
@@ -654,7 +654,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
unsigned GEPOpiBits = Index->getType()->getScalarSizeInBits();
|
||||
uint64_t TypeSize = TD ? TD->getTypeAllocSize(IndexedTy) : 1;
|
||||
LocalKnownZero = LocalKnownOne = APInt(GEPOpiBits, 0);
|
||||
ComputeMaskedBits(Index, LocalKnownZero, LocalKnownOne, TD, Depth+1);
|
||||
computeKnownBits(Index, LocalKnownZero, LocalKnownOne, TD, Depth+1);
|
||||
TrailZ = std::min(TrailZ,
|
||||
unsigned(countTrailingZeros(TypeSize) +
|
||||
LocalKnownZero.countTrailingOnes()));
|
||||
@@ -696,11 +696,11 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
break;
|
||||
// Ok, we have a PHI of the form L op= R. Check for low
|
||||
// zero bits.
|
||||
ComputeMaskedBits(R, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
computeKnownBits(R, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
|
||||
// We need to take the minimum number of known bits
|
||||
APInt KnownZero3(KnownZero), KnownOne3(KnownOne);
|
||||
ComputeMaskedBits(L, KnownZero3, KnownOne3, TD, Depth+1);
|
||||
computeKnownBits(L, KnownZero3, KnownOne3, TD, Depth+1);
|
||||
|
||||
KnownZero = APInt::getLowBitsSet(BitWidth,
|
||||
std::min(KnownZero2.countTrailingOnes(),
|
||||
@@ -731,8 +731,8 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
KnownOne2 = APInt(BitWidth, 0);
|
||||
// Recurse, but cap the recursion to one level, because we don't
|
||||
// want to waste time spinning around in loops.
|
||||
ComputeMaskedBits(P->getIncomingValue(i), KnownZero2, KnownOne2, TD,
|
||||
MaxDepth-1);
|
||||
computeKnownBits(P->getIncomingValue(i), KnownZero2, KnownOne2, TD,
|
||||
MaxDepth-1);
|
||||
KnownZero &= KnownZero2;
|
||||
KnownOne &= KnownOne2;
|
||||
// If all bits have been ruled out, there's no need to check
|
||||
@@ -776,21 +776,21 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
default: break;
|
||||
case Intrinsic::uadd_with_overflow:
|
||||
case Intrinsic::sadd_with_overflow:
|
||||
ComputeMaskedBitsAddSub(true, II->getArgOperand(0),
|
||||
II->getArgOperand(1), false, KnownZero,
|
||||
KnownOne, KnownZero2, KnownOne2, TD, Depth);
|
||||
computeKnownBitsAddSub(true, II->getArgOperand(0),
|
||||
II->getArgOperand(1), false, KnownZero,
|
||||
KnownOne, KnownZero2, KnownOne2, TD, Depth);
|
||||
break;
|
||||
case Intrinsic::usub_with_overflow:
|
||||
case Intrinsic::ssub_with_overflow:
|
||||
ComputeMaskedBitsAddSub(false, II->getArgOperand(0),
|
||||
II->getArgOperand(1), false, KnownZero,
|
||||
KnownOne, KnownZero2, KnownOne2, TD, Depth);
|
||||
computeKnownBitsAddSub(false, II->getArgOperand(0),
|
||||
II->getArgOperand(1), false, KnownZero,
|
||||
KnownOne, KnownZero2, KnownOne2, TD, Depth);
|
||||
break;
|
||||
case Intrinsic::umul_with_overflow:
|
||||
case Intrinsic::smul_with_overflow:
|
||||
ComputeMaskedBitsMul(II->getArgOperand(0), II->getArgOperand(1),
|
||||
false, KnownZero, KnownOne,
|
||||
KnownZero2, KnownOne2, TD, Depth);
|
||||
computeKnownBitsMul(II->getArgOperand(0), II->getArgOperand(1),
|
||||
false, KnownZero, KnownOne,
|
||||
KnownZero2, KnownOne2, TD, Depth);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -799,7 +799,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
}
|
||||
|
||||
/// ComputeSignBit - Determine whether the sign bit is known to be zero or
|
||||
/// one. Convenience wrapper around ComputeMaskedBits.
|
||||
/// one. Convenience wrapper around computeKnownBits.
|
||||
void llvm::ComputeSignBit(Value *V, bool &KnownZero, bool &KnownOne,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
unsigned BitWidth = getBitWidth(V->getType(), TD);
|
||||
@@ -810,7 +810,7 @@ void llvm::ComputeSignBit(Value *V, bool &KnownZero, bool &KnownOne,
|
||||
}
|
||||
APInt ZeroBits(BitWidth, 0);
|
||||
APInt OneBits(BitWidth, 0);
|
||||
ComputeMaskedBits(V, ZeroBits, OneBits, TD, Depth);
|
||||
computeKnownBits(V, ZeroBits, OneBits, TD, Depth);
|
||||
KnownOne = OneBits[BitWidth - 1];
|
||||
KnownZero = ZeroBits[BitWidth - 1];
|
||||
}
|
||||
@@ -882,10 +882,10 @@ bool llvm::isKnownToBeAPowerOfTwo(Value *V, bool OrZero, unsigned Depth) {
|
||||
|
||||
unsigned BitWidth = V->getType()->getScalarSizeInBits();
|
||||
APInt LHSZeroBits(BitWidth, 0), LHSOneBits(BitWidth, 0);
|
||||
ComputeMaskedBits(X, LHSZeroBits, LHSOneBits, nullptr, Depth);
|
||||
computeKnownBits(X, LHSZeroBits, LHSOneBits, nullptr, Depth);
|
||||
|
||||
APInt RHSZeroBits(BitWidth, 0), RHSOneBits(BitWidth, 0);
|
||||
ComputeMaskedBits(Y, RHSZeroBits, RHSOneBits, nullptr, Depth);
|
||||
computeKnownBits(Y, RHSZeroBits, RHSOneBits, nullptr, Depth);
|
||||
// If i8 V is a power of two or zero:
|
||||
// ZeroBits: 1 1 1 0 1 1 1 1
|
||||
// ~ZeroBits: 0 0 0 1 0 0 0 0
|
||||
@@ -1023,7 +1023,7 @@ bool llvm::isKnownNonZero(Value *V, const DataLayout *TD, unsigned Depth) {
|
||||
|
||||
APInt KnownZero(BitWidth, 0);
|
||||
APInt KnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(X, KnownZero, KnownOne, TD, Depth);
|
||||
computeKnownBits(X, KnownZero, KnownOne, TD, Depth);
|
||||
if (KnownOne[0])
|
||||
return true;
|
||||
}
|
||||
@@ -1065,12 +1065,12 @@ bool llvm::isKnownNonZero(Value *V, const DataLayout *TD, unsigned Depth) {
|
||||
APInt Mask = APInt::getSignedMaxValue(BitWidth);
|
||||
// The sign bit of X is set. If some other bit is set then X is not equal
|
||||
// to INT_MIN.
|
||||
ComputeMaskedBits(X, KnownZero, KnownOne, TD, Depth);
|
||||
computeKnownBits(X, KnownZero, KnownOne, TD, Depth);
|
||||
if ((KnownOne & Mask) != 0)
|
||||
return true;
|
||||
// The sign bit of Y is set. If some other bit is set then Y is not equal
|
||||
// to INT_MIN.
|
||||
ComputeMaskedBits(Y, KnownZero, KnownOne, TD, Depth);
|
||||
computeKnownBits(Y, KnownZero, KnownOne, TD, Depth);
|
||||
if ((KnownOne & Mask) != 0)
|
||||
return true;
|
||||
}
|
||||
@@ -1100,7 +1100,7 @@ bool llvm::isKnownNonZero(Value *V, const DataLayout *TD, unsigned Depth) {
|
||||
if (!BitWidth) return false;
|
||||
APInt KnownZero(BitWidth, 0);
|
||||
APInt KnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
computeKnownBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
return KnownOne != 0;
|
||||
}
|
||||
|
||||
@@ -1116,7 +1116,7 @@ bool llvm::isKnownNonZero(Value *V, const DataLayout *TD, unsigned Depth) {
|
||||
bool llvm::MaskedValueIsZero(Value *V, const APInt &Mask,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
APInt KnownZero(Mask.getBitWidth(), 0), KnownOne(Mask.getBitWidth(), 0);
|
||||
ComputeMaskedBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
computeKnownBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
return (KnownZero & Mask) == Mask;
|
||||
}
|
||||
@@ -1142,7 +1142,7 @@ unsigned llvm::ComputeNumSignBits(Value *V, const DataLayout *TD,
|
||||
unsigned Tmp, Tmp2;
|
||||
unsigned FirstAnswer = 1;
|
||||
|
||||
// Note that ConstantInt is handled by the general ComputeMaskedBits case
|
||||
// Note that ConstantInt is handled by the general computeKnownBits case
|
||||
// below.
|
||||
|
||||
if (Depth == 6)
|
||||
@@ -1187,7 +1187,7 @@ unsigned llvm::ComputeNumSignBits(Value *V, const DataLayout *TD,
|
||||
FirstAnswer = std::min(Tmp, Tmp2);
|
||||
// We computed what we know about the sign bits as our first
|
||||
// answer. Now proceed to the generic code that uses
|
||||
// ComputeMaskedBits, and pick whichever answer is better.
|
||||
// computeKnownBits, and pick whichever answer is better.
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1207,7 +1207,7 @@ unsigned llvm::ComputeNumSignBits(Value *V, const DataLayout *TD,
|
||||
if (ConstantInt *CRHS = dyn_cast<ConstantInt>(U->getOperand(1)))
|
||||
if (CRHS->isAllOnesValue()) {
|
||||
APInt KnownZero(TyBits, 0), KnownOne(TyBits, 0);
|
||||
ComputeMaskedBits(U->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(U->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
|
||||
// If the input is known to be 0 or 1, the output is 0/-1, which is all
|
||||
// sign bits set.
|
||||
@@ -1232,7 +1232,7 @@ unsigned llvm::ComputeNumSignBits(Value *V, const DataLayout *TD,
|
||||
if (ConstantInt *CLHS = dyn_cast<ConstantInt>(U->getOperand(0)))
|
||||
if (CLHS->isNullValue()) {
|
||||
APInt KnownZero(TyBits, 0), KnownOne(TyBits, 0);
|
||||
ComputeMaskedBits(U->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
computeKnownBits(U->getOperand(1), KnownZero, KnownOne, TD, Depth+1);
|
||||
// If the input is known to be 0 or 1, the output is 0/-1, which is all
|
||||
// sign bits set.
|
||||
if ((KnownZero | APInt(TyBits, 1)).isAllOnesValue())
|
||||
@@ -1278,7 +1278,7 @@ unsigned llvm::ComputeNumSignBits(Value *V, const DataLayout *TD,
|
||||
// use this information.
|
||||
APInt KnownZero(TyBits, 0), KnownOne(TyBits, 0);
|
||||
APInt Mask;
|
||||
ComputeMaskedBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
computeKnownBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
|
||||
if (KnownZero.isNegative()) { // sign bit is 0
|
||||
Mask = KnownZero;
|
||||
@@ -2001,7 +2001,7 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
||||
return false;
|
||||
APInt KnownZero(BitWidth, 0);
|
||||
APInt KnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(Op, KnownZero, KnownOne, TD);
|
||||
computeKnownBits(Op, KnownZero, KnownOne, TD);
|
||||
return !!KnownZero;
|
||||
}
|
||||
case Instruction::Load: {
|
||||
|
Reference in New Issue
Block a user