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) {
663 if (LRange.
icmp(Pred, RRange)) {
669 if (RRange.
icmp(Pred, LRange)) {
693bool CVPImpl::processOverflowIntrinsic(WithOverflowInst *WO) {
707 Value *NewI =
B.CreateInsertValue(Struct, NewOp, 0);
719bool CVPImpl::processSaturatingInst(SaturatingInst *SI) {
721 bool NSW =
SI->isSigned();
722 bool NUW = !
SI->isSigned();
724 Opcode,
SI->getLHS(),
SI->getRHS(),
SI->getName(),
SI->getIterator());
728 SI->replaceAllUsesWith(BinOp);
729 SI->eraseFromParent();
739bool CVPImpl::processCallSite(CallBase &CB) {
746 return processCmpIntrinsic(CI);
750 return processMinMaxIntrinsic(MM);
754 if (willNotOverflow(WO))
755 return processOverflowIntrinsic(WO);
759 if (willNotOverflow(SI))
760 return processSaturatingInst(SI);
773 for (
const Use &ConstU : DeoptBundle->Inputs) {
774 Use &
U =
const_cast<Use&
>(ConstU);
776 if (
V->getType()->isVectorTy())
continue;
786 SmallVector<unsigned, 4> ArgNos;
799 Res && Res->isZero())
804 assert(ArgNo == CB.
arg_size() &&
"Call arguments not processed correctly.");
809 NumNonNull += ArgNos.
size();
812 AS = AS.addParamAttribute(Ctx, ArgNos,
813 Attribute::get(Ctx, Attribute::NonNull));
833 assert(Instr->getOpcode() == Instruction::SDiv ||
834 Instr->getOpcode() == Instruction::SRem);
838 unsigned OrigWidth = Instr->getType()->getScalarSizeInBits();
842 unsigned MinSignedBits =
852 unsigned NewWidth = std::max<unsigned>(
PowerOf2Ceil(MinSignedBits), 8);
856 if (NewWidth >= OrigWidth)
859 ++NumSDivSRemsNarrowed;
861 auto *TruncTy = Instr->getType()->getWithNewBitWidth(NewWidth);
862 auto *
LHS =
B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
863 Instr->getName() +
".lhs.trunc");
864 auto *
RHS =
B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
865 Instr->getName() +
".rhs.trunc");
866 auto *BO =
B.CreateBinOp(Instr->getOpcode(),
LHS,
RHS, Instr->getName());
867 auto *Sext =
B.CreateSExt(BO, Instr->getType(), Instr->getName() +
".sext");
869 if (BinOp->
getOpcode() == Instruction::SDiv)
872 Instr->replaceAllUsesWith(Sext);
873 Instr->eraseFromParent();
879 Type *Ty = Instr->getType();
880 assert(Instr->getOpcode() == Instruction::UDiv ||
881 Instr->getOpcode() == Instruction::URem);
882 bool IsRem = Instr->getOpcode() == Instruction::URem;
884 Value *
X = Instr->getOperand(0);
885 Value *
Y = Instr->getOperand(1);
892 Instr->eraseFromParent();
893 ++NumUDivURemsNarrowedExpanded;
929 ExpandedOp =
B.CreateNUWSub(
X,
Y);
931 ExpandedOp = ConstantInt::get(Instr->getType(), 1);
937 FrozenX =
B.CreateFreeze(
X,
X->getName() +
".frozen");
940 FrozenY =
B.CreateFreeze(
Y,
Y->getName() +
".frozen");
941 auto *AdjX =
B.CreateNUWSub(FrozenX, FrozenY, Instr->getName() +
".urem");
943 Instr->getName() +
".cmp");
945 B.CreateSelectWithUnknownProfile(Cmp, FrozenX, AdjX,
DEBUG_TYPE);
949 ExpandedOp =
B.CreateZExt(Cmp, Ty, Instr->getName() +
".udiv");
952 Instr->replaceAllUsesWith(ExpandedOp);
953 Instr->eraseFromParent();
954 ++NumUDivURemsNarrowedExpanded;
962 assert(Instr->getOpcode() == Instruction::UDiv ||
963 Instr->getOpcode() == Instruction::URem);
972 unsigned NewWidth = std::max<unsigned>(
PowerOf2Ceil(MaxActiveBits), 8);
976 if (NewWidth >= Instr->getType()->getScalarSizeInBits())
979 ++NumUDivURemsNarrowed;
981 auto *TruncTy = Instr->getType()->getWithNewBitWidth(NewWidth);
982 auto *
LHS =
B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
983 Instr->getName() +
".lhs.trunc");
984 auto *
RHS =
B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
985 Instr->getName() +
".rhs.trunc");
986 auto *BO =
B.CreateBinOp(Instr->getOpcode(),
LHS,
RHS, Instr->getName());
987 auto *Zext =
B.CreateZExt(BO, Instr->getType(), Instr->getName() +
".zext");
989 if (BinOp->
getOpcode() == Instruction::UDiv)
992 Instr->replaceAllUsesWith(Zext);
993 Instr->eraseFromParent();
997bool CVPImpl::processUDivOrURem(BinaryOperator *Instr) {
999 Instr->getOpcode() == Instruction::URem);
1011bool CVPImpl::processSRem(BinaryOperator *SDI,
const ConstantRange &LCR,
1012 const ConstantRange &RCR) {
1035 for (Operand &
Op :
Ops) {
1044 auto *URem = BinaryOperator::CreateURem(
Ops[0].V,
Ops[1].V, SDI->
getName(),
1062 processUDivOrURem(URem);
1072bool CVPImpl::processSDiv(BinaryOperator *SDI,
const ConstantRange &LCR,
1073 const ConstantRange &RCR) {
1077 ConstantRange DivCR = LCR.
sdiv(RCR);
1098 for (Operand &
Op :
Ops) {
1107 auto *UDiv = BinaryOperator::CreateUDiv(
Ops[0].V,
Ops[1].V, SDI->
getName(),
1110 UDiv->setIsExact(SDI->
isExact());
1126 processUDivOrURem(UDiv);
1131bool CVPImpl::processSDivOrSRem(BinaryOperator *Instr) {
1133 Instr->getOpcode() == Instruction::SRem);
1139 if (
Instr->getOpcode() == Instruction::SDiv)
1140 if (processSDiv(Instr, LCR, RCR))
1143 if (
Instr->getOpcode() == Instruction::SRem) {
1144 if (processSRem(Instr, LCR, RCR))
1151bool CVPImpl::processAShr(BinaryOperator *SDI) {
1152 ConstantRange LRange =
1155 ConstantRange NegOneOrZero =
1156 ConstantRange(APInt(OrigWidth, (
uint64_t)-1,
true), APInt(OrigWidth, 1));
1157 if (NegOneOrZero.
contains(LRange)) {
1169 ++NumAShrsConverted;
1182bool CVPImpl::processSExt(SExtInst *SDI) {
1191 ZExt->takeName(SDI);
1201bool CVPImpl::processPossibleNonNeg(PossiblyNonNegInst *
I) {
1205 const Use &
Base =
I->getOperandUse(0);
1216bool CVPImpl::processSIToFP(SIToFPInst *SIToFP) {
1225 UIToFP->takeName(SIToFP);
1227 UIToFP->setNonNeg();
1246 bool CheckNSW,
bool CheckNUW) {
1251 OBO::NoUnsignedWrap)
1263NoWrapFlags CVPImpl::inferNoWrapFromUses(BinaryOperator *BinOp,
bool WantNSW,
1267 const unsigned MaxUsesToInspect = 4;
1269 unsigned NumUses = 0;
1270 for (Use &U : BinOp->
uses()) {
1271 if (++NumUses > MaxUsesToInspect)
1274 if (
isa<PHINode>(UserI) || UserI->getParent() == DefBB)
1282 Flags.NSW = WantNSW;
1283 Flags.NUW = WantNUW;
1284 for (Use &U : BinOp->
uses()) {
1299bool CVPImpl::processBinOp(BinaryOperator *BinOp) {
1318 bool WantNSW = !NSW && !
New.NSW;
1319 bool WantNUW = !NUW && !
New.NUW;
1320 if (WantNSW || WantNUW) {
1321 NoWrapFlags FromUses = inferNoWrapFromUses(BinOp, WantNSW, WantNUW);
1322 New.NSW |= FromUses.NSW;
1323 New.NUW |= FromUses.NUW;
1328 return New.NSW ||
New.NUW;
1331bool CVPImpl::processAnd(BinaryOperator *BinOp) {
1332 using namespace llvm::PatternMatch;
1343 ConstantRange LRange =
1355bool CVPImpl::processTrunc(TruncInst *TI) {
1359 ConstantRange
Range =
1383bool CVPImpl::processReturn(ReturnInst *RI) {
1390 if (RetRange && !RetRange->isFullSet())
1391 RetRange = RetRange->unionWith(
1396 if (Constant *
C = getConstantAt(RetVal, RI)) {
1404bool CVPImpl::processInstruction(Instruction &
I) {
1405 switch (
I.getOpcode()) {
1406 case Instruction::Select:
1408 case Instruction::PHI:
1410 case Instruction::ICmp:
1411 case Instruction::FCmp:
1413 case Instruction::Call:
1414 case Instruction::Invoke:
1416 case Instruction::SRem:
1417 case Instruction::SDiv:
1419 case Instruction::UDiv:
1420 case Instruction::URem:
1422 case Instruction::AShr:
1424 case Instruction::SExt:
1426 case Instruction::ZExt:
1427 case Instruction::UIToFP:
1429 case Instruction::SIToFP:
1431 case Instruction::Add:
1432 case Instruction::Sub:
1433 case Instruction::Mul:
1434 case Instruction::Shl:
1436 case Instruction::And:
1438 case Instruction::Trunc:
1440 case Instruction::Switch:
1442 case Instruction::Ret:
1449bool CVPImpl::inferReturnRangeAttr() {
1451 if (!RetRange || RetRange->isFullSet())
1453 Attribute RangeAttr =
F.getRetAttribute(Attribute::Range);
1455 RetRange = RetRange->intersectWith(RangeAttr.
getRange());
1458 if (RetRange->isEmptySet() || RetRange->isSingleElement())
1460 F.addRangeRetAttr(*RetRange);
1464bool CVPImpl::run() {
1465 if (
F.hasExactDefinition() &&
F.getReturnType()->isIntOrIntVectorTy())
1467 ConstantRange::getEmpty(
F.getReturnType()->getScalarSizeInBits());
1479 Changed |= inferReturnRangeAttr();
1495#if defined(EXPENSIVE_CHECKS)
1496 assert(DT->verify(DominatorTree::VerificationLevel::Full));
1498 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 &)