40#define DEBUG_TYPE "sccp"
81 <<
" as a constant\n");
85 LLVM_DEBUG(
dbgs() <<
" Constant: " << *Const <<
" = " << *V <<
'\n');
88 V->replaceAllUsesWith(Const);
98 return Const->toConstantRange();
100 unsigned Bitwidth =
Op->getType()->getScalarSizeInBits();
101 return ConstantRange::getFull(Bitwidth);
112 auto GetRange = [&Solver, &InsertedValues](
Value *
Op) {
126 if (NUWRange.contains(RangeA)) {
135 if (NSWRange.contains(RangeA)) {
142 if (
Range.isAllNonNegative()) {
147 if (TI->hasNoSignedWrap() && TI->hasNoUnsignedWrap())
151 uint64_t DestWidth = TI->getDestTy()->getScalarSizeInBits();
152 if (!TI->hasNoUnsignedWrap()) {
153 if (
Range.getActiveBits() <= DestWidth) {
154 TI->setHasNoUnsignedWrap(
true);
158 if (!TI->hasNoSignedWrap()) {
159 if (
Range.getMinSignedBits() <= DestWidth) {
160 TI->setHasNoSignedWrap(
true);
165 if (
GEP->hasNoUnsignedWrap() || !
GEP->hasNoUnsignedSignedWrap())
169 [&](
Value *V) { return GetRange(V).isAllNonNegative(); })) {
170 GEP->setNoWrapFlags(
GEP->getNoWrapFlags() |
184 auto isNonNegative = [&Solver, &InsertedValues](
Value *V) {
190 case Instruction::SIToFP:
191 case Instruction::SExt: {
194 if (!isNonNegative(Op0))
198 : Instruction::UIToFP,
203 case Instruction::AShr: {
206 if (!isNonNegative(Op0))
212 case Instruction::SDiv:
213 case Instruction::SRem: {
216 if (!isNonNegative(Op0) || !isNonNegative(Op1))
218 auto NewOpcode = Inst.
getOpcode() == Instruction::SDiv ? Instruction::UDiv
221 if (Inst.
getOpcode() == Instruction::SDiv)
230 assert(NewInst &&
"Expected replacement instruction");
232 InsertedValues.
insert(NewInst);
244 auto GetRange = [&Solver, &InsertedValues](
Value *
Op) {
259 Value *LHS = Cmp->getOperand(0);
260 Value *RHS = Cmp->getOperand(1);
261 unsigned BitWidth = LHS->getType()->getScalarSizeInBits();
275 if (!RHSLower.
icmp(Pred, LRange) || !LRange.
icmp(Pred, RHSUpper))
292 auto MatchTwoInstructionExactRangeCheck =
293 [&]() -> std::optional<ConstantRange> {
298 Value *LHS = ICmp->getOperand(0);
304 if (ICmp->isEquality()) {
315 if (
auto CR = MatchTwoInstructionExactRangeCheck()) {
323 auto NewCR = CR->exactUnionWith(LRange.
inverse());
331 if (NewCR->getEquivalentICmp(Pred, RHS)) {
334 Builder.CreateICmp(Pred,
X, ConstantInt::get(
X->getType(), RHS));
335 InsertedValues.
insert(NewICmp);
348 bool MadeChanges =
false;
350 if (Inst.getType()->isVoidTy())
354 Inst.eraseFromParent();
364 Inst.replaceAllUsesWith(V);
365 Inst.eraseFromParent();
376 bool HasNonFeasibleEdges =
false;
379 FeasibleSuccessors.
insert(Succ);
381 HasNonFeasibleEdges =
true;
385 if (!HasNonFeasibleEdges)
392 "Terminator must be a br, switch or indirectbr");
394 if (FeasibleSuccessors.
size() == 0) {
399 Succ->removePredecessor(BB);
400 if (SeenSuccs.
insert(Succ).second)
406 }
else if (FeasibleSuccessors.
size() == 1) {
410 bool HaveSeenOnlyFeasibleSuccessor =
false;
412 if (Succ == OnlyFeasibleSuccessor && !HaveSeenOnlyFeasibleSuccessor) {
415 HaveSeenOnlyFeasibleSuccessor =
true;
419 Succ->removePredecessor(BB);
427 }
else if (FeasibleSuccessors.
size() > 1) {
434 if (!FeasibleSuccessors.
contains(DefaultDest)) {
435 if (!NewUnreachableBB) {
445 SI->setDefaultDest(NewUnreachableBB);
450 for (
auto CI =
SI->case_begin(); CI !=
SI->case_end();) {
451 if (FeasibleSuccessors.
contains(CI->getCaseSuccessor())) {
479 Attribute OldAttr =
F->getAttributeAtIndex(AttrIndex, Attribute::Range);
483 F->addAttributeAtIndex(
490 !
F->hasAttributeAtIndex(AttrIndex, Attribute::NonNull)) {
491 F->addAttributeAtIndex(AttrIndex,
506 if (!
A.getType()->isStructTy())
542 TrackedMultipleRetVals;
574 using Edge = std::pair<BasicBlock *, BasicBlock *>;
594 void pushUsersToWorkList(
Value *V);
604 bool MayIncludeUndef =
false);
607 assert(!V->getType()->isStructTy() &&
"structs should use mergeInValue");
608 return markConstant(ValueState[V], V,
C);
639 assert(!V->getType()->isStructTy() &&
640 "non-structs should use markConstant");
641 return mergeInValue(ValueState[V], V, MergeWithV, Opts);
648 assert(!V->getType()->isStructTy() &&
"Should use getStructValueState");
650 auto I = ValueState.try_emplace(V);
667 assert(V->getType()->isStructTy() &&
"Should use getValueState");
669 "Invalid element #");
671 auto I = StructValueState.insert(
679 Constant *Elt =
C->getAggregateElement(i);
697 while (!ToInvalidate.
empty()) {
700 if (!Invalidated.insert(Inst).second)
703 if (!BBExecutable.count(Inst->
getParent()))
710 Function *
F = RetInst->getParent()->getParent();
711 if (
auto It = TrackedRetVals.find(
F); It != TrackedRetVals.end()) {
714 }
else if (MRVFunctionsTracked.count(
F)) {
716 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I)
721 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I) {
722 if (
auto It = StructValueState.find({Inst, I});
723 It != StructValueState.end()) {
728 }
else if (
auto It = ValueState.find(Inst); It != ValueState.end()) {
740 auto It = AdditionalUsers.find(V);
741 if (It != AdditionalUsers.end())
742 for (
User *U : It->second)
758 void addAdditionalUser(
Value *V,
User *U) { AdditionalUsers[V].insert(U); }
761 void handleCallOverdefined(
CallBase &CB);
762 void handleCallResult(
CallBase &CB);
763 void handleCallArguments(
CallBase &CB);
790 markOverdefined(&CPI);
791 visitTerminator(CPI);
808 visitTerminator(CBI);
811 void visitCallBase(CallBase &CB);
812 void visitResumeInst(ResumeInst &
I) {
814 void visitUnreachableInst(UnreachableInst &
I) {
816 void visitFenceInst(FenceInst &
I) {
819 void visitInstruction(Instruction &
I);
823 FnPredicateInfo.insert({&
F, std::make_unique<PredicateInfo>(
824 F, DT, AC, PredicateInfoAllocator)});
828 auto It = FnPredicateInfo.find(&
F);
829 if (It == FnPredicateInfo.end())
835 if (BC->getType() == BC->getOperand(0)->getType()) {
836 if (It->second->getPredicateInfoFor(&Inst)) {
838 Inst.replaceAllUsesWith(
Op);
839 Inst.eraseFromParent();
852 auto It = FnPredicateInfo.find(
I->getParent()->getParent());
853 if (It == FnPredicateInfo.end())
855 return It->second->getPredicateInfoFor(
I);
861 : DL(DL), GetTLI(GetTLI), Ctx(Ctx) {}
874 MRVFunctionsTracked.insert(
F);
875 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
876 TrackedMultipleRetVals.try_emplace(std::make_pair(
F, i));
877 }
else if (!
F->getReturnType()->isVoidTy())
878 TrackedRetVals.try_emplace(
F);
882 MustPreserveReturnsInFunctions.insert(
F);
886 return MustPreserveReturnsInFunctions.count(
F);
890 TrackingIncomingArguments.insert(
F);
894 return TrackingIncomingArguments.count(
F);
898 return TrackingIncomingArguments;
908 return BBExecutable.count(BB);
914 std::vector<ValueLatticeElement> StructValues;
916 assert(STy &&
"getStructLatticeValueFor() can be called only on structs");
917 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
918 auto I = StructValueState.find(std::make_pair(V, i));
919 assert(
I != StructValueState.end() &&
"Value not in valuemap!");
920 StructValues.push_back(
I->second);
933 assert(!
F->getReturnType()->isVoidTy() &&
934 (TrackedRetVals.count(
F) || MRVFunctionsTracked.count(
F)) &&
935 "All non void specializations should be tracked");
937 handleCallResult(*
Call);
941 assert(!V->getType()->isStructTy() &&
942 "Should use getStructLatticeValueFor");
945 assert(
I != ValueState.end() &&
946 "V not found in ValueState nor Paramstate map!");
951 return TrackedRetVals;
956 return TrackedGlobals;
960 return MRVFunctionsTracked;
965 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
966 markOverdefined(getStructValueState(V, i), V);
968 markOverdefined(ValueState[V], V);
972 if (
A->getType()->isIntOrIntVectorTy()) {
973 if (std::optional<ConstantRange>
Range =
A->getRange())
976 if (
A->hasNonNullAttr())
983 if (
A->getType()->isStructTy())
984 return (
void)markOverdefined(
A);
999 BBExecutable.erase(&BB);
1003 bool ResolvedUndefs =
true;
1004 while (ResolvedUndefs) {
1006 ResolvedUndefs =
false;
1013 bool ResolvedUndefs =
true;
1014 while (ResolvedUndefs) {
1016 ResolvedUndefs =
false;
1023 bool ResolvedUndefs =
true;
1024 while (ResolvedUndefs) {
1026 ResolvedUndefs =
false;
1027 for (
Value *V : Invalidated)
1031 Invalidated.clear();
1038 if (!BBExecutable.insert(BB).second)
1041 BBWorkList.push_back(BB);
1050 if (CurI &&
I->getParent() == CurI->
getParent() && !
I->comesBefore(CurI))
1055 InstWorkList.insert(
I);
1058void SCCPInstVisitor::pushUsersToWorkList(
Value *V) {
1063 auto Iter = AdditionalUsers.find(V);
1064 if (Iter != AdditionalUsers.end()) {
1068 for (
User *U : Iter->second)
1079 pushUsersToWorkList(V);
1084 if (!
IV.markConstant(
C, MayIncludeUndef))
1087 pushUsersToWorkList(V);
1093 if (!
IV.markNotConstant(
C))
1095 LLVM_DEBUG(
dbgs() <<
"markNotConstant: " << *
C <<
": " << *V <<
'\n');
1096 pushUsersToWorkList(V);
1102 if (!
IV.markConstantRange(CR))
1104 LLVM_DEBUG(
dbgs() <<
"markConstantRange: " << CR <<
": " << *V <<
'\n');
1105 pushUsersToWorkList(V);
1110 if (!
IV.markOverdefined())
1115 <<
"Function '" <<
F->getName() <<
"'\n";
1116 else dbgs() << *V <<
'\n');
1118 pushUsersToWorkList(V);
1124 const auto &It = TrackedMultipleRetVals.find(std::make_pair(
F, i));
1125 assert(It != TrackedMultipleRetVals.end());
1137 assert(
C->getType() == Ty &&
"Type mismatch");
1151 if (V->getType()->isStructTy()) {
1155 std::vector<Constant *> ConstVals;
1157 for (
unsigned I = 0, E = ST->getNumElements();
I != E; ++
I) {
1171 assert(Const &&
"Constant is nullptr here!");
1177 assert(!Args.empty() &&
"Specialization without arguments");
1178 assert(
F->arg_size() == Args[0].Formal->getParent()->arg_size() &&
1179 "Functions should have the same number of arguments");
1181 auto Iter = Args.begin();
1184 for (
auto End =
F->arg_end(); NewArg != End; ++NewArg, ++OldArg) {
1191 if (Iter != Args.end() && Iter->Formal == &*OldArg) {
1193 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I) {
1195 NewValue.
markConstant(Iter->Actual->getAggregateElement(
I));
1198 ValueState[&*NewArg].markConstant(Iter->Actual);
1203 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I) {
1205 NewValue = StructValueState[{&*OldArg,
I}];
1209 NewValue = ValueState[&*OldArg];
1215void SCCPInstVisitor::visitInstruction(
Instruction &
I) {
1218 LLVM_DEBUG(
dbgs() <<
"SCCP: Don't know how to handle: " <<
I <<
'\n');
1219 markOverdefined(&
I);
1225 if (
IV.mergeIn(MergeWithV, Opts)) {
1226 pushUsersToWorkList(V);
1227 LLVM_DEBUG(
dbgs() <<
"Merged " << MergeWithV <<
" into " << *V <<
" : "
1235 if (!KnownFeasibleEdges.insert(Edge(Source, Dest)).second)
1243 <<
" -> " << Dest->
getName() <<
'\n');
1245 for (PHINode &PN : Dest->
phis())
1246 pushToWorkList(&PN);
1253void SCCPInstVisitor::getFeasibleSuccessors(
Instruction &TI,
1257 if (BI->isUnconditional()) {
1262 ValueLatticeElement BCValue = getValueState(BI->getCondition());
1263 ConstantInt *CI =
getConstantInt(BCValue, BI->getCondition()->getType());
1268 Succs[0] = Succs[1] =
true;
1273 Succs[CI->
isZero()] =
true;
1285 if (!
SI->getNumCases()) {
1289 const ValueLatticeElement &SCValue = getValueState(
SI->getCondition());
1290 if (ConstantInt *CI =
1292 Succs[
SI->findCaseValue(CI)->getSuccessorIndex()] =
true;
1300 unsigned ReachableCaseCount = 0;
1301 for (
const auto &Case :
SI->cases()) {
1302 const APInt &CaseValue = Case.getCaseValue()->getValue();
1304 Succs[Case.getSuccessorIndex()] =
true;
1305 ++ReachableCaseCount;
1309 Succs[
SI->case_default()->getSuccessorIndex()] =
1324 ValueLatticeElement IBRValue = getValueState(IBR->getAddress());
1326 getConstant(IBRValue, IBR->getAddress()->getType()));
1336 "Block address of a different function ?");
1337 for (
unsigned i = 0; i < IBR->getNumSuccessors(); ++i) {
1339 if (IBR->getDestination(i) ==
T) {
1350 LLVM_DEBUG(
dbgs() <<
"Unknown terminator instruction: " << TI <<
'\n');
1360 return KnownFeasibleEdges.count(
Edge(From, To));
1380void SCCPInstVisitor::visitPHINode(
PHINode &PN) {
1384 return (
void)markOverdefined(&PN);
1386 if (getValueState(&PN).isOverdefined())
1392 return (
void)markOverdefined(&PN);
1394 unsigned NumActiveIncoming = 0;
1408 NumActiveIncoming++;
1418 mergeInValue(&PN, PhiState,
1420 NumActiveIncoming + 1));
1426void SCCPInstVisitor::visitReturnInst(
ReturnInst &
I) {
1427 if (
I.getNumOperands() == 0)
1431 Value *ResultOp =
I.getOperand(0);
1435 auto TFRVI = TrackedRetVals.find(
F);
1436 if (TFRVI != TrackedRetVals.end()) {
1437 mergeInValue(TFRVI->second,
F, getValueState(ResultOp));
1443 if (!TrackedMultipleRetVals.empty()) {
1445 if (MRVFunctionsTracked.count(
F))
1446 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
1447 mergeInValue(TrackedMultipleRetVals[std::make_pair(
F, i)],
F,
1448 getStructValueState(ResultOp, i));
1452void SCCPInstVisitor::visitTerminator(
Instruction &TI) {
1454 getFeasibleSuccessors(TI, SuccFeasible);
1459 for (
unsigned i = 0, e = SuccFeasible.
size(); i != e; ++i)
1460 if (SuccFeasible[i])
1464void SCCPInstVisitor::visitCastInst(
CastInst &
I) {
1467 if (ValueState[&
I].isOverdefined())
1471 if (BC->getType() == BC->getOperand(0)->getType()) {
1473 handlePredicate(&
I,
I.getOperand(0), PI);
1479 ValueLatticeElement OpSt = getValueState(
I.getOperand(0));
1483 if (Constant *OpC =
getConstant(OpSt,
I.getOperand(0)->getType())) {
1487 return (
void)markConstant(&
I,
C);
1491 if (
I.getDestTy()->isIntOrIntVectorTy() &&
1492 I.getSrcTy()->isIntOrIntVectorTy() &&
1493 I.getOpcode() != Instruction::BitCast) {
1494 auto &LV = getValueState(&
I);
1495 ConstantRange OpRange =
1498 Type *DestTy =
I.getDestTy();
1502 Trunc->getNoWrapKind());
1507 markOverdefined(&
I);
1514 ValueLatticeElement
L = getValueState(
LHS);
1515 ValueLatticeElement
R = getValueState(
RHS);
1516 addAdditionalUser(
LHS, &EVI);
1517 addAdditionalUser(
RHS, &EVI);
1518 if (
L.isUnknownOrUndef() ||
R.isUnknownOrUndef())
1522 ConstantRange LR =
L.asConstantRange(Ty,
false);
1523 ConstantRange RR =
R.asConstantRange(Ty,
false);
1528 assert(Idx == 1 &&
"Index can only be 0 or 1");
1533 markOverdefined(&EVI);
1541 return (
void)markOverdefined(&EVI);
1545 if (ValueState[&EVI].isOverdefined())
1546 return (
void)markOverdefined(&EVI);
1550 return (
void)markOverdefined(&EVI);
1556 return handleExtractOfWithOverflow(EVI, WO, i);
1557 ValueLatticeElement EltVal = getStructValueState(AggVal, i);
1558 mergeInValue(getValueState(&EVI), &EVI, EltVal);
1561 return (
void)markOverdefined(&EVI);
1568 return (
void)markOverdefined(&IVI);
1572 if (ValueState[&IVI].isOverdefined())
1573 return (
void)markOverdefined(&IVI);
1578 return (
void)markOverdefined(&IVI);
1584 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1587 ValueLatticeElement EltVal = getStructValueState(Aggr, i);
1588 mergeInValue(getStructValueState(&IVI, i), &IVI, EltVal);
1595 markOverdefined(getStructValueState(&IVI, i), &IVI);
1597 ValueLatticeElement InVal = getValueState(Val);
1598 mergeInValue(getStructValueState(&IVI, i), &IVI, InVal);
1603void SCCPInstVisitor::visitSelectInst(
SelectInst &
I) {
1606 if (
I.getType()->isStructTy())
1607 return (
void)markOverdefined(&
I);
1611 if (ValueState[&
I].isOverdefined())
1612 return (
void)markOverdefined(&
I);
1614 ValueLatticeElement CondValue = getValueState(
I.getCondition());
1618 if (ConstantInt *CondCB =
1620 Value *OpVal = CondCB->isZero() ?
I.getFalseValue() :
I.getTrueValue();
1621 mergeInValue(&
I, getValueState(OpVal));
1628 ValueLatticeElement TVal = getValueState(
I.getTrueValue());
1629 ValueLatticeElement FVal = getValueState(
I.getFalseValue());
1631 ValueLatticeElement &State = ValueState[&
I];
1635 pushUsersToWorkListMsg(State, &
I);
1639void SCCPInstVisitor::visitUnaryOperator(
Instruction &
I) {
1640 ValueLatticeElement V0State = getValueState(
I.getOperand(0));
1642 ValueLatticeElement &
IV = ValueState[&
I];
1645 if (
IV.isOverdefined())
1646 return (
void)markOverdefined(&
I);
1655 return (
void)markConstant(
IV, &
I,
C);
1657 markOverdefined(&
I);
1660void SCCPInstVisitor::visitFreezeInst(
FreezeInst &
I) {
1663 if (
I.getType()->isStructTy())
1664 return (
void)markOverdefined(&
I);
1666 ValueLatticeElement V0State = getValueState(
I.getOperand(0));
1667 ValueLatticeElement &
IV = ValueState[&
I];
1670 if (
IV.isOverdefined())
1671 return (
void)markOverdefined(&
I);
1681 markOverdefined(&
I);
1685void SCCPInstVisitor::visitBinaryOperator(
Instruction &
I) {
1686 ValueLatticeElement V1State = getValueState(
I.getOperand(0));
1687 ValueLatticeElement V2State = getValueState(
I.getOperand(1));
1689 ValueLatticeElement &
IV = ValueState[&
I];
1690 if (
IV.isOverdefined())
1698 return (
void)markOverdefined(&
I);
1717 ValueLatticeElement NewV;
1719 return (
void)mergeInValue(&
I, NewV);
1724 if (!
I.getType()->isIntOrIntVectorTy())
1725 return markOverdefined(&
I);
1734 ConstantRange
R = ConstantRange::getEmpty(
I.getType()->getScalarSizeInBits());
1736 R =
A.overflowingBinaryOp(BO->getOpcode(),
B, OBO->getNoWrapKind());
1738 R =
A.binaryOp(BO->getOpcode(),
B);
1747void SCCPInstVisitor::visitCmpInst(
CmpInst &
I) {
1750 if (ValueState[&
I].isOverdefined())
1751 return (
void)markOverdefined(&
I);
1753 Value *Op1 =
I.getOperand(0);
1754 Value *Op2 =
I.getOperand(1);
1758 auto V1State = getValueState(Op1);
1759 auto V2State = getValueState(Op2);
1763 ValueLatticeElement CV;
1765 mergeInValue(&
I, CV);
1774 markOverdefined(&
I);
1780 if (ValueState[&
I].isOverdefined())
1781 return (
void)markOverdefined(&
I);
1783 const ValueLatticeElement &PtrState = getValueState(
I.getPointerOperand());
1789 if (
I.hasNoUnsignedWrap() ||
1792 return (
void)markNotNull(ValueState[&
I], &
I);
1793 return (
void)markOverdefined(&
I);
1799 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i) {
1800 ValueLatticeElement State = getValueState(
I.getOperand(i));
1804 if (Constant *
C =
getConstant(State,
I.getOperand(i)->getType())) {
1809 return (
void)markOverdefined(&
I);
1813 markConstant(&
I,
C);
1815 markOverdefined(&
I);
1818void SCCPInstVisitor::visitAllocaInst(
AllocaInst &
I) {
1820 return (
void)markNotNull(ValueState[&
I], &
I);
1822 markOverdefined(&
I);
1825void SCCPInstVisitor::visitStoreInst(
StoreInst &
SI) {
1827 if (
SI.getOperand(0)->getType()->isStructTy())
1834 auto I = TrackedGlobals.find(GV);
1835 if (
I == TrackedGlobals.end())
1839 mergeInValue(
I->second, GV, getValueState(
SI.getOperand(0)),
1840 ValueLatticeElement::MergeOptions().setCheckWiden(
false));
1841 if (
I->second.isOverdefined())
1842 TrackedGlobals.erase(
I);
1847 if (CB->getType()->isIntOrIntVectorTy())
1848 if (std::optional<ConstantRange>
Range = CB->getRange())
1850 if (CB->getType()->isPointerTy() && CB->isReturnNonNull())
1855 if (
I->getType()->isIntOrIntVectorTy())
1856 if (
MDNode *Ranges =
I->getMetadata(LLVMContext::MD_range))
1859 if (
I->hasMetadata(LLVMContext::MD_nonnull))
1868void SCCPInstVisitor::visitLoadInst(
LoadInst &
I) {
1871 if (
I.getType()->isStructTy() ||
I.isVolatile())
1872 return (
void)markOverdefined(&
I);
1876 if (ValueState[&
I].isOverdefined())
1877 return (
void)markOverdefined(&
I);
1879 ValueLatticeElement PtrVal = getValueState(
I.getOperand(0));
1883 ValueLatticeElement &
IV = ValueState[&
I];
1891 return (
void)markOverdefined(
IV, &
I);
1898 if (!TrackedGlobals.empty()) {
1900 auto It = TrackedGlobals.find(GV);
1901 if (It != TrackedGlobals.end()) {
1910 return (
void)markConstant(
IV, &
I,
C);
1917void SCCPInstVisitor::visitCallBase(
CallBase &CB) {
1918 handleCallResult(CB);
1919 handleCallArguments(CB);
1922void SCCPInstVisitor::handleCallOverdefined(
CallBase &CB) {
1931 return (
void)markOverdefined(&CB);
1937 for (
const Use &
A : CB.
args()) {
1938 if (
A.get()->getType()->isStructTy())
1939 return markOverdefined(&CB);
1940 if (
A.get()->getType()->isMetadataTy())
1942 ValueLatticeElement State = getValueState(
A);
1947 return (
void)markOverdefined(&CB);
1953 return (
void)markOverdefined(&CB);
1958 return (
void)markConstant(&CB,
C);
1965void SCCPInstVisitor::handleCallArguments(
CallBase &CB) {
1970 if (TrackingIncomingArguments.count(
F)) {
1979 if (AI->hasByValAttr() && !
F->onlyReadsMemory()) {
1980 markOverdefined(&*AI);
1985 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1986 ValueLatticeElement CallArg = getStructValueState(*CAI, i);
1987 mergeInValue(getStructValueState(&*AI, i), &*AI, CallArg,
2000 ValueLatticeElement CopyOfVal = getValueState(CopyOf);
2001 const std::optional<PredicateConstraint> &Constraint = PI->
getConstraint();
2003 mergeInValue(ValueState[
I],
I, CopyOfVal);
2008 Value *OtherOp = Constraint->OtherOp;
2011 if (getValueState(OtherOp).isUnknown()) {
2012 addAdditionalUser(OtherOp,
I);
2016 ValueLatticeElement CondVal = getValueState(OtherOp);
2017 ValueLatticeElement &
IV = ValueState[
I];
2020 ConstantRange::getFull(DL.getTypeSizeInBits(CopyOf->
getType()));
2032 if (CopyOfCR.isEmptySet())
2033 CopyOfCR = ConstantRange::getFull(CopyOfCR.getBitWidth());
2034 auto NewCR = ImposedCR.intersectWith(CopyOfCR);
2038 if (!CopyOfCR.contains(NewCR) && CopyOfCR.getSingleMissingElement())
2046 addAdditionalUser(OtherOp,
I);
2054 addAdditionalUser(OtherOp,
I);
2055 mergeInValue(
IV,
I, CondVal);
2059 addAdditionalUser(OtherOp,
I);
2064 return (
void)mergeInValue(
IV,
I, CopyOfVal);
2067void SCCPInstVisitor::handleCallResult(
CallBase &CB) {
2071 if (
II->getIntrinsicID() == Intrinsic::vscale) {
2083 const ValueLatticeElement &State = getValueState(
Op);
2099 if (!
F ||
F->isDeclaration())
2100 return handleCallOverdefined(CB);
2104 if (!MRVFunctionsTracked.count(
F))
2105 return handleCallOverdefined(CB);
2109 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
2110 mergeInValue(getStructValueState(&CB, i), &CB,
2111 TrackedMultipleRetVals[std::make_pair(
F, i)],
2114 auto TFRVI = TrackedRetVals.find(
F);
2115 if (TFRVI == TrackedRetVals.end())
2116 return handleCallOverdefined(CB);
2125 while (!BBWorkList.empty() || !InstWorkList.empty()) {
2127 while (!InstWorkList.empty()) {
2129 Invalidated.erase(
I);
2137 while (!BBWorkList.empty()) {
2139 BBVisited.insert(BB);
2153 if (
I.getType()->isVoidTy())
2162 if (MRVFunctionsTracked.count(
F))
2171 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
2174 markOverdefined(LV, &
I);
2192 if (TrackedRetVals.count(
F))
2202 markOverdefined(&
I);
2220 bool MadeChange =
false;
2222 if (!BBExecutable.count(&BB))
2230 <<
"\nResolved undefs in " <<
F.getName() <<
'\n');
2249 Visitor->addPredicateInfo(
F, DT, AC);
2253 Visitor->removeSSACopies(
F);
2257 return Visitor->markBlockExecutable(BB);
2261 return Visitor->getPredicateInfoFor(
I);
2265 Visitor->trackValueOfGlobalVariable(GV);
2269 Visitor->addTrackedFunction(
F);
2273 Visitor->addToMustPreserveReturnsInFunctions(
F);
2277 return Visitor->mustPreserveReturn(
F);
2281 Visitor->addArgumentTrackedFunction(
F);
2285 return Visitor->isArgumentTrackedFunction(
F);
2290 return Visitor->getArgumentTrackedFunctions();
2296 return Visitor->resolvedUndefsIn(
F);
2300 Visitor->solveWhileResolvedUndefsIn(M);
2305 Visitor->solveWhileResolvedUndefsIn(WorkList);
2309 Visitor->solveWhileResolvedUndefs();
2313 return Visitor->isBlockExecutable(BB);
2317 return Visitor->isEdgeFeasible(From, To);
2320std::vector<ValueLatticeElement>
2322 return Visitor->getStructLatticeValueFor(V);
2326 return Visitor->removeLatticeValueFor(V);
2330 Visitor->resetLatticeValueFor(
Call);
2334 return Visitor->getLatticeValueFor(V);
2339 return Visitor->getTrackedRetVals();
2344 return Visitor->getTrackedGlobals();
2348 return Visitor->getMRVFunctionsTracked();
2354 Visitor->trackValueOfArgument(V);
2358 return Visitor->isStructLatticeConstant(
F, STy);
2363 return Visitor->getConstant(LV, Ty);
2367 return Visitor->getConstantOrNull(V);
2372 Visitor->setLatticeValueForSpecializationArguments(
F, Args);
2376 Visitor->markFunctionUnreachable(
F);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
mir Rename Register Operands
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
static ValueLatticeElement::MergeOptions getMaxWidenStepsOpts()
Returns MergeOptions with MaxWidenSteps set to MaxNumRangeExtensions.
static const unsigned MaxNumRangeExtensions
static ValueLatticeElement getValueFromMetadata(const Instruction *I)
std::pair< BasicBlock *, BasicBlock * > Edge
This file implements a set that has insertion order iteration characteristics.
static ConstantInt * getConstantInt(Value *V, const DataLayout &DL)
Extract ConstantInt from value, looking through IntToPtr and PointerNullValue.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static const uint32_t IV[8]
Class for arbitrary precision integers.
unsigned countr_zero() const
Count the number of trailing zero bits.
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
A cache of @llvm.assume calls within a function.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM Basic Block Representation.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
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.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
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 Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
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.
Function * getFunction() const
BasicBlock * getBasicBlock() const
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This is the base class for all instructions that perform data casts.
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 ...
This class is the base class for the comparison instructions.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLE
signed less or equal
@ ICMP_ULE
unsigned less or equal
This is the shared class of boolean and integer constants.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
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 ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI ConstantRange castOp(Instruction::CastOps CastOp, uint32_t BitWidth) const
Return a new range representing the possible values resulting from an application of the specified ca...
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
LLVM_ABI bool isSizeLargerThan(uint64_t MaxSize) const
Compare set size of this range with Value.
static LLVM_ABI bool isIntrinsicSupported(Intrinsic::ID IntrinsicID)
Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
LLVM_ABI bool isAllNonNegative() const
Return true if all values in this range are non-negative.
static LLVM_ABI ConstantRange makeAllowedICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value c...
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
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 ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
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 ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
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.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
A parsed version of the target data layout string in and methods for querying it.
static DebugLoc getTemporary()
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Implements a dense probed hash-table based set.
static constexpr UpdateKind Delete
static constexpr UpdateKind Insert
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
This class represents a freeze function that returns random concrete value if an operand is either a ...
static GEPNoWrapFlags noUnsignedWrap()
void applyUpdatesPermissive(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Module * getParent()
Get the module that this global value is contained inside of...
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
This instruction inserts a struct field of array element value into an aggregate value.
Value * getInsertedValueOperand()
Value * getAggregateOperand()
unsigned getNumIndices() const
idx_iterator idx_begin() const
Base class for instruction visitors.
void visit(Iterator Start, Iterator End)
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
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 BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
LLVM_ABI bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
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.
bool isSpecialTerminator() const
This is an important class for using LLVM in a threaded context.
@ OB_clang_arc_attachedcall
An instruction for reading from memory.
This class implements a map that also provides access to all stored values in a deterministic order.
A Module instance is used to store all the information related to an LLVM module.
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
LLVM_ABI std::optional< PredicateConstraint > getConstraint() const
Fetch condition in the form of PredicateConstraint, if possible.
Return a value (possibly void), from a function.
Helper class for SCCPSolver.
const MapVector< Function *, ValueLatticeElement > & getTrackedRetVals() const
const PredicateBase * getPredicateInfoFor(Instruction *I)
std::vector< ValueLatticeElement > getStructLatticeValueFor(Value *V) const
bool resolvedUndef(Instruction &I)
void markFunctionUnreachable(Function *F)
bool markBlockExecutable(BasicBlock *BB)
bool resolvedUndefsIn(Function &F)
While solving the dataflow for a function, we don't compute a result for operations with an undef ope...
Constant * getConstant(const ValueLatticeElement &LV, Type *Ty) const
SCCPInstVisitor(const DataLayout &DL, std::function< const TargetLibraryInfo &(Function &)> GetTLI, LLVMContext &Ctx)
const DenseMap< GlobalVariable *, ValueLatticeElement > & getTrackedGlobals() const
const ValueLatticeElement & getLatticeValueFor(Value *V) const
void removeLatticeValueFor(Value *V)
void trackValueOfArgument(Argument *A)
void visitCallInst(CallInst &I)
void markOverdefined(Value *V)
bool isArgumentTrackedFunction(Function *F)
void addTrackedFunction(Function *F)
void solveWhileResolvedUndefs()
void solveWhileResolvedUndefsIn(Module &M)
void trackValueOfGlobalVariable(GlobalVariable *GV)
Constant * getConstantOrNull(Value *V) const
void removeSSACopies(Function &F)
const SmallPtrSet< Function *, 16 > & getMRVFunctionsTracked() const
const SmallPtrSetImpl< Function * > & getArgumentTrackedFunctions() const
void resetLatticeValueFor(CallBase *Call)
Invalidate the Lattice Value of Call and its users after specializing the call.
ValueLatticeElement getArgAttributeVL(Argument *A)
void addPredicateInfo(Function &F, DominatorTree &DT, AssumptionCache &AC)
void addToMustPreserveReturnsInFunctions(Function *F)
void addArgumentTrackedFunction(Function *F)
bool isStructLatticeConstant(Function *F, StructType *STy)
void solveWhileResolvedUndefsIn(SmallVectorImpl< Function * > &WorkList)
bool isBlockExecutable(BasicBlock *BB) const
bool mustPreserveReturn(Function *F)
void setLatticeValueForSpecializationArguments(Function *F, const SmallVectorImpl< ArgInfo > &Args)
bool isEdgeFeasible(BasicBlock *From, BasicBlock *To) const
SCCPSolver - This interface class is a general purpose solver for Sparse Conditional Constant Propaga...
LLVM_ABI void visitCall(CallInst &I)
LLVM_ABI void resetLatticeValueFor(CallBase *Call)
Invalidate the Lattice Value of Call and its users after specializing the call.
LLVM_ABI void trackValueOfGlobalVariable(GlobalVariable *GV)
trackValueOfGlobalVariable - Clients can use this method to inform the SCCPSolver that it should trac...
LLVM_ABI bool tryToReplaceWithConstant(Value *V)
LLVM_ABI void inferArgAttributes() const
LLVM_ABI bool isStructLatticeConstant(Function *F, StructType *STy)
LLVM_ABI void addPredicateInfo(Function &F, DominatorTree &DT, AssumptionCache &AC)
LLVM_ABI void solve()
Solve - Solve for constants and executable blocks.
LLVM_ABI void visit(Instruction *I)
LLVM_ABI void trackValueOfArgument(Argument *V)
trackValueOfArgument - Mark the specified argument overdefined unless it have range attribute.
LLVM_ABI const DenseMap< GlobalVariable *, ValueLatticeElement > & getTrackedGlobals() const
getTrackedGlobals - Get and return the set of inferred initializers for global variables.
LLVM_ABI void addTrackedFunction(Function *F)
addTrackedFunction - If the SCCP solver is supposed to track calls into and out of the specified func...
LLVM_ABI void solveWhileResolvedUndefsIn(Module &M)
LLVM_ABI const PredicateBase * getPredicateInfoFor(Instruction *I)
LLVM_ABI const SmallPtrSetImpl< Function * > & getArgumentTrackedFunctions() const
LLVM_ABI const SmallPtrSet< Function *, 16 > & getMRVFunctionsTracked() const
getMRVFunctionsTracked - Get the set of functions which return multiple values tracked by the pass.
LLVM_ABI bool resolvedUndefsIn(Function &F)
resolvedUndefsIn - While solving the dataflow for a function, we assume that branches on undef values...
LLVM_ABI void addArgumentTrackedFunction(Function *F)
LLVM_ABI void solveWhileResolvedUndefs()
LLVM_ABI void removeLatticeValueFor(Value *V)
LLVM_ABI std::vector< ValueLatticeElement > getStructLatticeValueFor(Value *V) const
LLVM_ABI Constant * getConstantOrNull(Value *V) const
Return either a Constant or nullptr for a given Value.
LLVM_ABI bool simplifyInstsInBlock(BasicBlock &BB, SmallPtrSetImpl< Value * > &InsertedValues, Statistic &InstRemovedStat, Statistic &InstReplacedStat)
LLVM_ABI Constant * getConstant(const ValueLatticeElement &LV, Type *Ty) const
Helper to return a Constant if LV is either a constant or a constant range with a single element.
LLVM_ABI const ValueLatticeElement & getLatticeValueFor(Value *V) const
LLVM_ABI void addToMustPreserveReturnsInFunctions(Function *F)
Add function to the list of functions whose return cannot be modified.
LLVM_ABI bool removeNonFeasibleEdges(BasicBlock *BB, DomTreeUpdater &DTU, BasicBlock *&NewUnreachableBB) const
LLVM_ABI bool isBlockExecutable(BasicBlock *BB) const
LLVM_ABI void inferReturnAttributes() const
LLVM_ABI bool markBlockExecutable(BasicBlock *BB)
markBlockExecutable - This method can be used by clients to mark all of the blocks that are known to ...
LLVM_ABI void setLatticeValueForSpecializationArguments(Function *F, const SmallVectorImpl< ArgInfo > &Args)
Set the Lattice Value for the arguments of a specialization F.
static LLVM_ABI bool isConstant(const ValueLatticeElement &LV)
LLVM_ABI const MapVector< Function *, ValueLatticeElement > & getTrackedRetVals() const
getTrackedRetVals - Get the inferred return value map.
LLVM_ABI bool isEdgeFeasible(BasicBlock *From, BasicBlock *To) const
LLVM_ABI bool mustPreserveReturn(Function *F)
Returns true if the return of the given function cannot be modified.
static LLVM_ABI bool isOverdefined(const ValueLatticeElement &LV)
LLVM_ABI void markFunctionUnreachable(Function *F)
Mark all of the blocks in function F non-executable.
LLVM_ABI bool isArgumentTrackedFunction(Function *F)
Returns true if the given function is in the solver's set of argument-tracked functions.
LLVM_ABI SCCPSolver(const DataLayout &DL, std::function< const TargetLibraryInfo &(Function &)> GetTLI, LLVMContext &Ctx)
LLVM_ABI void markOverdefined(Value *V)
markOverdefined - Mark the specified value overdefined.
LLVM_ABI void removeSSACopies(Function &F)
This class represents the LLVM 'select' instruction.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Class to represent struct types.
unsigned getNumElements() const
Random access to the elements.
A wrapper class to simplify modification of SwitchInst cases along with their prof branch_weights met...
Provides information about what library functions are available for the current target.
This class represents a truncation of integer types.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
bool isStructTy() const
True if this is an instance of StructType.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isVoidTy() const
Return true if this is 'void'.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
This function has undefined behavior.
Value * getOperand(unsigned i) const
This class represents lattice values for constants.
static ValueLatticeElement getRange(ConstantRange CR, bool MayIncludeUndef=false)
bool isOverdefined() const
LLVM_ABI Constant * getCompare(CmpInst::Predicate Pred, Type *Ty, const ValueLatticeElement &Other, const DataLayout &DL) const
true, false or undef constants, or nullptr if the comparison cannot be evaluated.
bool isConstantRangeIncludingUndef() const
static ValueLatticeElement getNot(Constant *C)
ConstantRange asConstantRange(unsigned BW, bool UndefAllowed=false) const
bool isNotConstant() const
void setNumRangeExtensions(unsigned N)
const ConstantRange & getConstantRange(bool UndefAllowed=true) const
Returns the constant range for this value.
bool isConstantRange(bool UndefAllowed=true) const
Returns true if this value is a constant range.
unsigned getNumRangeExtensions() const
Constant * getNotConstant() const
bool isUnknownOrUndef() const
Constant * getConstant() const
bool mergeIn(const ValueLatticeElement &RHS, MergeOptions Opts=MergeOptions())
Updates this object to approximate both this object and RHS.
bool markConstant(Constant *V, bool MayIncludeUndef=false)
static ValueLatticeElement getOverdefined()
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI std::string getNameOrAsOperand() const
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
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.
Represents an op.with.overflow intrinsic.
const ParentTy * getParent() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
static bool replaceSignedInst(SCCPSolver &Solver, SmallPtrSetImpl< Value * > &InsertedValues, Instruction &Inst)
Try to replace signed instructions with their unsigned equivalent.
LLVM_ABI bool canConstantFoldCallTo(const CallBase *Call, const Function *F)
canConstantFoldCallTo - Return true if its even possible to fold a call to the specified function.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
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 Constant * ConstantFoldCall(const CallBase *Call, Function *F, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldCall - Attempt to constant fold a call to the specified function with the specified argum...
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
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)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI bool wouldInstructionBeTriviallyDead(const Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction would have no side effects if it was not used.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
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...
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
@ Sub
Subtraction of integers.
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
LLVM_ABI Constant * ConstantFoldInstOperands(const Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
static bool refineInstruction(SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues, Instruction &Inst)
Try to use Inst's value range from Solver to infer the NUW flag.
static void inferAttribute(Function *F, unsigned AttrIndex, const ValueLatticeElement &Val)
Implement std::hash so that hash_code can be used in STL containers.
Struct to control some aspects related to merging constant ranges.
MergeOptions & setMaxWidenSteps(unsigned Steps=1)