mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-16 05:41:45 +00:00
Instead of littering asserts throughout the code after every call to
computeKnownBits, consolidate them into one assert at the end of computeKnownBits itself. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208876 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0a088b1fc5
commit
b7ba5c2e2e
@ -80,12 +80,9 @@ static void computeKnownBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
|
||||
// this only works if the known zeros are in the right operand.
|
||||
APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
|
||||
llvm::computeKnownBits(Op0, LHSKnownZero, LHSKnownOne, TD, Depth+1);
|
||||
assert((LHSKnownZero & LHSKnownOne) == 0 &&
|
||||
"Bits known to be one AND zero?");
|
||||
unsigned LHSKnownZeroOut = LHSKnownZero.countTrailingOnes();
|
||||
|
||||
llvm::computeKnownBits(Op1, KnownZero2, KnownOne2, TD, Depth+1);
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
unsigned RHSKnownZeroOut = KnownZero2.countTrailingOnes();
|
||||
|
||||
// Determine which operand has more trailing zeros, and use that
|
||||
@ -137,8 +134,6 @@ static void computeKnownBitsMul(Value *Op0, Value *Op1, bool NSW,
|
||||
unsigned BitWidth = KnownZero.getBitWidth();
|
||||
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?");
|
||||
|
||||
bool isKnownNegative = false;
|
||||
bool isKnownNonNegative = false;
|
||||
@ -211,6 +206,7 @@ void llvm::computeKnownBitsLoad(const MDNode &Ranges, APInt &KnownZero) {
|
||||
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, MinLeadingZeros);
|
||||
}
|
||||
|
||||
/// Determine which bits of V are known to be either zero or one and return
|
||||
/// them in the KnownZero/KnownOne bit sets.
|
||||
///
|
||||
@ -342,44 +338,38 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
case Instruction::Load:
|
||||
if (MDNode *MD = cast<LoadInst>(I)->getMetadata(LLVMContext::MD_range))
|
||||
computeKnownBitsLoad(*MD, KnownZero);
|
||||
return;
|
||||
break;
|
||||
case Instruction::And: {
|
||||
// If either the LHS or the RHS are Zero, the result is zero.
|
||||
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?");
|
||||
|
||||
// Output known-1 bits are only known if set in both the LHS & RHS.
|
||||
KnownOne &= KnownOne2;
|
||||
// Output known-0 are known to be clear if zero in either the LHS | RHS.
|
||||
KnownZero |= KnownZero2;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case Instruction::Or: {
|
||||
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?");
|
||||
|
||||
// Output known-0 bits are only known if clear in both the LHS & RHS.
|
||||
KnownZero &= KnownZero2;
|
||||
// Output known-1 are known to be set if set in either the LHS | RHS.
|
||||
KnownOne |= KnownOne2;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case Instruction::Xor: {
|
||||
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?");
|
||||
|
||||
// Output known-0 bits are known if clear or set in both the LHS & RHS.
|
||||
APInt KnownZeroOut = (KnownZero & KnownZero2) | (KnownOne & KnownOne2);
|
||||
// Output known-1 are known to be set if set in only one of the LHS, RHS.
|
||||
KnownOne = (KnownZero & KnownOne2) | (KnownOne & KnownZero2);
|
||||
KnownZero = KnownZeroOut;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case Instruction::Mul: {
|
||||
bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
|
||||
@ -403,30 +393,28 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
LeadZ + BitWidth - RHSUnknownLeadingOnes - 1);
|
||||
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, LeadZ);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case Instruction::Select:
|
||||
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?");
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
KnownOne &= KnownOne2;
|
||||
KnownZero &= KnownZero2;
|
||||
return;
|
||||
break;
|
||||
case Instruction::FPTrunc:
|
||||
case Instruction::FPExt:
|
||||
case Instruction::FPToUI:
|
||||
case Instruction::FPToSI:
|
||||
case Instruction::SIToFP:
|
||||
case Instruction::UIToFP:
|
||||
return; // Can't work with floating point.
|
||||
break; // Can't work with floating point.
|
||||
case Instruction::PtrToInt:
|
||||
case Instruction::IntToPtr:
|
||||
// We can't handle these if we don't know the pointer size.
|
||||
if (!TD) return;
|
||||
if (!TD) break;
|
||||
// FALL THROUGH and handle them the same as zext/trunc.
|
||||
case Instruction::ZExt:
|
||||
case Instruction::Trunc: {
|
||||
@ -439,7 +427,7 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
SrcBitWidth = TD->getTypeSizeInBits(SrcTy->getScalarType());
|
||||
} else {
|
||||
SrcBitWidth = SrcTy->getScalarSizeInBits();
|
||||
if (!SrcBitWidth) return;
|
||||
if (!SrcBitWidth) break;
|
||||
}
|
||||
|
||||
assert(SrcBitWidth && "SrcBitWidth can't be zero");
|
||||
@ -451,7 +439,7 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// Any top bits are known to be zero.
|
||||
if (BitWidth > SrcBitWidth)
|
||||
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - SrcBitWidth);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case Instruction::BitCast: {
|
||||
Type *SrcTy = I->getOperand(0)->getType();
|
||||
@ -460,7 +448,7 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
// (bitcast i64 %x to <2 x i32>)
|
||||
!I->getType()->isVectorTy()) {
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -471,7 +459,6 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
KnownZero = KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.trunc(SrcBitWidth);
|
||||
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);
|
||||
|
||||
@ -481,18 +468,17 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - SrcBitWidth);
|
||||
else if (KnownOne[SrcBitWidth-1]) // Input sign bit known set
|
||||
KnownOne |= APInt::getHighBitsSet(BitWidth, BitWidth - SrcBitWidth);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case Instruction::Shl:
|
||||
// (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);
|
||||
computeKnownBits(I->getOperand(0), KnownZero, KnownOne, TD, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero <<= ShiftAmt;
|
||||
KnownOne <<= ShiftAmt;
|
||||
KnownZero |= APInt::getLowBitsSet(BitWidth, ShiftAmt); // low bits known 0
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Instruction::LShr:
|
||||
@ -503,12 +489,11 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
|
||||
// Unsigned shift right.
|
||||
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);
|
||||
// high bits known zero.
|
||||
KnownZero |= APInt::getHighBitsSet(BitWidth, ShiftAmt);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Instruction::AShr:
|
||||
@ -519,7 +504,6 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
|
||||
// Signed shift right.
|
||||
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);
|
||||
|
||||
@ -528,7 +512,7 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
KnownZero |= HighBits;
|
||||
else if (KnownOne[BitWidth-ShiftAmt-1]) // New bits are known one.
|
||||
KnownOne |= HighBits;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Instruction::Sub: {
|
||||
@ -589,7 +573,6 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
APInt LowBits = (RA - 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;
|
||||
break;
|
||||
@ -631,8 +614,10 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
Value *Index = I->getOperand(i);
|
||||
if (StructType *STy = dyn_cast<StructType>(*GTI)) {
|
||||
// Handle struct member offset arithmetic.
|
||||
if (!TD)
|
||||
return;
|
||||
if (!TD) {
|
||||
TrailZ = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
// Handle case when index is vector zeroinitializer
|
||||
Constant *CIndex = cast<Constant>(Index);
|
||||
@ -650,7 +635,10 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
} else {
|
||||
// Handle array index arithmetic.
|
||||
Type *IndexedTy = GTI.getIndexedType();
|
||||
if (!IndexedTy->isSized()) return;
|
||||
if (!IndexedTy->isSized()) {
|
||||
TrailZ = 0;
|
||||
break;
|
||||
}
|
||||
unsigned GEPOpiBits = Index->getType()->getScalarSizeInBits();
|
||||
uint64_t TypeSize = TD ? TD->getTypeAllocSize(IndexedTy) : 1;
|
||||
LocalKnownZero = LocalKnownOne = APInt(GEPOpiBits, 0);
|
||||
@ -712,7 +700,7 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
|
||||
// Unreachable blocks may have zero-operand PHI nodes.
|
||||
if (P->getNumIncomingValues() == 0)
|
||||
return;
|
||||
break;
|
||||
|
||||
// Otherwise take the unions of the known bit sets of the operands,
|
||||
// taking conservative care to avoid excessive recursion.
|
||||
@ -796,6 +784,8 @@ void llvm::computeKnownBits(Value *V, APInt &KnownZero, APInt &KnownOne,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
}
|
||||
|
||||
/// ComputeSignBit - Determine whether the sign bit is known to be zero or
|
||||
@ -1117,7 +1107,6 @@ bool llvm::MaskedValueIsZero(Value *V, const APInt &Mask,
|
||||
const DataLayout *TD, unsigned Depth) {
|
||||
APInt KnownZero(Mask.getBitWidth(), 0), KnownOne(Mask.getBitWidth(), 0);
|
||||
computeKnownBits(V, KnownZero, KnownOne, TD, Depth);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
return (KnownZero & Mask) == Mask;
|
||||
}
|
||||
|
||||
|
@ -1808,7 +1808,6 @@ bool SelectionDAG::MaskedValueIsZero(SDValue Op, const APInt &Mask,
|
||||
unsigned Depth) const {
|
||||
APInt KnownZero, KnownOne;
|
||||
computeKnownBits(Op, KnownZero, KnownOne, Depth);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
return (KnownZero & Mask) == Mask;
|
||||
}
|
||||
|
||||
@ -1830,48 +1829,40 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
// We know all of the bits for a constant!
|
||||
KnownOne = cast<ConstantSDNode>(Op)->getAPIntValue();
|
||||
KnownZero = ~KnownOne;
|
||||
return;
|
||||
break;
|
||||
case ISD::AND:
|
||||
// If either the LHS or the RHS are Zero, the result is zero.
|
||||
computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
|
||||
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// Output known-1 bits are only known if set in both the LHS & RHS.
|
||||
KnownOne &= KnownOne2;
|
||||
// Output known-0 are known to be clear if zero in either the LHS | RHS.
|
||||
KnownZero |= KnownZero2;
|
||||
return;
|
||||
break;
|
||||
case ISD::OR:
|
||||
computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
|
||||
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// Output known-0 bits are only known if clear in both the LHS & RHS.
|
||||
KnownZero &= KnownZero2;
|
||||
// Output known-1 are known to be set if set in either the LHS | RHS.
|
||||
KnownOne |= KnownOne2;
|
||||
return;
|
||||
break;
|
||||
case ISD::XOR: {
|
||||
computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
|
||||
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// Output known-0 bits are known if clear or set in both the LHS & RHS.
|
||||
APInt KnownZeroOut = (KnownZero & KnownZero2) | (KnownOne & KnownOne2);
|
||||
// Output known-1 are known to be set if set in only one of the LHS, RHS.
|
||||
KnownOne = (KnownZero & KnownOne2) | (KnownOne & KnownZero2);
|
||||
KnownZero = KnownZeroOut;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::MUL: {
|
||||
computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
|
||||
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// If low bits are zero in either operand, output low known-0 bits.
|
||||
// Also compute a conserative estimate for high known-0 bits.
|
||||
@ -1888,7 +1879,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
LeadZ = std::min(LeadZ, BitWidth);
|
||||
KnownZero = APInt::getLowBitsSet(BitWidth, TrailZ) |
|
||||
APInt::getHighBitsSet(BitWidth, LeadZ);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::UDIV: {
|
||||
// For the purposes of computing leading zeros we can conservatively
|
||||
@ -1906,28 +1897,24 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
LeadZ + BitWidth - RHSUnknownLeadingOnes - 1);
|
||||
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, LeadZ);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::SELECT:
|
||||
computeKnownBits(Op.getOperand(2), KnownZero, KnownOne, Depth+1);
|
||||
computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
KnownOne &= KnownOne2;
|
||||
KnownZero &= KnownZero2;
|
||||
return;
|
||||
break;
|
||||
case ISD::SELECT_CC:
|
||||
computeKnownBits(Op.getOperand(3), KnownZero, KnownOne, Depth+1);
|
||||
computeKnownBits(Op.getOperand(2), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
KnownOne &= KnownOne2;
|
||||
KnownZero &= KnownZero2;
|
||||
return;
|
||||
break;
|
||||
case ISD::SADDO:
|
||||
case ISD::UADDO:
|
||||
case ISD::SSUBO:
|
||||
@ -1935,14 +1922,14 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
case ISD::SMULO:
|
||||
case ISD::UMULO:
|
||||
if (Op.getResNo() != 1)
|
||||
return;
|
||||
break;
|
||||
// The boolean result conforms to getBooleanContents. Fall through.
|
||||
case ISD::SETCC:
|
||||
// If we know the result of a setcc has the top bits zero, use this info.
|
||||
if (TLI->getBooleanContents(Op.getValueType().isVector()) ==
|
||||
TargetLowering::ZeroOrOneBooleanContent && BitWidth > 1)
|
||||
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1);
|
||||
return;
|
||||
break;
|
||||
case ISD::SHL:
|
||||
// (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0
|
||||
if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||
@ -1950,16 +1937,15 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
|
||||
// If the shift count is an invalid immediate, don't do anything.
|
||||
if (ShAmt >= BitWidth)
|
||||
return;
|
||||
break;
|
||||
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero <<= ShAmt;
|
||||
KnownOne <<= ShAmt;
|
||||
// low bits known zero.
|
||||
KnownZero |= APInt::getLowBitsSet(BitWidth, ShAmt);
|
||||
}
|
||||
return;
|
||||
break;
|
||||
case ISD::SRL:
|
||||
// (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0
|
||||
if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||
@ -1967,31 +1953,29 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
|
||||
// If the shift count is an invalid immediate, don't do anything.
|
||||
if (ShAmt >= BitWidth)
|
||||
return;
|
||||
break;
|
||||
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero = KnownZero.lshr(ShAmt);
|
||||
KnownOne = KnownOne.lshr(ShAmt);
|
||||
|
||||
APInt HighBits = APInt::getHighBitsSet(BitWidth, ShAmt);
|
||||
KnownZero |= HighBits; // High bits known zero.
|
||||
}
|
||||
return;
|
||||
break;
|
||||
case ISD::SRA:
|
||||
if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||
unsigned ShAmt = SA->getZExtValue();
|
||||
|
||||
// If the shift count is an invalid immediate, don't do anything.
|
||||
if (ShAmt >= BitWidth)
|
||||
return;
|
||||
break;
|
||||
|
||||
// If any of the demanded bits are produced by the sign extension, we also
|
||||
// demand the input sign bit.
|
||||
APInt HighBits = APInt::getHighBitsSet(BitWidth, ShAmt);
|
||||
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero = KnownZero.lshr(ShAmt);
|
||||
KnownOne = KnownOne.lshr(ShAmt);
|
||||
|
||||
@ -2005,7 +1989,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
KnownOne |= HighBits; // New bits are known one.
|
||||
}
|
||||
}
|
||||
return;
|
||||
break;
|
||||
case ISD::SIGN_EXTEND_INREG: {
|
||||
EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
|
||||
unsigned EBits = EVT.getScalarType().getSizeInBits();
|
||||
@ -2026,7 +2010,6 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
KnownOne &= InputDemandedBits;
|
||||
KnownZero &= InputDemandedBits;
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// If the sign bit of the input is known set or clear, then we know the
|
||||
// top bits of the result.
|
||||
@ -2040,7 +2023,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
KnownZero &= ~NewBits;
|
||||
KnownOne &= ~NewBits;
|
||||
}
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
@ -2050,7 +2033,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
unsigned LowBits = Log2_32(BitWidth)+1;
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - LowBits);
|
||||
KnownOne.clearAllBits();
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::LOAD: {
|
||||
LoadSDNode *LD = cast<LoadSDNode>(Op);
|
||||
@ -2062,7 +2045,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
} else if (const MDNode *Ranges = LD->getRanges()) {
|
||||
computeKnownBitsLoad(*Ranges, KnownZero);
|
||||
}
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::ZERO_EXTEND: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
@ -2074,7 +2057,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
KnownZero |= NewBits;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::SIGN_EXTEND: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
@ -2088,8 +2071,6 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
// Note if the sign bit is known to be zero or one.
|
||||
bool SignBitKnownZero = KnownZero.isNegative();
|
||||
bool SignBitKnownOne = KnownOne.isNegative();
|
||||
assert(!(SignBitKnownZero && SignBitKnownOne) &&
|
||||
"Sign bit can't be known to be both zero and one!");
|
||||
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
@ -2099,7 +2080,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
KnownZero |= NewBits;
|
||||
else if (SignBitKnownOne)
|
||||
KnownOne |= NewBits;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::ANY_EXTEND: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
@ -2109,7 +2090,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::TRUNCATE: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
@ -2117,7 +2098,6 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
KnownZero = KnownZero.zext(InBits);
|
||||
KnownOne = KnownOne.zext(InBits);
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero = KnownZero.trunc(BitWidth);
|
||||
KnownOne = KnownOne.trunc(BitWidth);
|
||||
break;
|
||||
@ -2128,12 +2108,12 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1);
|
||||
KnownZero |= (~InMask);
|
||||
KnownOne &= (~KnownZero);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::FGETSIGN:
|
||||
// All bits are zero except the low bit.
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - 1);
|
||||
return;
|
||||
break;
|
||||
|
||||
case ISD::SUB: {
|
||||
if (ConstantSDNode *CLHS = dyn_cast<ConstantSDNode>(Op.getOperand(0))) {
|
||||
@ -2164,17 +2144,15 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
// common to both LHS & RHS. For example, 8+(X<<3) is known to have the
|
||||
// low 3 bits clear.
|
||||
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
unsigned KnownZeroOut = KnownZero2.countTrailingOnes();
|
||||
|
||||
computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZeroOut = std::min(KnownZeroOut,
|
||||
KnownZero2.countTrailingOnes());
|
||||
|
||||
if (Op.getOpcode() == ISD::ADD) {
|
||||
KnownZero |= APInt::getLowBitsSet(BitWidth, KnownZeroOut);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
// With ADDE, a carry bit may be added in, so we can only use this
|
||||
@ -2183,7 +2161,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
// are known zero.
|
||||
if (KnownZeroOut >= 2) // ADDE
|
||||
KnownZero |= APInt::getBitsSet(BitWidth, 1, KnownZeroOut);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::SREM:
|
||||
if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||
@ -2208,7 +2186,7 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?");
|
||||
}
|
||||
}
|
||||
return;
|
||||
break;
|
||||
case ISD::UREM: {
|
||||
if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||
const APInt &RA = Rem->getAPIntValue();
|
||||
@ -2216,7 +2194,6 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
APInt LowBits = (RA - 1);
|
||||
KnownZero |= ~LowBits;
|
||||
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne,Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2230,14 +2207,14 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
KnownZero2.countLeadingOnes());
|
||||
KnownOne.clearAllBits();
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, Leaders);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case ISD::FrameIndex:
|
||||
case ISD::TargetFrameIndex:
|
||||
if (unsigned Align = InferPtrAlignment(Op)) {
|
||||
// The low bits are known zero if the pointer is aligned.
|
||||
KnownZero = APInt::getLowBitsSet(BitWidth, Log2_32(Align));
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2250,8 +2227,10 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
|
||||
case ISD::INTRINSIC_VOID:
|
||||
// Allow the target to implement this method for its nodes.
|
||||
TLI->computeKnownBitsForTargetNode(Op, KnownZero, KnownOne, *this, Depth);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
}
|
||||
|
||||
/// ComputeNumSignBits - Return the number of times the sign bit of the
|
||||
|
@ -1724,8 +1724,6 @@ void SparcTargetLowering::computeKnownBitsForTargetNode
|
||||
case SPISD::SELECT_FCC:
|
||||
DAG.computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1);
|
||||
DAG.computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
assert((KnownZero2 & KnownOne2) == 0 && "Bits known to be one AND zero?");
|
||||
|
||||
// Only known if known in both the LHS and RHS.
|
||||
KnownOne &= KnownOne2;
|
||||
|
Loading…
x
Reference in New Issue
Block a user