49#define DEBUG_TYPE "correlated-value-propagation"
52STATISTIC(NumPhiCommon,
"Number of phis deleted via common incoming value");
53STATISTIC(NumSelects,
"Number of selects propagated");
54STATISTIC(NumCmps,
"Number of comparisons propagated");
55STATISTIC(NumReturns,
"Number of return values propagated");
56STATISTIC(NumDeadCases,
"Number of switch cases removed");
58 "Number of sdivs/srems whose width was decreased");
59STATISTIC(NumSDivs,
"Number of sdiv converted to udiv");
61 "Number of udivs/urems whose width was decreased");
62STATISTIC(NumAShrsConverted,
"Number of ashr converted to lshr");
63STATISTIC(NumAShrsRemoved,
"Number of ashr removed");
64STATISTIC(NumSRems,
"Number of srem converted to urem");
65STATISTIC(NumSExt,
"Number of sext converted to zext");
66STATISTIC(NumSIToFP,
"Number of sitofp converted to uitofp");
67STATISTIC(NumSICmps,
"Number of signed icmp preds simplified to unsigned");
70STATISTIC(NumNSW,
"Number of no-signed-wrap deductions");
71STATISTIC(NumNUW,
"Number of no-unsigned-wrap deductions");
72STATISTIC(NumAddNW,
"Number of no-wrap deductions for add");
73STATISTIC(NumAddNSW,
"Number of no-signed-wrap deductions for add");
74STATISTIC(NumAddNUW,
"Number of no-unsigned-wrap deductions for add");
75STATISTIC(NumSubNW,
"Number of no-wrap deductions for sub");
76STATISTIC(NumSubNSW,
"Number of no-signed-wrap deductions for sub");
77STATISTIC(NumSubNUW,
"Number of no-unsigned-wrap deductions for sub");
78STATISTIC(NumMulNW,
"Number of no-wrap deductions for mul");
79STATISTIC(NumMulNSW,
"Number of no-signed-wrap deductions for mul");
80STATISTIC(NumMulNUW,
"Number of no-unsigned-wrap deductions for mul");
81STATISTIC(NumShlNW,
"Number of no-wrap deductions for shl");
82STATISTIC(NumShlNSW,
"Number of no-signed-wrap deductions for shl");
83STATISTIC(NumShlNUW,
"Number of no-unsigned-wrap deductions for shl");
84STATISTIC(NumAbs,
"Number of llvm.abs intrinsics removed");
85STATISTIC(NumOverflows,
"Number of overflow checks removed");
87 "Number of saturating arithmetics converted to normal arithmetics");
88STATISTIC(NumNonNull,
"Number of function pointer arguments marked non-null");
89STATISTIC(NumCmpIntr,
"Number of llvm.[us]cmp intrinsics removed");
90STATISTIC(NumMinMax,
"Number of llvm.[us]{min,max} intrinsics removed");
92 "Number of llvm.s{min,max} intrinsics simplified to unsigned");
94 "Number of bound udiv's/urem's expanded");
95STATISTIC(NumNNeg,
"Number of zext/uitofp non-negative deductions");
105 std::optional<ConstantRange> RetRange;
110 :
F(
F), LVI(LVI), DT(DT), SQ(SQ) {}
116 bool processInstruction(Instruction &
I);
117 bool inferReturnRangeAttr();
120 bool processSelect(SelectInst *S);
121 bool processPHI(PHINode *
P);
122 bool processICmp(ICmpInst *Cmp);
123 bool processCmp(CmpInst *Cmp);
124 bool processSwitch(SwitchInst *
I);
125 bool processBinOp(BinaryOperator *BinOp);
126 bool processAbsIntrinsic(IntrinsicInst *
II);
127 bool processCmpIntrinsic(CmpIntrinsic *CI);
128 bool processMinMaxIntrinsic(MinMaxIntrinsic *MM);
129 bool processOverflowIntrinsic(WithOverflowInst *WO);
130 bool processSaturatingInst(SaturatingInst *SI);
131 bool processCallSite(CallBase &CB);
132 bool processUDivOrURem(BinaryOperator *Instr);
133 bool processSRem(BinaryOperator *SDI,
const ConstantRange &LCR,
134 const ConstantRange &RCR);
135 bool processSDiv(BinaryOperator *SDI,
const ConstantRange &LCR,
136 const ConstantRange &RCR);
137 bool processSDivOrSRem(BinaryOperator *Instr);
138 bool processAShr(BinaryOperator *SDI);
139 bool processSExt(SExtInst *SDI);
140 bool processPossibleNonNeg(PossiblyNonNegInst *
I);
141 bool processSIToFP(SIToFPInst *SIToFP);
142 bool processAnd(BinaryOperator *BinOp);
143 bool processTrunc(TruncInst *TI);
144 bool processReturn(ReturnInst *RI);
148 bool simplifyCommonValuePhi(PHINode *
P);
149 bool constantFoldCmp(CmpInst *Cmp);
150 bool willNotOverflow(BinaryOpIntrinsic *BO);
151 Value *getValueOnEdge(
Value *Incoming, BasicBlock *From, BasicBlock *To,
153 NoWrapFlags inferNoWrapFromUses(BinaryOperator *BinOp,
bool WantNSW,
168 Value *Op0 =
C->getOperand(0);
177bool CVPImpl::processSelect(SelectInst *S) {
217bool CVPImpl::simplifyCommonValuePhi(PHINode *
P) {
220 Value *CommonValue =
nullptr;
221 for (
unsigned I = 0,
E =
P->getNumIncomingValues();
I !=
E; ++
I) {
222 Value *Incoming =
P->getIncomingValue(
I);
224 IncomingConstants.
push_back(std::make_pair(IncomingConstant,
I));
225 }
else if (!CommonValue) {
227 CommonValue = Incoming;
228 }
else if (Incoming != CommonValue) {
234 if (!CommonValue || IncomingConstants.
empty())
246 for (
auto &IncomingConstant : IncomingConstants) {
248 BasicBlock *IncomingBB =
P->getIncomingBlock(IncomingConstant.second);
261 P->replaceAllUsesWith(CommonValue);
262 P->eraseFromParent();
267Value *CVPImpl::getValueOnEdge(
Value *Incoming, BasicBlock *From,
268 BasicBlock *To, Instruction *CtxI) {
282 Value *Condition =
SI->getCondition();
286 return SI->getTrueValue();
287 if (
C->isNullValue())
288 return SI->getFalseValue();
301 Res && Res->isZero())
302 return SI->getTrueValue();
309 Res && Res->isZero())
310 return SI->getFalseValue();
315bool CVPImpl::processPHI(PHINode *
P) {
319 for (
unsigned I = 0,
E =
P->getNumIncomingValues();
I <
E; ++
I) {
320 Value *Incoming =
P->getIncomingValue(
I);
324 Value *
V = getValueOnEdge(Incoming,
P->getIncomingBlock(
I), BB,
P);
326 P->setIncomingValue(
I,
V);
332 P->replaceAllUsesWith(
V);
333 P->eraseFromParent();
338 Changed = simplifyCommonValuePhi(
P);
346bool CVPImpl::processICmp(ICmpInst *Cmp) {
348 if (!
Cmp->getOperand(0)->getType()->isIntOrIntVectorTy())
351 if (!
Cmp->isSigned() && (!
Cmp->isUnsigned() ||
Cmp->hasSameSign()))
361 if (
Cmp->isSigned()) {
362 ICmpInst::Predicate UnsignedPred =
364 Cmp->getPredicate(), CR1, CR2);
366 if (UnsignedPred == ICmpInst::Predicate::BAD_ICMP_PREDICATE)
370 Cmp->setPredicate(UnsignedPred);
386bool CVPImpl::constantFoldCmp(CmpInst *Cmp) {
396 if (
Cmp->use_empty()) {
397 Cmp->eraseFromParent();
407bool CVPImpl::processCmp(CmpInst *Cmp) {
408 if (constantFoldCmp(Cmp))
412 if (processICmp(ICmp))
425bool CVPImpl::processSwitch(SwitchInst *
I) {
426 DomTreeUpdater DTU(*DT, DomTreeUpdater::UpdateStrategy::Lazy);
432 DenseMap<BasicBlock*, int> SuccessorsCount;
434 SuccessorsCount[Succ]++;
438 SwitchInstProfUpdateWrapper
SI(*
I);
441 unsigned ReachableCaseCount = 0;
443 for (
auto CI =
SI->case_begin(), CE =
SI->case_end(); CI != CE;) {
444 ConstantInt *Case = CI->getCaseValue();
445 std::optional<bool>
Predicate = std::nullopt;
456 if (Res && Res->isZero())
458 else if (Res && Res->isOne())
462 if (Predicate && !*Predicate) {
466 CI =
SI.removeCase(CI);
471 Cond =
SI->getCondition();
475 if (--SuccessorsCount[Succ] == 0)
476 DTU.applyUpdatesPermissive({{DominatorTree::Delete, BB, Succ}});
479 if (Predicate && *Predicate) {
483 SI->setCondition(Case);
484 NumDeadCases +=
SI->getNumCases();
491 ++ReachableCaseCount;
495 if (!
SI->defaultDestUnreachable() &&
501 auto *UI =
new UnreachableInst(BB->
getContext(), NewUnreachableBB);
505 SI->setDefaultDest(NewUnreachableBB);
507 if (SuccessorsCount[DefaultDest] == 1)
508 DTU.applyUpdates({{DominatorTree::Delete, BB, DefaultDest}});
509 DTU.applyUpdates({{DominatorTree::Insert, BB, NewUnreachableBB}});
525bool CVPImpl::willNotOverflow(BinaryOpIntrinsic *BO) {
526 ConstantRange LRange =
528 ConstantRange RRange =
536 bool NewNSW,
bool NewNUW) {
539 case Instruction::Add:
544 case Instruction::Sub:
549 case Instruction::Mul:
554 case Instruction::Shl:
570 Inst->setHasNoSignedWrap();
578 Inst->setHasNoUnsignedWrap();
585bool CVPImpl::processAbsIntrinsic(IntrinsicInst *
II) {
590 II->getOperandUse(0), IsIntMinPoison);
595 II->replaceAllUsesWith(
X);
596 II->eraseFromParent();
603 Value *NegX =
B.CreateNeg(
X,
II->getName(),
606 II->replaceAllUsesWith(NegX);
607 II->eraseFromParent();
627bool CVPImpl::processCmpIntrinsic(CmpIntrinsic *CI) {
628 ConstantRange LRange =
630 ConstantRange RRange =
645 if (LRange.
icmp(ICmpInst::ICMP_EQ, RRange)) {
657bool CVPImpl::processMinMaxIntrinsic(MinMaxIntrinsic *MM) {
694bool CVPImpl::processOverflowIntrinsic(WithOverflowInst *WO) {
708 Value *NewI =
B.CreateInsertValue(Struct, NewOp, 0);
720bool CVPImpl::processSaturatingInst(SaturatingInst *SI) {
722 bool NSW =
SI->isSigned();
723 bool NUW = !
SI->isSigned();
725 Opcode,
SI->getLHS(),
SI->getRHS(),
SI->getName(),
SI->getIterator());
729 SI->replaceAllUsesWith(BinOp);
730 SI->eraseFromParent();
740bool CVPImpl::processCallSite(CallBase &CB) {
747 return processCmpIntrinsic(CI);
751 return processMinMaxIntrinsic(MM);
755 if (willNotOverflow(WO))
756 return processOverflowIntrinsic(WO);
760 if (willNotOverflow(SI))
761 return processSaturatingInst(SI);
774 for (
const Use &ConstU : DeoptBundle->Inputs) {
775 Use &
U =
const_cast<Use&
>(ConstU);
777 if (
V->getType()->isVectorTy())
continue;
787 SmallVector<unsigned, 4> ArgNos;
800 Res && Res->isZero())
805 assert(ArgNo == CB.
arg_size() &&
"Call arguments not processed correctly.");
810 NumNonNull += ArgNos.
size();
813 AS = AS.addParamAttribute(Ctx, ArgNos,
814 Attribute::get(Ctx, Attribute::NonNull));
834 assert(Instr->getOpcode() == Instruction::SDiv ||
835 Instr->getOpcode() == Instruction::SRem);
839 unsigned OrigWidth = Instr->getType()->getScalarSizeInBits();
843 unsigned MinSignedBits =
853 unsigned NewWidth = std::max<unsigned>(
PowerOf2Ceil(MinSignedBits), 8);
857 if (NewWidth >= OrigWidth)
860 ++NumSDivSRemsNarrowed;
862 auto *TruncTy = Instr->getType()->getWithNewBitWidth(NewWidth);
863 auto *
LHS =
B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
864 Instr->getName() +
".lhs.trunc");
865 auto *
RHS =
B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
866 Instr->getName() +
".rhs.trunc");
867 auto *BO =
B.CreateBinOp(Instr->getOpcode(),
LHS,
RHS, Instr->getName());
868 auto *Sext =
B.CreateSExt(BO, Instr->getType(), Instr->getName() +
".sext");
870 if (BinOp->
getOpcode() == Instruction::SDiv)
873 Instr->replaceAllUsesWith(Sext);
874 Instr->eraseFromParent();
880 Type *Ty = Instr->getType();
881 assert(Instr->getOpcode() == Instruction::UDiv ||
882 Instr->getOpcode() == Instruction::URem);
883 bool IsRem = Instr->getOpcode() == Instruction::URem;
885 Value *
X = Instr->getOperand(0);
886 Value *
Y = Instr->getOperand(1);
893 Instr->eraseFromParent();
894 ++NumUDivURemsNarrowedExpanded;
930 ExpandedOp =
B.CreateNUWSub(
X,
Y);
932 ExpandedOp = ConstantInt::get(Instr->getType(), 1);
938 FrozenX =
B.CreateFreeze(
X,
X->getName() +
".frozen");
941 FrozenY =
B.CreateFreeze(
Y,
Y->getName() +
".frozen");
942 auto *AdjX =
B.CreateNUWSub(FrozenX, FrozenY, Instr->getName() +
".urem");
944 Instr->getName() +
".cmp");
946 B.CreateSelectWithUnknownProfile(Cmp, FrozenX, AdjX,
DEBUG_TYPE);
950 ExpandedOp =
B.CreateZExt(Cmp, Ty, Instr->getName() +
".udiv");
953 Instr->replaceAllUsesWith(ExpandedOp);
954 Instr->eraseFromParent();
955 ++NumUDivURemsNarrowedExpanded;
963 assert(Instr->getOpcode() == Instruction::UDiv ||
964 Instr->getOpcode() == Instruction::URem);
973 unsigned NewWidth = std::max<unsigned>(
PowerOf2Ceil(MaxActiveBits), 8);
977 if (NewWidth >= Instr->getType()->getScalarSizeInBits())
980 ++NumUDivURemsNarrowed;
982 auto *TruncTy = Instr->getType()->getWithNewBitWidth(NewWidth);
983 auto *
LHS =
B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
984 Instr->getName() +
".lhs.trunc");
985 auto *
RHS =
B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
986 Instr->getName() +
".rhs.trunc");
987 auto *BO =
B.CreateBinOp(Instr->getOpcode(),
LHS,
RHS, Instr->getName());
988 auto *Zext =
B.CreateZExt(BO, Instr->getType(), Instr->getName() +
".zext");
990 if (BinOp->
getOpcode() == Instruction::UDiv)
993 Instr->replaceAllUsesWith(Zext);
994 Instr->eraseFromParent();
998bool CVPImpl::processUDivOrURem(BinaryOperator *Instr) {
1000 Instr->getOpcode() == Instruction::URem);
1012bool CVPImpl::processSRem(BinaryOperator *SDI,
const ConstantRange &LCR,
1013 const ConstantRange &RCR) {
1036 for (Operand &
Op :
Ops) {
1045 auto *URem = BinaryOperator::CreateURem(
Ops[0].
V,
Ops[1].
V, SDI->
getName(),
1063 processUDivOrURem(URem);
1073bool CVPImpl::processSDiv(BinaryOperator *SDI,
const ConstantRange &LCR,
1074 const ConstantRange &RCR) {
1078 ConstantRange DivCR = LCR.
sdiv(RCR);
1099 for (Operand &
Op :
Ops) {
1108 auto *UDiv = BinaryOperator::CreateUDiv(
Ops[0].
V,
Ops[1].
V, SDI->
getName(),
1111 UDiv->setIsExact(SDI->
isExact());
1127 processUDivOrURem(UDiv);
1132bool CVPImpl::processSDivOrSRem(BinaryOperator *Instr) {
1134 Instr->getOpcode() == Instruction::SRem);
1140 if (
Instr->getOpcode() == Instruction::SDiv)
1141 if (processSDiv(Instr, LCR, RCR))
1144 if (
Instr->getOpcode() == Instruction::SRem) {
1145 if (processSRem(Instr, LCR, RCR))
1152bool CVPImpl::processAShr(BinaryOperator *SDI) {
1153 ConstantRange LRange =
1156 ConstantRange NegOneOrZero =
1157 ConstantRange(APInt(OrigWidth, (
uint64_t)-1,
true), APInt(OrigWidth, 1));
1158 if (NegOneOrZero.
contains(LRange)) {
1170 ++NumAShrsConverted;
1183bool CVPImpl::processSExt(SExtInst *SDI) {
1192 ZExt->takeName(SDI);
1202bool CVPImpl::processPossibleNonNeg(PossiblyNonNegInst *
I) {
1206 const Use &
Base =
I->getOperandUse(0);
1217bool CVPImpl::processSIToFP(SIToFPInst *SIToFP) {
1226 UIToFP->takeName(SIToFP);
1228 UIToFP->setNonNeg();
1248 bool CheckNSW,
bool CheckNUW) {
1253 OBO::NoUnsignedWrap)
1265NoWrapFlags CVPImpl::inferNoWrapFromUses(BinaryOperator *BinOp,
bool WantNSW,
1269 const unsigned MaxUsesToInspect = 4;
1271 unsigned NumUses = 0;
1272 for (Use &U : BinOp->
uses()) {
1273 if (++NumUses > MaxUsesToInspect)
1276 if (
isa<PHINode>(UserI) || UserI->getParent() == DefBB)
1284 Flags.NSW = WantNSW;
1285 Flags.NUW = WantNUW;
1286 for (Use &U : BinOp->
uses()) {
1301bool CVPImpl::processBinOp(BinaryOperator *BinOp) {
1320 bool WantNSW = !NSW && !
New.NSW;
1321 bool WantNUW = !NUW && !
New.NUW;
1322 if (WantNSW || WantNUW) {
1323 NoWrapFlags FromUses = inferNoWrapFromUses(BinOp, WantNSW, WantNUW);
1324 New.NSW |= FromUses.NSW;
1325 New.NUW |= FromUses.NUW;
1330 return New.NSW ||
New.NUW;
1333bool CVPImpl::processAnd(BinaryOperator *BinOp) {
1334 using namespace llvm::PatternMatch;
1345 ConstantRange LRange =
1357bool CVPImpl::processTrunc(TruncInst *TI) {
1361 ConstantRange
Range =
1385bool CVPImpl::processReturn(ReturnInst *RI) {
1392 if (RetRange && !RetRange->isFullSet())
1393 RetRange = RetRange->unionWith(
1398 if (Constant *
C = getConstantAt(RetVal, RI)) {
1406bool CVPImpl::processInstruction(Instruction &
I) {
1407 switch (
I.getOpcode()) {
1408 case Instruction::Select:
1410 case Instruction::PHI:
1412 case Instruction::ICmp:
1413 case Instruction::FCmp:
1415 case Instruction::Call:
1416 case Instruction::Invoke:
1418 case Instruction::SRem:
1419 case Instruction::SDiv:
1421 case Instruction::UDiv:
1422 case Instruction::URem:
1424 case Instruction::AShr:
1426 case Instruction::SExt:
1428 case Instruction::ZExt:
1429 case Instruction::UIToFP:
1431 case Instruction::SIToFP:
1433 case Instruction::Add:
1434 case Instruction::Sub:
1435 case Instruction::Mul:
1436 case Instruction::Shl:
1438 case Instruction::And:
1440 case Instruction::Trunc:
1442 case Instruction::Switch:
1444 case Instruction::Ret:
1451bool CVPImpl::inferReturnRangeAttr() {
1453 if (!RetRange || RetRange->isFullSet())
1455 Attribute RangeAttr =
F.getRetAttribute(Attribute::Range);
1457 RetRange = RetRange->intersectWith(RangeAttr.
getRange());
1460 if (RetRange->isEmptySet() || RetRange->isSingleElement())
1462 F.addRangeRetAttr(*RetRange);
1466bool CVPImpl::run() {
1467 if (
F.hasExactDefinition() &&
F.getReturnType()->isIntOrIntVectorTy())
1469 ConstantRange::getEmpty(
F.getReturnType()->getScalarSizeInBits());
1481 Changed |= inferReturnRangeAttr();
1497#if defined(EXPENSIVE_CHECKS)
1498 assert(DT->verify(DominatorTree::VerificationLevel::Full));
1500 assert(DT->verify(DominatorTree::VerificationLevel::Fast));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
SmallVector< MachineOperand, 4 > Cond
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
bool isNonPositive() const
Determine if this APInt Value is non-positive (<= 0).
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
bool isValid() const
Return true if the attribute is any kind of attribute.
const Function * getParent() const
Return the enclosing method, or null if none.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
LLVM_ABI unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
LLVM_ABI bool isSigned() const
Whether the intrinsic is signed or unsigned.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static LLVM_ABI CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Type * getDestTy() const
Return the destination type, as a convenience.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLE
signed less or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
static CmpInst::Predicate getGTPredicate(Intrinsic::ID ID)
static CmpInst::Predicate getLTPredicate(Intrinsic::ID ID)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
const APInt & getValue() const
Return the constant as an APInt value reference.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
LLVM_ABI unsigned getActiveBits() const
Compute the maximal number of active bits needed to represent every value in this range.
static LLVM_ABI CmpInst::Predicate getEquivalentPredWithFlippedSignedness(CmpInst::Predicate Pred, const ConstantRange &CR1, const ConstantRange &CR2)
If the comparison between constant ranges this and Other is insensitive to the signedness of the comp...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI bool isAllNegative() const
Return true if all values in this range are negative.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
LLVM_ABI bool isSizeLargerThan(uint64_t MaxSize) const
Compare set size of this range with Value.
LLVM_ABI ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
LLVM_ABI ConstantRange uadd_sat(const ConstantRange &Other) const
Perform an unsigned saturating addition of two constant ranges.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI bool isAllNonNegative() const
Return true if all values in this range are non-negative.
LLVM_ABI ConstantRange sdiv(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed division of a value in th...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
static LLVM_ABI bool areInsensitiveToSignednessOfICmpPredicate(const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 slt CR2.
static LLVM_ABI ConstantRange makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind)
Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow)...
LLVM_ABI unsigned getMinSignedBits() const
Compute the maximal number of bits needed to represent every value in this signed range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static DebugLoc getTemporary()
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Analysis to compute lazy value information.
This pass computes, caches, and vends lazy value constraint information.
LLVM_ABI ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
LLVM_ABI Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CtxI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
LLVM_ABI Constant * getConstant(Value *V, Instruction *CtxI)
Determine whether the specified value is known to be a constant at the specified instruction.
LLVM_ABI Constant * getPredicateAt(CmpInst::Predicate Pred, Value *V, Constant *C, Instruction *CtxI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
LLVM_ABI ConstantRange getConstantRange(Value *V, Instruction *CtxI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
LLVM_ABI Constant * getPredicateOnEdge(CmpInst::Predicate Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CtxI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & abandon()
Mark an analysis as abandoned.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
const Value * getFalseValue() const
const Value * getCondition() const
const Value * getTrueValue() const
void push_back(const T &Elt)
void setHasNoSignedWrap(bool B)
void setHasNoUnsignedWrap(bool B)
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
const Use & getOperandUse(unsigned i) const
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
const ParentTy * getParent() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ BasicBlock
Various leaf nodes.
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
bool match(Val *V, const Pattern &P)
@ CE
Windows NT (Windows on ARM)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< InstrNode * > Instr
NodeAddr< UseNode * > Use
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions=false, const TargetLibraryInfo *TLI=nullptr, DomTreeUpdater *DTU=nullptr)
If a terminator instruction is predicated on a constant value, convert it into an unconditional branc...
@ Unknown
Not known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
auto successors(const MachineBasicBlock *BB)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
uint64_t PowerOf2Ceil(uint64_t A)
Returns the power of two which is greater than or equal to the given value.
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
auto dyn_cast_or_null(const Y &Val)
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
iterator_range< df_iterator< T > > depth_first(const T &G)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI const SimplifyQuery getBestSimplifyQuery(Pass &, Function &)