41#define DEBUG_TYPE "sccp"
82 <<
" as a constant\n");
86 LLVM_DEBUG(
dbgs() <<
" Constant: " << *Const <<
" = " << *V <<
'\n');
89 V->replaceAllUsesWith(Const);
101 if (!Callee->hasMetadata(LLVMContext::MD_implicit_ref))
109 Callee->getMetadata(LLVMContext::MD_implicit_ref, MDs);
111 Caller->addMetadata(LLVMContext::MD_implicit_ref, *MD);
120 return Const->toConstantRange();
122 unsigned Bitwidth =
Op->getType()->getScalarSizeInBits();
123 return ConstantRange::getFull(Bitwidth);
134 auto GetRange = [&Solver, &InsertedValues](
Value *
Op) {
148 if (NUWRange.contains(RangeA)) {
157 if (NSWRange.contains(RangeA)) {
164 if (
Range.isAllNonNegative()) {
169 if (TI->hasNoSignedWrap() && TI->hasNoUnsignedWrap())
173 uint64_t DestWidth = TI->getDestTy()->getScalarSizeInBits();
174 if (!TI->hasNoUnsignedWrap()) {
175 if (
Range.getActiveBits() <= DestWidth) {
176 TI->setHasNoUnsignedWrap(
true);
180 if (!TI->hasNoSignedWrap()) {
181 if (
Range.getMinSignedBits() <= DestWidth) {
182 TI->setHasNoSignedWrap(
true);
187 if (
GEP->hasNoUnsignedWrap() || !
GEP->hasNoUnsignedSignedWrap())
191 [&](
Value *V) { return GetRange(V).isAllNonNegative(); })) {
192 GEP->setNoWrapFlags(
GEP->getNoWrapFlags() |
206 auto isNonNegative = [&Solver, &InsertedValues](
Value *V) {
212 case Instruction::SIToFP:
213 case Instruction::SExt: {
216 if (!isNonNegative(Op0))
220 : Instruction::UIToFP,
225 case Instruction::AShr: {
228 if (!isNonNegative(Op0))
234 case Instruction::SDiv:
235 case Instruction::SRem: {
238 if (!isNonNegative(Op0) || !isNonNegative(Op1))
240 auto NewOpcode = Inst.
getOpcode() == Instruction::SDiv ? Instruction::UDiv
243 if (Inst.
getOpcode() == Instruction::SDiv)
252 assert(NewInst &&
"Expected replacement instruction");
254 InsertedValues.
insert(NewInst);
266 auto GetRange = [&Solver, &InsertedValues](
Value *
Op) {
281 Value *LHS = Cmp->getOperand(0);
282 Value *RHS = Cmp->getOperand(1);
283 unsigned BitWidth = LHS->getType()->getScalarSizeInBits();
297 if (!RHSLower.
icmp(Pred, LRange) || !LRange.
icmp(Pred, RHSUpper))
314 auto MatchTwoInstructionExactRangeCheck =
315 [&]() -> std::optional<ConstantRange> {
320 Value *LHS = ICmp->getOperand(0);
326 if (ICmp->isEquality()) {
337 if (
auto CR = MatchTwoInstructionExactRangeCheck()) {
342 auto ConvertCRToICmp =
343 [&](
const std::optional<ConstantRange> &NewCR) ->
Value * {
347 if (NewCR && NewCR->getEquivalentICmp(Pred, RHS)) {
350 Builder.CreateICmp(Pred,
X, ConstantInt::get(
X->getType(), RHS));
351 InsertedValues.
insert(NewICmp);
360 if (
auto *V = ConvertCRToICmp(CR->exactIntersectWith(LRange)))
363 if (
auto *V = ConvertCRToICmp(CR->exactUnionWith(LRange.
inverse())))
375 bool MadeChanges =
false;
377 if (Inst.getType()->isVoidTy())
385 Inst.eraseFromParent();
396 Inst.replaceAllUsesWith(V);
397 Inst.eraseFromParent();
408 bool HasNonFeasibleEdges =
false;
411 FeasibleSuccessors.
insert(Succ);
413 HasNonFeasibleEdges =
true;
417 if (!HasNonFeasibleEdges)
423 "Terminator must be a br, switch or indirectbr");
425 if (FeasibleSuccessors.
size() == 0) {
430 Succ->removePredecessor(BB);
431 if (SeenSuccs.
insert(Succ).second)
437 }
else if (FeasibleSuccessors.
size() == 1) {
441 bool HaveSeenOnlyFeasibleSuccessor =
false;
443 if (Succ == OnlyFeasibleSuccessor && !HaveSeenOnlyFeasibleSuccessor) {
446 HaveSeenOnlyFeasibleSuccessor =
true;
450 Succ->removePredecessor(BB);
458 }
else if (FeasibleSuccessors.
size() > 1) {
465 if (!FeasibleSuccessors.
contains(DefaultDest)) {
466 if (!NewUnreachableBB) {
476 SI->setDefaultDest(NewUnreachableBB);
481 for (
auto CI =
SI->case_begin(); CI !=
SI->case_end();) {
482 if (FeasibleSuccessors.
contains(CI->getCaseSuccessor())) {
510 Attribute OldAttr =
F->getAttributeAtIndex(AttrIndex, Attribute::Range);
514 F->addAttributeAtIndex(
521 !
F->hasAttributeAtIndex(AttrIndex, Attribute::NonNull)) {
522 F->addAttributeAtIndex(AttrIndex,
537 if (!
A.getType()->isStructTy())
573 TrackedMultipleRetVals;
605 using Edge = std::pair<BasicBlock *, BasicBlock *>;
625 void pushUsersToWorkList(
Value *V);
635 bool MayIncludeUndef =
false);
638 assert(!V->getType()->isStructTy() &&
"structs should use mergeInValue");
639 return markConstant(ValueState[V], V,
C);
671 assert(!V->getType()->isStructTy() &&
"Should use getStructValueState");
673 auto I = ValueState.try_emplace(V);
690 assert(V->getType()->isStructTy() &&
"Should use getValueState");
692 "Invalid element #");
694 auto I = StructValueState.insert(
702 Constant *Elt =
C->getAggregateElement(i);
720 while (!ToInvalidate.
empty()) {
723 if (!Invalidated.insert(Inst).second)
726 if (!BBExecutable.count(Inst->
getParent()))
733 Function *
F = RetInst->getParent()->getParent();
734 if (
auto It = TrackedRetVals.find(
F); It != TrackedRetVals.end()) {
737 }
else if (MRVFunctionsTracked.count(
F)) {
739 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I)
744 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I) {
745 if (
auto It = StructValueState.find({Inst, I});
746 It != StructValueState.end()) {
751 }
else if (
auto It = ValueState.find(Inst); It != ValueState.end()) {
763 auto It = AdditionalUsers.find(V);
764 if (It != AdditionalUsers.end())
765 for (
User *U : It->second)
781 void addAdditionalUser(
Value *V,
User *U) { AdditionalUsers[V].insert(U); }
784 void handleCallOverdefined(
CallBase &CB);
785 void handleCallResult(
CallBase &CB);
786 void handleCallArguments(
CallBase &CB);
814 markOverdefined(&CPI);
815 visitTerminator(CPI);
832 visitTerminator(CBI);
835 void visitCallBase(CallBase &CB);
836 void visitResumeInst(ResumeInst &
I) {
838 void visitUnreachableInst(UnreachableInst &
I) {
840 void visitFenceInst(FenceInst &
I) {
843 void visitInstruction(Instruction &
I);
847 FnPredicateInfo.insert({&
F, std::make_unique<PredicateInfo>(
848 F, DT, AC, PredicateInfoAllocator)});
852 auto It = FnPredicateInfo.find(&
F);
853 if (It == FnPredicateInfo.end())
859 if (BC->getType() == BC->getOperand(0)->getType()) {
860 if (It->second->getPredicateInfoFor(&Inst)) {
862 Inst.replaceAllUsesWith(
Op);
863 Inst.eraseFromParent();
876 auto It = FnPredicateInfo.find(
I->getParent()->getParent());
877 if (It == FnPredicateInfo.end())
879 return It->second->getPredicateInfoFor(
I);
885 : DL(DL), GetTLI(GetTLI), Ctx(Ctx) {}
898 MRVFunctionsTracked.insert(
F);
899 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
900 TrackedMultipleRetVals.try_emplace(std::make_pair(
F, i));
901 }
else if (!
F->getReturnType()->isVoidTy())
902 TrackedRetVals.try_emplace(
F);
906 MustPreserveReturnsInFunctions.insert(
F);
910 return MustPreserveReturnsInFunctions.count(
F);
914 TrackingIncomingArguments.insert(
F);
918 return TrackingIncomingArguments.count(
F);
922 return TrackingIncomingArguments;
932 return BBExecutable.count(BB);
938 std::vector<ValueLatticeElement> StructValues;
940 assert(STy &&
"getStructLatticeValueFor() can be called only on structs");
941 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
942 auto I = StructValueState.find(std::make_pair(V, i));
943 assert(
I != StructValueState.end() &&
"Value not in valuemap!");
944 StructValues.push_back(
I->second);
957 assert(!
F->getReturnType()->isVoidTy() &&
958 (TrackedRetVals.count(
F) || MRVFunctionsTracked.count(
F)) &&
959 "All non void specializations should be tracked");
961 handleCallResult(*
Call);
965 assert(!V->getType()->isStructTy() &&
966 "Should use getStructLatticeValueFor");
967 auto I = ValueState.find(V);
968 assert(
I != ValueState.end() &&
969 "V not found in ValueState nor Paramstate map!");
974 return TrackedRetVals;
979 return TrackedGlobals;
983 return MRVFunctionsTracked;
988 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
989 markOverdefined(getStructValueState(V, i), V);
991 markOverdefined(ValueState[V], V);
995 if (
A->getType()->isIntOrIntVectorTy()) {
996 if (std::optional<ConstantRange>
Range =
A->getRange())
999 if (
A->hasNonNullAttr())
1006 if (
A->getType()->isStructTy())
1007 return (
void)markOverdefined(
A);
1022 BBExecutable.erase(&BB);
1026 bool ResolvedUndefs =
true;
1027 while (ResolvedUndefs) {
1029 ResolvedUndefs =
false;
1036 bool ResolvedUndefs =
true;
1037 while (ResolvedUndefs) {
1039 ResolvedUndefs =
false;
1046 bool ResolvedUndefs =
true;
1047 while (ResolvedUndefs) {
1049 ResolvedUndefs =
false;
1050 for (
Value *V : Invalidated)
1054 Invalidated.clear();
1061 if (!BBExecutable.insert(BB).second)
1064 BBWorkList.push_back(BB);
1073 if (CurI &&
I->getParent() == CurI->
getParent() && !
I->comesBefore(CurI))
1078 InstWorkList.insert(
I);
1081void SCCPInstVisitor::pushUsersToWorkList(
Value *V) {
1086 auto Iter = AdditionalUsers.find(V);
1087 if (Iter != AdditionalUsers.end()) {
1091 for (
User *U : Iter->second)
1102 pushUsersToWorkList(V);
1107 if (!
IV.markConstant(
C, MayIncludeUndef))
1110 pushUsersToWorkList(V);
1116 if (!
IV.markNotConstant(
C))
1118 LLVM_DEBUG(
dbgs() <<
"markNotConstant: " << *
C <<
": " << *V <<
'\n');
1119 pushUsersToWorkList(V);
1125 if (!
IV.markConstantRange(CR))
1127 LLVM_DEBUG(
dbgs() <<
"markConstantRange: " << CR <<
": " << *V <<
'\n');
1128 pushUsersToWorkList(V);
1133 if (!
IV.markOverdefined())
1138 <<
"Function '" <<
F->getName() <<
"'\n";
1139 else dbgs() << *V <<
'\n');
1141 pushUsersToWorkList(V);
1147 const auto &It = TrackedMultipleRetVals.find(std::make_pair(
F, i));
1148 assert(It != TrackedMultipleRetVals.end());
1159 assert(
C->getType() == Ty &&
"Type mismatch");
1173 if (V->getType()->isStructTy()) {
1177 std::vector<Constant *> ConstVals;
1179 for (
unsigned I = 0, E = ST->getNumElements();
I != E; ++
I) {
1193 assert(Const &&
"Constant is nullptr here!");
1199 assert(!Args.empty() &&
"Specialization without arguments");
1200 assert(
F->arg_size() == Args[0].Formal->getParent()->arg_size() &&
1201 "Functions should have the same number of arguments");
1203 auto Iter = Args.begin();
1206 for (
auto End =
F->arg_end(); NewArg != End; ++NewArg, ++OldArg) {
1213 if (Iter != Args.end() && Iter->Formal == &*OldArg) {
1215 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I) {
1217 NewValue.
markConstant(Iter->Actual->getAggregateElement(
I));
1220 ValueState[&*NewArg].markConstant(Iter->Actual);
1225 for (
unsigned I = 0, E = STy->getNumElements();
I != E; ++
I) {
1227 NewValue = StructValueState[{&*OldArg,
I}];
1231 NewValue = ValueState[&*OldArg];
1237void SCCPInstVisitor::visitInstruction(
Instruction &
I) {
1240 LLVM_DEBUG(
dbgs() <<
"SCCP: Don't know how to handle: " <<
I <<
'\n');
1241 markOverdefined(&
I);
1247 if (
IV.mergeIn(MergeWithV, Opts)) {
1248 pushUsersToWorkList(V);
1249 LLVM_DEBUG(
dbgs() <<
"Merged " << MergeWithV <<
" into " << *V <<
" : "
1257 if (!KnownFeasibleEdges.insert(Edge(Source, Dest)).second)
1265 <<
" -> " << Dest->
getName() <<
'\n');
1267 for (PHINode &PN : Dest->
phis())
1268 pushToWorkList(&PN);
1275void SCCPInstVisitor::getFeasibleSuccessors(
Instruction &TI,
1284 const ValueLatticeElement &BCValue = getValueState(BI->getCondition());
1285 ConstantInt *CI =
getConstantInt(BCValue, BI->getCondition()->getType());
1290 Succs[0] = Succs[1] =
true;
1295 Succs[CI->
isZero()] =
true;
1307 if (!
SI->getNumCases()) {
1311 const ValueLatticeElement &SCValue = getValueState(
SI->getCondition());
1312 if (ConstantInt *CI =
1314 Succs[
SI->findCaseValue(CI)->getSuccessorIndex()] =
true;
1322 unsigned ReachableCaseCount = 0;
1323 for (
const auto &Case :
SI->cases()) {
1324 const APInt &CaseValue = Case.getCaseValue()->getValue();
1326 Succs[Case.getSuccessorIndex()] =
true;
1327 ++ReachableCaseCount;
1331 Succs[
SI->case_default()->getSuccessorIndex()] =
1346 const ValueLatticeElement &IBRValue = getValueState(IBR->getAddress());
1348 getConstant(IBRValue, IBR->getAddress()->getType()));
1358 "Block address of a different function ?");
1359 for (
unsigned i = 0; i < IBR->getNumSuccessors(); ++i) {
1361 if (IBR->getDestination(i) ==
T) {
1372 LLVM_DEBUG(
dbgs() <<
"Unknown terminator instruction: " << TI <<
'\n');
1382 return KnownFeasibleEdges.count(
Edge(From, To));
1402void SCCPInstVisitor::visitPHINode(
PHINode &PN) {
1406 return (
void)markOverdefined(&PN);
1408 if (isInstFullyOverDefined(PN))
1423 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1427 for (
unsigned j : FeasibleIncomingIndices) {
1434 ValueLatticeElement &PhiStateRef = getStructValueState(&PN, i);
1435 mergeInValue(PhiStateRef, &PN, PhiState,
1436 ValueLatticeElement::MergeOptions().setMaxWidenSteps(
1437 FeasibleIncomingIndices.size() + 1));
1439 std::max((
unsigned)FeasibleIncomingIndices.size(),
1443 ValueLatticeElement PhiState = getValueState(&PN);
1444 for (
unsigned i : FeasibleIncomingIndices) {
1455 ValueLatticeElement &PhiStateRef = ValueState[&PN];
1456 mergeInValue(PhiStateRef, &PN, PhiState,
1457 ValueLatticeElement::MergeOptions().setMaxWidenSteps(
1458 FeasibleIncomingIndices.size() + 1));
1460 std::max((
unsigned)FeasibleIncomingIndices.size(),
1465void SCCPInstVisitor::visitReturnInst(
ReturnInst &
I) {
1466 if (
I.getNumOperands() == 0)
1470 Value *ResultOp =
I.getOperand(0);
1474 auto TFRVI = TrackedRetVals.find(
F);
1475 if (TFRVI != TrackedRetVals.end()) {
1476 mergeInValue(TFRVI->second,
F, getValueState(ResultOp));
1482 if (!TrackedMultipleRetVals.empty()) {
1484 if (MRVFunctionsTracked.count(
F))
1485 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
1486 mergeInValue(TrackedMultipleRetVals[std::make_pair(
F, i)],
F,
1487 getStructValueState(ResultOp, i));
1491void SCCPInstVisitor::visitTerminator(
Instruction &TI) {
1493 getFeasibleSuccessors(TI, SuccFeasible);
1498 for (
unsigned i = 0, e = SuccFeasible.
size(); i != e; ++i)
1499 if (SuccFeasible[i])
1503void SCCPInstVisitor::visitCastInst(
CastInst &
I) {
1506 if (ValueState[&
I].isOverdefined())
1510 if (BC->getType() == BC->getOperand(0)->getType()) {
1512 handlePredicate(&
I,
I.getOperand(0), PI);
1518 const ValueLatticeElement &OpSt = getValueState(
I.getOperand(0));
1522 if (Constant *OpC =
getConstant(OpSt,
I.getOperand(0)->getType())) {
1526 auto &LV = ValueState[&
I];
1533 if (
I.getDestTy()->isIntOrIntVectorTy() &&
1534 I.getSrcTy()->isIntOrIntVectorTy() &&
1535 I.getOpcode() != Instruction::BitCast) {
1536 ConstantRange OpRange =
1538 auto &LV = getValueState(&
I);
1540 Type *DestTy =
I.getDestTy();
1544 Trunc->getNoWrapKind());
1549 markOverdefined(&
I);
1558 addAdditionalUser(
LHS, &EVI);
1559 addAdditionalUser(
RHS, &EVI);
1561 const ValueLatticeElement &
L = getValueState(
LHS);
1562 if (
L.isUnknownOrUndef())
1564 ConstantRange LR =
L.asConstantRange(Ty,
false);
1566 const ValueLatticeElement &
R = getValueState(
RHS);
1567 if (
R.isUnknownOrUndef())
1570 ConstantRange RR =
R.asConstantRange(Ty,
false);
1575 assert(Idx == 1 &&
"Index can only be 0 or 1");
1580 markOverdefined(&EVI);
1588 return (
void)markOverdefined(&EVI);
1592 if (ValueState[&EVI].isOverdefined())
1593 return (
void)markOverdefined(&EVI);
1597 return (
void)markOverdefined(&EVI);
1603 return handleExtractOfWithOverflow(EVI, WO, i);
1604 ValueLatticeElement EltVal = getStructValueState(AggVal, i);
1605 mergeInValue(ValueState[&EVI], &EVI, EltVal);
1608 return (
void)markOverdefined(&EVI);
1615 return (
void)markOverdefined(&IVI);
1619 if (ValueState[&IVI].isOverdefined())
1620 return (
void)markOverdefined(&IVI);
1625 return (
void)markOverdefined(&IVI);
1631 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1634 ValueLatticeElement EltVal = getStructValueState(Aggr, i);
1635 mergeInValue(getStructValueState(&IVI, i), &IVI, EltVal);
1642 markOverdefined(getStructValueState(&IVI, i), &IVI);
1644 ValueLatticeElement InVal = getValueState(Val);
1645 mergeInValue(getStructValueState(&IVI, i), &IVI, InVal);
1650void SCCPInstVisitor::visitSelectInst(
SelectInst &
I) {
1653 if (
I.getType()->isStructTy())
1654 return (
void)markOverdefined(&
I);
1658 if (ValueState[&
I].isOverdefined())
1659 return (
void)markOverdefined(&
I);
1661 const ValueLatticeElement &CondValue = getValueState(
I.getCondition());
1665 if (ConstantInt *CondCB =
1667 Value *OpVal = CondCB->isZero() ?
I.getFalseValue() :
I.getTrueValue();
1668 const ValueLatticeElement &OpValState = getValueState(OpVal);
1671 assert(ValueState.contains(&
I) &&
"&I is not in ValueState map.");
1672 mergeInValue(ValueState[&
I], &
I, OpValState);
1679 ValueLatticeElement TVal = getValueState(
I.getTrueValue());
1680 ValueLatticeElement FVal = getValueState(
I.getFalseValue());
1682 ValueLatticeElement &State = ValueState[&
I];
1686 pushUsersToWorkListMsg(State, &
I);
1690void SCCPInstVisitor::visitUnaryOperator(
Instruction &
I) {
1691 ValueLatticeElement V0State = getValueState(
I.getOperand(0));
1693 ValueLatticeElement &
IV = ValueState[&
I];
1696 if (
IV.isOverdefined())
1697 return (
void)markOverdefined(&
I);
1706 return (
void)markConstant(
IV, &
I,
C);
1708 markOverdefined(&
I);
1711void SCCPInstVisitor::visitFreezeInst(
FreezeInst &
I) {
1714 if (
I.getType()->isStructTy())
1715 return (
void)markOverdefined(&
I);
1717 ValueLatticeElement V0State = getValueState(
I.getOperand(0));
1718 ValueLatticeElement &
IV = ValueState[&
I];
1721 if (
IV.isOverdefined())
1722 return (
void)markOverdefined(&
I);
1732 markOverdefined(&
I);
1736void SCCPInstVisitor::visitBinaryOperator(
Instruction &
I) {
1737 ValueLatticeElement V1State = getValueState(
I.getOperand(0));
1738 ValueLatticeElement V2State = getValueState(
I.getOperand(1));
1740 ValueLatticeElement &
IV = ValueState[&
I];
1741 if (
IV.isOverdefined())
1749 return (
void)markOverdefined(&
I);
1768 ValueLatticeElement NewV;
1770 return (
void)mergeInValue(ValueState[&
I], &
I, NewV);
1775 if (!
I.getType()->isIntOrIntVectorTy())
1776 return markOverdefined(&
I);
1785 ConstantRange
R = ConstantRange::getEmpty(
I.getType()->getScalarSizeInBits());
1787 R =
A.overflowingBinaryOp(BO->getOpcode(),
B, OBO->getNoWrapKind());
1789 R =
A.binaryOp(BO->getOpcode(),
B);
1798void SCCPInstVisitor::visitCmpInst(
CmpInst &
I) {
1801 if (ValueState[&
I].isOverdefined())
1802 return (
void)markOverdefined(&
I);
1804 Value *Op1 =
I.getOperand(0);
1805 Value *Op2 =
I.getOperand(1);
1809 auto V1State = getValueState(Op1);
1810 auto V2State = getValueState(Op2);
1814 ValueLatticeElement CV;
1816 mergeInValue(ValueState[&
I], &
I, CV);
1825 markOverdefined(&
I);
1831 if (ValueState[&
I].isOverdefined())
1832 return (
void)markOverdefined(&
I);
1834 const ValueLatticeElement &PtrState = getValueState(
I.getPointerOperand());
1840 if (
I.hasNoUnsignedWrap() ||
1843 return (
void)markNotNull(ValueState[&
I], &
I);
1844 return (
void)markOverdefined(&
I);
1848 Operands.
reserve(
I.getNumOperands());
1850 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i) {
1851 const ValueLatticeElement &State = getValueState(
I.getOperand(i));
1855 if (Constant *
C =
getConstant(State,
I.getOperand(i)->getType())) {
1860 return (
void)markOverdefined(&
I);
1864 markConstant(&
I,
C);
1866 markOverdefined(&
I);
1869void SCCPInstVisitor::visitAllocaInst(
AllocaInst &
I) {
1871 return (
void)markNotNull(ValueState[&
I], &
I);
1873 markOverdefined(&
I);
1876void SCCPInstVisitor::visitStoreInst(
StoreInst &
SI) {
1878 if (
SI.getOperand(0)->getType()->isStructTy())
1885 auto I = TrackedGlobals.find(GV);
1886 if (
I == TrackedGlobals.end())
1890 mergeInValue(
I->second, GV, getValueState(
SI.getOperand(0)),
1891 ValueLatticeElement::MergeOptions().setCheckWiden(
false));
1892 if (
I->second.isOverdefined())
1893 TrackedGlobals.erase(
I);
1898 if (CB->getType()->isIntOrIntVectorTy())
1899 if (std::optional<ConstantRange>
Range = CB->getRange())
1901 if (CB->getType()->isPointerTy() && CB->isReturnNonNull())
1906 if (
I->getType()->isIntOrIntVectorTy())
1907 if (
MDNode *Ranges =
I->getMetadata(LLVMContext::MD_range))
1910 if (
I->hasMetadata(LLVMContext::MD_nonnull))
1919void SCCPInstVisitor::visitLoadInst(
LoadInst &
I) {
1922 if (
I.getType()->isStructTy() ||
I.isVolatile())
1923 return (
void)markOverdefined(&
I);
1927 if (ValueState[&
I].isOverdefined())
1928 return (
void)markOverdefined(&
I);
1930 const ValueLatticeElement &PtrVal = getValueState(
I.getOperand(0));
1936 ValueLatticeElement &
IV = ValueState[&
I];
1941 return (
void)markOverdefined(
IV, &
I);
1948 if (!TrackedGlobals.empty()) {
1950 auto It = TrackedGlobals.find(GV);
1951 if (It != TrackedGlobals.end()) {
1960 return (
void)markConstant(
IV, &
I,
C);
1967void SCCPInstVisitor::visitCallBase(
CallBase &CB) {
1968 handleCallResult(CB);
1969 handleCallArguments(CB);
1972void SCCPInstVisitor::handleCallOverdefined(
CallBase &CB) {
1981 return (
void)markOverdefined(&CB);
1987 for (
const Use &
A : CB.
args()) {
1988 if (
A.get()->getType()->isStructTy())
1989 return markOverdefined(&CB);
1990 if (
A.get()->getType()->isMetadataTy())
1992 const ValueLatticeElement &State = getValueState(
A);
1997 return (
void)markOverdefined(&CB);
2003 return (
void)markOverdefined(&CB);
2008 return (
void)markConstant(&CB,
C);
2015void SCCPInstVisitor::handleCallArguments(
CallBase &CB) {
2020 if (TrackingIncomingArguments.count(
F)) {
2029 if (AI->hasByValAttr() && !
F->onlyReadsMemory()) {
2030 markOverdefined(&*AI);
2035 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
2036 ValueLatticeElement CallArg = getStructValueState(*CAI, i);
2037 mergeInValue(getStructValueState(&*AI, i), &*AI, CallArg,
2041 ValueLatticeElement CallArg =
2051 ValueLatticeElement CopyOfVal = getValueState(CopyOf);
2052 const std::optional<PredicateConstraint> &Constraint = PI->
getConstraint();
2054 mergeInValue(ValueState[
I],
I, CopyOfVal);
2059 Value *OtherOp = Constraint->OtherOp;
2062 if (getValueState(OtherOp).isUnknown()) {
2063 addAdditionalUser(OtherOp,
I);
2067 ValueLatticeElement CondVal = getValueState(OtherOp);
2068 ValueLatticeElement &
IV = ValueState[
I];
2071 ConstantRange::getFull(DL.getTypeSizeInBits(CopyOf->
getType()));
2083 if (CopyOfCR.isEmptySet())
2084 CopyOfCR = ConstantRange::getFull(CopyOfCR.getBitWidth());
2085 auto NewCR = ImposedCR.intersectWith(CopyOfCR);
2089 if (!CopyOfCR.contains(NewCR) && CopyOfCR.getSingleMissingElement())
2090 NewCR = std::move(CopyOfCR);
2097 addAdditionalUser(OtherOp,
I);
2105 addAdditionalUser(OtherOp,
I);
2106 mergeInValue(
IV,
I, CondVal);
2110 addAdditionalUser(OtherOp,
I);
2115 return (
void)mergeInValue(
IV,
I, CopyOfVal);
2118void SCCPInstVisitor::handleCallResult(
CallBase &CB) {
2122 if (
II->getIntrinsicID() == Intrinsic::vscale) {
2125 return (
void)mergeInValue(ValueState[
II],
II,
2128 if (
II->getIntrinsicID() == Intrinsic::experimental_get_vector_length) {
2129 Value *CountArg =
II->getArgOperand(0);
2130 Value *VF =
II->getArgOperand(1);
2137 ConstantRange
Count = getValueState(CountArg)
2138 .asConstantRange(CountArg->
getType(),
false)
2140 ConstantRange MaxLanes = getValueState(VF)
2141 .asConstantRange(VF->
getType(),
false)
2158 return (
void)mergeInValue(ValueState[
II],
II,
2168 const ValueLatticeElement &State = getValueState(
Op);
2177 return (
void)mergeInValue(ValueState[
II],
II,
2185 if (!
F ||
F->isDeclaration())
2186 return handleCallOverdefined(CB);
2190 if (!MRVFunctionsTracked.count(
F))
2191 return handleCallOverdefined(CB);
2195 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
2196 mergeInValue(getStructValueState(&CB, i), &CB,
2197 TrackedMultipleRetVals[std::make_pair(
F, i)],
2200 auto TFRVI = TrackedRetVals.find(
F);
2201 if (TFRVI == TrackedRetVals.end())
2202 return handleCallOverdefined(CB);
2209bool SCCPInstVisitor::isInstFullyOverDefined(
Instruction &Inst) {
2214 for (
unsigned i = 0, e = STy->getNumElements(); i < e; ++i) {
2215 if (!getStructValueState(&Inst, i).isOverdefined())
2221 return getValueState(&Inst).isOverdefined();
2226 while (!BBWorkList.empty() || !InstWorkList.empty()) {
2228 while (!InstWorkList.empty()) {
2230 Invalidated.erase(
I);
2238 while (!BBWorkList.empty()) {
2240 BBVisited.insert(BB);
2254 if (
I.getType()->isVoidTy())
2263 if (MRVFunctionsTracked.count(
F))
2272 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
2275 markOverdefined(LV, &
I);
2293 if (TrackedRetVals.count(
F))
2303 markOverdefined(&
I);
2321 bool MadeChange =
false;
2323 if (!BBExecutable.count(&BB))
2331 <<
"\nResolved undefs in " <<
F.getName() <<
'\n');
2350 Visitor->addPredicateInfo(
F, DT, AC);
2354 Visitor->removeSSACopies(
F);
2358 return Visitor->markBlockExecutable(BB);
2362 return Visitor->getPredicateInfoFor(
I);
2366 Visitor->trackValueOfGlobalVariable(GV);
2370 Visitor->addTrackedFunction(
F);
2374 Visitor->addToMustPreserveReturnsInFunctions(
F);
2378 return Visitor->mustPreserveReturn(
F);
2382 Visitor->addArgumentTrackedFunction(
F);
2386 return Visitor->isArgumentTrackedFunction(
F);
2391 return Visitor->getArgumentTrackedFunctions();
2397 return Visitor->resolvedUndefsIn(
F);
2401 Visitor->solveWhileResolvedUndefsIn(M);
2406 Visitor->solveWhileResolvedUndefsIn(WorkList);
2410 Visitor->solveWhileResolvedUndefs();
2414 return Visitor->isBlockExecutable(BB);
2418 return Visitor->isEdgeFeasible(From, To);
2421std::vector<ValueLatticeElement>
2423 return Visitor->getStructLatticeValueFor(V);
2427 return Visitor->removeLatticeValueFor(V);
2431 Visitor->resetLatticeValueFor(
Call);
2435 return Visitor->getLatticeValueFor(V);
2440 return Visitor->getTrackedRetVals();
2445 return Visitor->getTrackedGlobals();
2449 return Visitor->getMRVFunctionsTracked();
2455 Visitor->trackValueOfArgument(V);
2459 return Visitor->isStructLatticeConstant(
F, STy);
2464 return Visitor->getConstant(LV, Ty);
2468 return Visitor->getConstantOrNull(V);
2473 Visitor->setLatticeValueForSpecializationArguments(
F, Args);
2477 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")
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 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.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
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; assumes that the block is well-formed.
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
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...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
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 ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
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.
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
static DebugLoc getTemporary()
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 reserve(size_type N)
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 UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
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.
static ValueLatticeElement get(Constant *C)
unsigned getNumRangeExtensions() const
Constant * getNotConstant() const
LLVM_ABI ValueLatticeElement intersect(const ValueLatticeElement &Other) const
Combine two sets of facts about the same value into a single set of facts.
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.
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
@ 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)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
bool match(Val *V, const Pattern &P)
auto m_Value()
Match an arbitrary value and ignore it.
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".
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.
FunctionAddr VTableAddr Count
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...
static void propagateImplicitRefFromCall(CallBase *CB)
Helper for propagting !implicit.ref metadata from callee to caller before erasing a call instruction.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
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...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
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)