本文整理汇总了C++中APInt::isStrictlyPositive方法的典型用法代码示例。如果您正苦于以下问题:C++ APInt::isStrictlyPositive方法的具体用法?C++ APInt::isStrictlyPositive怎么用?C++ APInt::isStrictlyPositive使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类APInt
的用法示例。
在下文中一共展示了APInt::isStrictlyPositive方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ConstantRange
ConstantRange
ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
const ConstantRange &Other,
unsigned NoWrapKind) {
typedef OverflowingBinaryOperator OBO;
// Computes the intersection of CR0 and CR1. It is different from
// intersectWith in that the ConstantRange returned will only contain elements
// in both CR0 and CR1 (i.e. SubsetIntersect(X, Y) is a *subset*, proper or
// not, of both X and Y).
auto SubsetIntersect =
[](const ConstantRange &CR0, const ConstantRange &CR1) {
return CR0.inverse().unionWith(CR1.inverse()).inverse();
};
assert(BinOp >= Instruction::BinaryOpsBegin &&
BinOp < Instruction::BinaryOpsEnd && "Binary operators only!");
assert((NoWrapKind == OBO::NoSignedWrap ||
NoWrapKind == OBO::NoUnsignedWrap ||
NoWrapKind == (OBO::NoUnsignedWrap | OBO::NoSignedWrap)) &&
"NoWrapKind invalid!");
unsigned BitWidth = Other.getBitWidth();
if (BinOp != Instruction::Add)
// Conservative answer: empty set
return ConstantRange(BitWidth, false);
if (auto *C = Other.getSingleElement())
if (C->isMinValue())
// Full set: nothing signed / unsigned wraps when added to 0.
return ConstantRange(BitWidth);
ConstantRange Result(BitWidth);
if (NoWrapKind & OBO::NoUnsignedWrap)
Result =
SubsetIntersect(Result, ConstantRange(APInt::getNullValue(BitWidth),
-Other.getUnsignedMax()));
if (NoWrapKind & OBO::NoSignedWrap) {
APInt SignedMin = Other.getSignedMin();
APInt SignedMax = Other.getSignedMax();
if (SignedMax.isStrictlyPositive())
Result = SubsetIntersect(
Result,
ConstantRange(APInt::getSignedMinValue(BitWidth),
APInt::getSignedMinValue(BitWidth) - SignedMax));
if (SignedMin.isNegative())
Result = SubsetIntersect(
Result, ConstantRange(APInt::getSignedMinValue(BitWidth) - SignedMin,
APInt::getSignedMinValue(BitWidth)));
}
return Result;
}
示例2: lowerSDiv
/// lowerSDIV - Given an SDiv expressing a divide by constant,
/// replace it by multiplying by a magic number. See:
/// <http://the.wall.riscom.net/books/proc/ppc/cwg/code2.html>
bool lowerSDiv(Instruction *inst) const {
ConstantInt *Op1 = dyn_cast<ConstantInt>(inst->getOperand(1));
// check if dividing by a constant and not by a power of 2
if (!Op1 || inst->getType()->getPrimitiveSizeInBits() != 32 ||
Op1->getValue().isPowerOf2()) {
return false;
}
BasicBlock::iterator ii(inst);
Value *Op0 = inst->getOperand(0);
APInt d = Op1->getValue();
APInt::ms magics = Op1->getValue().magic();
IntegerType * type64 = IntegerType::get(Mod->getContext(), 64);
Instruction *sext = CastInst::CreateSExtOrBitCast(Op0, type64, "", inst);
APInt m = APInt(64, magics.m.getSExtValue());
Constant *magicNum = ConstantInt::get(type64, m);
Instruction *magInst = BinaryOperator::CreateNSWMul(sext, magicNum, "", inst);
APInt ap = APInt(64, 32);
Constant *movHiConst = ConstantInt::get(type64, ap);
Instruction *movHi = BinaryOperator::Create(Instruction::AShr, magInst,
movHiConst, "", inst);
Instruction *trunc = CastInst::CreateTruncOrBitCast(movHi, inst->getType(),
"", inst);
if (d.isStrictlyPositive() && magics.m.isNegative()) {
trunc = BinaryOperator::Create(Instruction::Add, trunc, Op0, "", inst);
} else if (d.isNegative() && magics.m.isStrictlyPositive()) {
trunc = BinaryOperator::Create(Instruction::Sub, trunc, Op0, "", inst);
}
if (magics.s > 0) {
APInt apS = APInt(32, magics.s);
Constant *magicShift = ConstantInt::get(inst->getType(), apS);
trunc = BinaryOperator::Create(Instruction::AShr, trunc,
magicShift, "", inst);
}
APInt ap31 = APInt(32, 31);
Constant *thirtyOne = ConstantInt::get(inst->getType(), ap31);
// get sign bit
Instruction *sign = BinaryOperator::Create(Instruction::LShr, trunc,
thirtyOne, "", inst);
Instruction *result = BinaryOperator::Create(Instruction::Add, trunc, sign,
"");
ReplaceInstWithInst(inst->getParent()->getInstList(), ii, result);
return true;
}
示例3: ComputeMaskedBits
//.........这里部分代码省略.........
"Bits known to be one AND zero?");
unsigned LHSKnownZeroOut = LHSKnownZero.countTrailingOnes();
ComputeMaskedBits(I->getOperand(1), Mask2, 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
// many bits from the other operand.
if (LHSKnownZeroOut > RHSKnownZeroOut) {
if (getOpcode(I) == Instruction::Add) {
APInt Mask = APInt::getLowBitsSet(BitWidth, LHSKnownZeroOut);
KnownZero |= KnownZero2 & Mask;
KnownOne |= KnownOne2 & Mask;
} else {
// If the known zeros are in the left operand for a subtract,
// fall back to the minimum known zeros in both operands.
KnownZero |= APInt::getLowBitsSet(BitWidth,
std::min(LHSKnownZeroOut,
RHSKnownZeroOut));
}
} else if (RHSKnownZeroOut >= LHSKnownZeroOut) {
APInt Mask = APInt::getLowBitsSet(BitWidth, RHSKnownZeroOut);
KnownZero |= LHSKnownZero & Mask;
KnownOne |= LHSKnownOne & Mask;
}
return;
}
case Instruction::SRem:
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
APInt RA = Rem->getValue();
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero2, KnownOne2, TD,
Depth+1);
// If the sign bit of the first operand is zero, the sign bit of
// the result is zero. If the first operand has no one bits below
// the second operand's single 1 bit, its sign will be zero.
if (KnownZero2[BitWidth-1] || ((KnownZero2 & LowBits) == LowBits))
KnownZero2 |= ~LowBits;
KnownZero |= KnownZero2 & Mask;
assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?");
}
}
break;
case Instruction::URem: {
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
APInt RA = Rem->getValue();
if (RA.isPowerOf2()) {
APInt LowBits = (RA - 1);
APInt Mask2 = LowBits & Mask;
KnownZero |= ~LowBits & Mask;
ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero, KnownOne, TD,
Depth+1);
assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?");
break;
}
}
// Since the result is less than or equal to either operand, any leading
// zero bits in either operand must also exist in the result.