70#define DEBUG_TYPE "code-extractor"
78 cl::desc(
"Aggregate arguments to code-extracted functions"));
83 bool AllowVarArgs,
bool AllowAlloca) {
93 while (!ToVisit.
empty()) {
95 if (!Visited.
insert(Curr).second)
103 for (
auto const &U : Curr->
operands()) {
121 if (
auto *UBB =
II->getUnwindDest())
122 if (!Result.count(UBB))
130 if (
auto *UBB = CSI->getUnwindDest())
131 if (!Result.count(UBB))
133 for (
const auto *HBB : CSI->handlers())
134 if (!Result.count(
const_cast<BasicBlock*
>(HBB)))
142 for (
const auto *U : CPI->users())
144 if (!Result.count(
const_cast<BasicBlock*
>(CRI->getParent())))
153 for (
const auto *U : CPI->users())
155 if (!Result.count(
const_cast<BasicBlock*
>(CRI->getParent())))
160 if (
auto *UBB = CRI->getUnwindDest())
161 if (!Result.count(UBB))
178 if (CI->isMustTailCall())
181 if (
const Function *
F = CI->getCalledFunction()) {
182 auto IID =
F->getIntrinsicID();
183 if (IID == Intrinsic::vastart) {
192 if (IID == Intrinsic::eh_typeid_for)
204 bool AllowVarArgs,
bool AllowAlloca) {
205 assert(!BBs.
empty() &&
"The set of blocks to extract must be non-empty");
215 if (!Result.insert(BB))
219 LLVM_DEBUG(
dbgs() <<
"Region front block: " << Result.front()->getName()
222 for (
auto *BB : Result) {
227 if (BB == Result.front()) {
229 LLVM_DEBUG(
dbgs() <<
"The first block cannot be an unwind block\n");
238 if (!Result.count(PBB)) {
239 LLVM_DEBUG(
dbgs() <<
"No blocks in this region may have entries from "
240 "outside the region except for the first block!\n"
241 <<
"Problematic source BB: " << BB->getName() <<
"\n"
242 <<
"Problematic destination BB: " << PBB->getName()
254 switch (TargetTriple.
getArch()) {
269 bool AllowVarArgs,
bool AllowAlloca,
272 std::string Suffix,
bool ArgsInZeroAddressSpace,
273 bool VoidReturnWithSingleOutput)
275 BPI(BPI), AC(AC), AllocationBlock(AllocationBlock),
276 DeallocationBlocks(DeallocationBlocks), AllowVarArgs(AllowVarArgs),
278 Suffix(Suffix), ArgsInZeroAddressSpace(ArgsInZeroAddressSpace),
279 VoidReturnWithSingleOutput(VoidReturnWithSingleOutput) {}
285 if (Blocks.
count(
I->getParent()))
296 if (!Blocks.
count(
I->getParent()))
306 if (Blocks.
count(Succ))
308 if (!CommonExitBlock) {
309 CommonExitBlock = Succ;
312 if (CommonExitBlock != Succ)
318 if (
any_of(Blocks, hasNonCommonExitSucc))
321 return CommonExitBlock;
328 Allocas.push_back(AI);
330 findSideEffectInfoForBlock(BB);
334void CodeExtractorAnalysisCache::findSideEffectInfoForBlock(
BasicBlock &BB) {
336 unsigned Opcode =
II.getOpcode();
337 Value *MemAddr =
nullptr;
339 case Instruction::Store:
340 case Instruction::Load: {
341 if (Opcode == Instruction::Store) {
343 MemAddr =
SI->getPointerOperand();
353 SideEffectingBlocks.insert(&BB);
356 BaseMemAddrs[&BB].insert(
Base);
364 SideEffectingBlocks.insert(&BB);
368 if (
II.mayHaveSideEffects()) {
369 SideEffectingBlocks.insert(&BB);
379 if (SideEffectingBlocks.count(&BB))
381 auto It = BaseMemAddrs.find(&BB);
382 if (It != BaseMemAddrs.end())
383 return It->second.count(Addr);
390 Function *Func = (*Blocks.begin())->getParent();
392 if (Blocks.count(&BB))
402 BasicBlock *SinglePredFromOutlineRegion =
nullptr;
403 assert(!Blocks.count(CommonExitBlock) &&
404 "Expect a block outside the region!");
406 if (!Blocks.count(Pred))
408 if (!SinglePredFromOutlineRegion) {
409 SinglePredFromOutlineRegion = Pred;
410 }
else if (SinglePredFromOutlineRegion != Pred) {
411 SinglePredFromOutlineRegion =
nullptr;
416 if (SinglePredFromOutlineRegion)
417 return SinglePredFromOutlineRegion;
423 while (
I != BB->end()) {
436 assert(!getFirstPHI(CommonExitBlock) &&
"Phi not expected");
444 if (Blocks.count(Pred))
446 Pred->getTerminator()->replaceUsesOfWith(CommonExitBlock, NewExitBlock);
449 Blocks.insert(CommonExitBlock);
450 return CommonExitBlock;
460 nullptr, Name, AllocaIP.
getPoint());
462 if (CastedAlloc && ArgsInZeroAddressSpace &&
DL.getAllocaAddrSpace() != 0) {
466 (*CastedAlloc)->insertAfter(Alloca->
getIterator());
481CodeExtractor::LifetimeMarkerInfo
485 LifetimeMarkerInfo Info;
495 Info.LifeStart = IntrInst;
501 Info.LifeEnd = IntrInst;
510 if (!
Info.LifeStart || !
Info.LifeEnd)
516 if ((
Info.SinkLifeStart ||
Info.HoistLifeEnd) &&
521 if (
Info.HoistLifeEnd && !ExitBlock)
528 ValueSet &SinkCands, ValueSet &HoistCands,
530 Function *Func = (*Blocks.begin())->getParent();
533 auto moveOrIgnoreLifetimeMarkers =
534 [&](
const LifetimeMarkerInfo &LMI) ->
bool {
537 if (LMI.SinkLifeStart) {
540 SinkCands.
insert(LMI.LifeStart);
542 if (LMI.HoistLifeEnd) {
543 LLVM_DEBUG(
dbgs() <<
"Hoisting lifetime.end: " << *LMI.LifeEnd <<
"\n");
544 HoistCands.
insert(LMI.LifeEnd);
553 if (Blocks.count(BB))
562 LifetimeMarkerInfo MarkerInfo = getLifetimeMarkers(CEAC, AI, ExitBlock);
563 bool Moved = moveOrIgnoreLifetimeMarkers(MarkerInfo);
579 if (U->stripInBoundsConstantOffsets() != AI)
583 for (
User *BU : Bitcast->users()) {
592 << *Bitcast <<
" in out-of-region lifetime marker "
593 << *IntrInst <<
"\n");
594 LifetimeBitcastUsers.
push_back(IntrInst);
604 I->replaceUsesOfWith(
I->getOperand(1), CastI);
611 if (U->stripInBoundsConstantOffsets() == AI) {
613 LifetimeMarkerInfo LMI = getLifetimeMarkers(CEAC, Bitcast, ExitBlock);
629 if (Bitcasts.
empty())
632 LLVM_DEBUG(
dbgs() <<
"Sinking alloca (via bitcast): " << *AI <<
"\n");
634 for (
unsigned I = 0, E = Bitcasts.
size();
I != E; ++
I) {
636 const LifetimeMarkerInfo &LMI = BitcastLifetimeInfo[
I];
638 "Unsafe to sink bitcast without lifetime markers");
639 moveOrIgnoreLifetimeMarkers(LMI);
641 LLVM_DEBUG(
dbgs() <<
"Sinking bitcast-of-alloca: " << *BitcastAddr
643 SinkCands.
insert(BitcastAddr);
657 if (AllowVarArgs &&
F->getFunctionType()->isVarArg()) {
658 auto containsVarArgIntrinsic = [](
const Instruction &
I) {
660 if (
const Function *Callee = CI->getCalledFunction())
661 return Callee->getIntrinsicID() == Intrinsic::vastart ||
662 Callee->getIntrinsicID() == Intrinsic::vaend;
666 for (
auto &BB : *
F) {
667 if (Blocks.count(&BB))
681 bool IsSave =
II->getIntrinsicID() == Intrinsic::stacksave;
682 bool IsRestore =
II->getIntrinsicID() == Intrinsic::stackrestore;
683 if (IsSave &&
any_of(
II->users(), [&Blks = this->Blocks](
User *U) {
684 return !definedInRegion(Blks, U);
695 const ValueSet &SinkCands,
696 bool CollectGlobalInputs) {
701 for (
auto &OI :
II.operands()) {
703 if (!SinkCands.
count(V) &&
709 for (
User *U :
II.users())
719 FuncRetVal =
nullptr;
720 if (!VoidReturnWithSingleOutput && !AggregateArgs && Outputs.
size() == 1 &&
722 FuncRetVal = Outputs[0];
730void CodeExtractor::severSplitPHINodesOfEntry(
BasicBlock *&Header) {
731 unsigned NumPredsFromRegion = 0;
732 unsigned NumPredsOutsideRegion = 0;
734 if (Header != &Header->getParent()->getEntryBlock()) {
743 ++NumPredsFromRegion;
745 ++NumPredsOutsideRegion;
749 if (NumPredsOutsideRegion <= 1)
return;
761 Blocks.remove(OldPred);
762 Blocks.insert(NewBB);
767 if (NumPredsFromRegion) {
807void CodeExtractor::severSplitPHINodesOfExits() {
808 for (BasicBlock *ExitBB : ExtractedFuncRetVals) {
811 for (PHINode &PN : ExitBB->phis()) {
813 SmallVector<unsigned, 2> IncomingVals;
821 if (IncomingVals.
size() <= 1)
828 ExitBB->getName() +
".split",
829 ExitBB->getParent(), ExitBB);
831 for (BasicBlock *PredBB : Preds)
832 if (Blocks.count(PredBB))
833 PredBB->getTerminator()->replaceUsesOfWith(ExitBB, NewBB);
835 Blocks.insert(NewBB);
842 for (
unsigned i : IncomingVals)
844 for (
unsigned i :
reverse(IncomingVals))
851void CodeExtractor::splitReturnBlocks() {
852 for (BasicBlock *
Block : Blocks)
855 Block->splitBasicBlock(RI->getIterator(),
Block->getName() +
".ret");
866 DT->changeImmediateDominator(
I, NewNode);
871Function *CodeExtractor::constructFunctionDeclaration(
872 const ValueSet &inputs,
const ValueSet &outputs,
BlockFrequency EntryFreq,
877 Function *oldFunction = Blocks.front()->getParent();
878 Module *
M = Blocks.front()->getModule();
881 std::vector<Type *> ParamTy;
882 std::vector<Type *> AggParamTy;
883 const DataLayout &
DL =
M->getDataLayout();
886 for (
Value *value : inputs) {
888 if (AggregateArgs && !ExcludeArgsFromAggregate.contains(value)) {
889 AggParamTy.push_back(value->getType());
890 StructValues.insert(value);
892 ParamTy.push_back(value->getType());
896 for (
Value *output : outputs) {
898 if (AggregateArgs && !ExcludeArgsFromAggregate.contains(output)) {
899 AggParamTy.push_back(output->getType());
900 StructValues.insert(output);
907 (ParamTy.size() + AggParamTy.size()) ==
908 (inputs.size() + outputs.size()) &&
909 "Number of scalar and aggregate params does not match inputs, outputs");
910 assert((StructValues.empty() || AggregateArgs) &&
911 "Expeced StructValues only with AggregateArgs set");
914 if (!AggParamTy.empty()) {
917 M->getContext(), ArgsInZeroAddressSpace ? 0 :
DL.getAllocaAddrSpace()));
920 Type *RetTy = FuncRetVal ? FuncRetVal->getType() : getSwitchType();
922 dbgs() <<
"Function type: " << *RetTy <<
" f(";
923 for (
Type *i : ParamTy)
924 dbgs() << *i <<
", ";
929 RetTy, ParamTy, AllowVarArgs && oldFunction->
isVarArg());
947 for (
const auto &Attr : oldFunction->
getAttributes().getFnAttrs()) {
948 if (Attr.isStringAttribute()) {
949 if (Attr.getKindAsString() ==
"thunk")
952 switch (Attr.getKindAsEnum()) {
955 case Attribute::AllocSize:
956 case Attribute::Builtin:
957 case Attribute::Convergent:
958 case Attribute::JumpTable:
959 case Attribute::Naked:
960 case Attribute::NoBuiltin:
961 case Attribute::NoMerge:
962 case Attribute::NoReturn:
963 case Attribute::NoSync:
964 case Attribute::ReturnsTwice:
965 case Attribute::Speculatable:
966 case Attribute::StackAlignment:
967 case Attribute::WillReturn:
968 case Attribute::AllocKind:
969 case Attribute::PresplitCoroutine:
970 case Attribute::Memory:
971 case Attribute::NoFPClass:
972 case Attribute::CoroDestroyOnlyWhenComplete:
973 case Attribute::CoroElideSafe:
974 case Attribute::NoDivergenceSource:
975 case Attribute::NoCreateUndefOrPoison:
978 case Attribute::AlwaysInline:
979 case Attribute::Cold:
980 case Attribute::DisableSanitizerInstrumentation:
981 case Attribute::Flatten:
982 case Attribute::FnRetThunkExtern:
984 case Attribute::HybridPatchable:
985 case Attribute::NoRecurse:
986 case Attribute::InlineHint:
987 case Attribute::MinSize:
988 case Attribute::NoCallback:
989 case Attribute::NoDuplicate:
990 case Attribute::NoFree:
991 case Attribute::NoImplicitFloat:
992 case Attribute::NoInline:
993 case Attribute::NoIPA:
994 case Attribute::NoOutline:
995 case Attribute::NonLazyBind:
996 case Attribute::NoRedZone:
997 case Attribute::NoUnwind:
998 case Attribute::NoSanitizeBounds:
999 case Attribute::NoSanitizeCoverage:
1000 case Attribute::NullPointerIsValid:
1001 case Attribute::OptimizeForDebugging:
1002 case Attribute::OptForFuzzing:
1003 case Attribute::OptimizeNone:
1004 case Attribute::OptimizeForSize:
1005 case Attribute::SafeStack:
1006 case Attribute::ShadowCallStack:
1007 case Attribute::SanitizeAddress:
1008 case Attribute::SanitizeMemory:
1009 case Attribute::SanitizeNumericalStability:
1010 case Attribute::SanitizeThread:
1011 case Attribute::SanitizeType:
1012 case Attribute::SanitizeHWAddress:
1013 case Attribute::SanitizeMemTag:
1014 case Attribute::SanitizeRealtime:
1015 case Attribute::SanitizeRealtimeBlocking:
1016 case Attribute::SanitizeAllocToken:
1017 case Attribute::SpeculativeLoadHardening:
1018 case Attribute::StackProtect:
1019 case Attribute::StackProtectReq:
1020 case Attribute::StackProtectStrong:
1021 case Attribute::StrictFP:
1022 case Attribute::UWTable:
1023 case Attribute::VScaleRange:
1024 case Attribute::NoCfCheck:
1025 case Attribute::MustProgress:
1026 case Attribute::NoProfile:
1027 case Attribute::SkipProfile:
1028 case Attribute::DenormalFPEnv:
1031 case Attribute::Alignment:
1032 case Attribute::AllocatedPointer:
1033 case Attribute::AllocAlign:
1034 case Attribute::ByVal:
1035 case Attribute::Captures:
1036 case Attribute::Dereferenceable:
1037 case Attribute::DereferenceableOrNull:
1038 case Attribute::ElementType:
1039 case Attribute::InAlloca:
1040 case Attribute::InReg:
1041 case Attribute::Nest:
1042 case Attribute::NoAlias:
1043 case Attribute::NoUndef:
1044 case Attribute::NonNull:
1045 case Attribute::Preallocated:
1046 case Attribute::ReadNone:
1047 case Attribute::ReadOnly:
1048 case Attribute::Returned:
1049 case Attribute::SExt:
1050 case Attribute::StructRet:
1051 case Attribute::SwiftError:
1052 case Attribute::SwiftSelf:
1053 case Attribute::SwiftAsync:
1054 case Attribute::ZExt:
1055 case Attribute::ImmArg:
1056 case Attribute::ByRef:
1057 case Attribute::WriteOnly:
1058 case Attribute::Writable:
1059 case Attribute::DeadOnUnwind:
1060 case Attribute::Range:
1061 case Attribute::Initializes:
1062 case Attribute::NoExt:
1063 case Attribute::NoFreeObj:
1069 case Attribute::DeadOnReturn:
1082 for (
Value *input : inputs) {
1083 if (StructValues.contains(input))
1086 ScalarAI->
setName(input->getName());
1087 if (input->isSwiftError())
1089 Attribute::SwiftError);
1092 for (
Value *output : outputs) {
1093 if (StructValues.contains(output))
1096 ScalarAI->
setName(output->getName() +
".out");
1102 auto Count = BFI->getProfileCountFromFreq(EntryFreq);
1103 if (
Count.has_value())
1120 if (!
I.getDebugLoc())
1147 Value *Mem =
II->getOperand(0);
1151 if (
II->getIntrinsicID() == Intrinsic::lifetime_start)
1152 LifetimesStart.
insert(Mem);
1153 II->eraseFromParent();
1168 bool InsertBefore) {
1169 for (
Value *Mem : Objects) {
1172 "Input memory not defined in original function");
1180 Marker->insertBefore(Term->getIterator());
1184 if (!LifetimesStart.
empty()) {
1185 insertMarkers(Intrinsic::lifetime_start, LifetimesStart,
1189 if (!LifetimesEnd.
empty()) {
1190 insertMarkers(Intrinsic::lifetime_end, LifetimesEnd,
1195void CodeExtractor::moveCodeToFunction(
Function *newFunction) {
1196 auto newFuncIt = newFunction->
begin();
1197 for (BasicBlock *
Block : Blocks) {
1199 Block->removeFromParent();
1206 newFuncIt = newFunction->
insert(std::next(newFuncIt),
Block);
1210void CodeExtractor::calculateNewCallTerminatorWeights(
1214 using Distribution = BlockFrequencyInfoImplBase::Distribution;
1215 using BlockNode = BlockFrequencyInfoImplBase::BlockNode;
1222 Distribution BranchDist;
1229 BlockNode ExitNode(i);
1232 BranchDist.addExit(ExitNode, ExitFreq);
1238 if (BranchDist.Total == 0) {
1239 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1244 BranchDist.normalize();
1247 for (
unsigned I = 0,
E = BranchDist.Weights.size();
I <
E; ++
I) {
1248 const auto &Weight = BranchDist.Weights[
I];
1251 BranchWeights[Weight.TargetNode.Index] = Weight.Amount;
1252 BranchProbability BP(Weight.Amount, BranchDist.Total);
1253 EdgeProbabilities[Weight.TargetNode.Index] = BP;
1255 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1257 LLVMContext::MD_prof,
1258 MDBuilder(TI->
getContext()).createBranchWeights(BranchWeights));
1268 if (DVR->getFunction() != &
F)
1269 DVR->eraseFromParent();
1300 assert(OldSP->getUnit() &&
"Missing compile unit for subprogram");
1305 DISubprogram::SPFlagOptimized |
1306 DISubprogram::SPFlagLocalToUnit;
1309 0, SPType, 0, DINode::FlagZero, SPFlags);
1312 auto UpdateOrInsertDebugRecord = [&](
auto *DR,
Value *OldLoc,
Value *NewLoc,
1314 if (DR->getParent()->getParent() == &NewFunc) {
1315 DR->replaceVariableLocationOp(OldLoc, NewLoc);
1319 DIB.
insertDeclare(NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1323 DIB.
insertDbgValue(NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1334 for (
auto *DVR : DPUsers)
1335 UpdateOrInsertDebugRecord(DVR,
Input, NewVal, Expr, DVR->isDbgDeclare());
1338 auto IsInvalidLocation = [&NewFunc](
Value *Location) {
1346 return Arg->getParent() != &NewFunc;
1363 DINode *&NewVar = RemappedMetadata[OldVar];
1366 *OldVar->getScope(), *NewSP, Ctx, Cache);
1368 NewScope, OldVar->
getName(), OldVar->getFile(), OldVar->getLine(),
1369 OldVar->getType(),
false, DINode::FlagZero,
1370 OldVar->getAlignInBits());
1375 auto UpdateDbgLabel = [&](
auto *LabelRecord) {
1378 if (LabelRecord->getDebugLoc().getInlinedAt())
1380 DILabel *OldLabel = LabelRecord->getLabel();
1381 DINode *&NewLabel = RemappedMetadata[OldLabel];
1384 *OldLabel->
getScope(), *NewSP, Ctx, Cache);
1393 auto UpdateDbgRecordsOnInst = [&](
Instruction &
I) ->
void {
1394 for (
DbgRecord &DR :
I.getDbgRecordRange()) {
1396 UpdateDbgLabel(DLR);
1422 UpdateDbgRecordsOnInst(
I);
1424 for (
auto *DVR : DVRsToDelete)
1425 DVR->getMarker()->MarkedInstr->dropOneDbgRecord(DVR);
1437 *NewSP, Ctx, Cache));
1440 auto updateLoopInfoLoc = [&Ctx, &Cache, NewSP](
Metadata *MD) ->
Metadata * {
1456 ValueSet Inputs, Outputs;
1462 ValueSet &inputs, ValueSet &outputs) {
1471 normalizeCFGForExtraction(header);
1479 AC->unregisterAssumption(AI);
1480 AI->eraseFromParent();
1485 ValueSet SinkingCands, HoistingCands;
1487 findAllocas(CEAC, SinkingCands, HoistingCands, CommonExit);
1497 ValueSet LifetimesStart;
1500 if (!HoistingCands.
empty()) {
1503 for (
auto *
II : HoistingCands)
1505 computeExtractedFuncRetVals();
1515 assert(BPI &&
"Both BPI and BFI are required to preserve profile info");
1517 if (Blocks.count(Pred))
1520 BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, header);
1523 for (
BasicBlock *Succ : ExtractedFuncRetVals) {
1525 if (!Blocks.count(
Block))
1530 BF += BFI->getBlockFreq(
Block) * BPI->getEdgeProbability(
Block, Succ);
1538 while (ReplIP && Blocks.count(ReplIP))
1542 std::string SuffixToUse =
1547 ValueSet StructValues;
1549 Function *newFunction = constructFunctionDeclaration(
1550 inputs, outputs, EntryFreq, oldFunction->
getName() +
"." + SuffixToUse,
1551 StructValues, StructTy);
1554 emitFunctionBody(inputs, outputs, StructValues, newFunction, StructTy, header,
1555 SinkingCands, NewValues);
1557 std::vector<Value *> Reloads;
1558 CallInst *TheCall = emitReplacerCall(
1559 inputs, outputs, StructValues, newFunction, StructTy, oldFunction, ReplIP,
1560 EntryFreq, LifetimesStart.
getArrayRef(), Reloads);
1562 insertReplacerCall(oldFunction, header, TheCall, outputs, Reloads,
1577void CodeExtractor::normalizeCFGForExtraction(
BasicBlock *&header) {
1580 splitReturnBlocks();
1583 severSplitPHINodesOfEntry(header);
1589 computeExtractedFuncRetVals();
1590 severSplitPHINodesOfExits();
1593void CodeExtractor::computeExtractedFuncRetVals() {
1594 ExtractedFuncRetVals.clear();
1599 if (Blocks.count(Succ))
1602 bool IsNew = ExitBlocks.
insert(Succ).second;
1604 ExtractedFuncRetVals.push_back(Succ);
1609Type *CodeExtractor::getSwitchType() {
1612 assert(ExtractedFuncRetVals.size() < 0xffff &&
1613 "too many exit blocks for switch");
1614 switch (ExtractedFuncRetVals.size()) {
1626void CodeExtractor::emitFunctionBody(
1627 const ValueSet &inputs,
const ValueSet &outputs,
1628 const ValueSet &StructValues,
Function *newFunction,
1642 for (
auto *
II : SinkingCands) {
1648 for (
auto *
II : SinkingCands) {
1655 Argument *AggArg = StructValues.empty()
1661 for (
unsigned i = 0, e = inputs.size(), aggIdx = 0; i != e; ++i) {
1663 if (StructValues.contains(inputs[i])) {
1668 StructArgTy, AggArg, Idx,
"gep_" + inputs[i]->
getName(), newFuncRoot);
1671 "loadgep_" + inputs[i]->getName(), newFuncRoot);
1684 unsigned AlignmentValue;
1685 const Triple &TargetTriple =
1693 inputs[i]->stripPointerCasts()->getPointerAlignment(
DL).value();
1695 AlignmentValue = inputs[i]->getPointerAlignment(
DL).value();
1698 LLVMContext::MD_align,
1701 MDB.createConstant(ConstantInt::get(
1704 RewriteVal = LoadGEP;
1707 RewriteVal = &*ScalarAI++;
1712 moveCodeToFunction(newFunction);
1714 for (
unsigned i = 0, e = inputs.size(); i != e; ++i) {
1715 Value *RewriteVal = NewValues[i];
1717 std::vector<User *>
Users(inputs[i]->user_begin(), inputs[i]->user_end());
1720 if (Blocks.count(inst->getParent()))
1721 inst->replaceUsesOfWith(inputs[i], RewriteVal);
1729 std::map<BasicBlock *, BasicBlock *> ExitBlockMap;
1733 for (
auto P :
enumerate(ExtractedFuncRetVals)) {
1735 size_t SuccNum =
P.index();
1739 ExitBlockMap[OldTarget] = NewTarget;
1741 Value *brVal =
nullptr;
1742 Type *RetTy = FuncRetVal ? FuncRetVal->getType() : getSwitchType();
1743 assert(ExtractedFuncRetVals.size() < 0xffff &&
1744 "too many exit blocks for switch");
1745 switch (ExtractedFuncRetVals.size()) {
1754 brVal = ConstantInt::get(RetTy, !SuccNum);
1757 brVal = ConstantInt::get(RetTy, SuccNum);
1764 for (BasicBlock *
Block : Blocks) {
1771 BasicBlock *NewTarget = ExitBlockMap[OldTarget];
1772 assert(NewTarget &&
"Unknown target block!");
1796 unsigned AggIdx = 0;
1798 for (
Value *Input : inputs) {
1799 if (StructValues.contains(Input))
1805 for (
Value *Output : outputs) {
1812 InsertPt = InvokeI->getNormalDest()->getFirstInsertionPt();
1814 InsertPt =
Phi->getParent()->getFirstInsertionPt();
1816 InsertPt = std::next(OutI->getIterator());
1819 if (StructValues.contains(Output))
1826 assert((InsertPt->getFunction() == newFunction ||
1827 Blocks.count(InsertPt->getParent())) &&
1828 "InsertPt should be in new function");
1830 if (StructValues.contains(Output)) {
1831 assert(AggArg &&
"Number of aggregate output arguments should match "
1832 "the number of defined values");
1837 StructArgTy, AggArg, Idx,
"gep_" + Output->getName(), InsertPt);
1838 new StoreInst(Output,
GEP, InsertPt);
1842 "Number of scalar output arguments should match "
1843 "the number of defined values");
1844 new StoreInst(Output, &*ScalarAI, InsertPt);
1849 if (ExtractedFuncRetVals.empty()) {
1853 if (
none_of(Blocks, [](
const BasicBlock *BB) {
1861CallInst *CodeExtractor::emitReplacerCall(
1862 const ValueSet &inputs,
const ValueSet &outputs,
1863 const ValueSet &StructValues,
Function *newFunction,
1866 std::vector<Value *> &Reloads) {
1873 if (AllocationBlock)
1874 assert(AllocationBlock->getParent() == oldFunction &&
1875 "AllocationBlock is not in the same function");
1877 AllocationBlock ? AllocationBlock : &oldFunction->
getEntryBlock();
1888 BFI->setBlockFreq(codeReplacer, EntryFreq);
1890 std::vector<Value *> params;
1893 for (
Value *input : inputs) {
1894 if (StructValues.contains(input))
1897 params.push_back(input);
1901 std::vector<Value *> ReloadOutputs;
1902 for (
Value *output : outputs) {
1903 if (StructValues.contains(output))
1909 DL, output->getType(), output->
getName() +
".loc");
1910 params.push_back(OutAlloc);
1911 ReloadOutputs.push_back(OutAlloc);
1915 if (!StructValues.empty()) {
1916 AddrSpaceCastInst *StructSpaceCast =
nullptr;
1919 DL, StructArgTy,
"structArg", &StructSpaceCast);
1920 if (StructSpaceCast)
1921 params.push_back(StructSpaceCast);
1923 params.push_back(Struct);
1925 unsigned AggIdx = 0;
1926 for (
Value *input : inputs) {
1927 if (!StructValues.contains(input))
1934 StructArgTy, Struct, Idx,
"gep_" + input->getName());
1935 GEP->insertInto(codeReplacer, codeReplacer->
end());
1936 new StoreInst(input,
GEP, codeReplacer);
1944 newFunction, params, ExtractedFuncRetVals.size() > 1 ?
"targetBlock" :
"",
1948 unsigned ParamIdx = 0;
1949 unsigned AggIdx = 0;
1950 for (
auto input : inputs) {
1951 if (StructValues.contains(input)) {
1954 if (input->isSwiftError())
1967 for (
unsigned i = 0, e = outputs.size(), scalarIdx = 0; i != e; ++i) {
1968 Value *Output =
nullptr;
1969 if (StructValues.contains(outputs[i])) {
1974 StructArgTy, Struct, Idx,
"gep_reload_" + outputs[i]->
getName());
1975 GEP->insertInto(codeReplacer, codeReplacer->
end());
1979 Output = ReloadOutputs[scalarIdx];
1983 new LoadInst(outputs[i]->
getType(), Output,
1984 outputs[i]->
getName() +
".reload", codeReplacer);
1985 Reloads.push_back(
load);
1989 SwitchInst *TheSwitch =
1991 codeReplacer, 0, codeReplacer);
1992 for (
auto P :
enumerate(ExtractedFuncRetVals)) {
1994 size_t SuccNum =
P.index();
2001 Type *OldFnRetTy = TheSwitch->
getParent()->getParent()->getReturnType();
2002 switch (ExtractedFuncRetVals.size()) {
2010 }
else if (OldFnRetTy->
isVoidTy()) {
2063 auto deallocVars = [&](
BasicBlock *DeallocBlock,
2066 for (
Value *Output : outputs) {
2067 if (!StructValues.contains(Output))
2069 ReloadOutputs[Index++], Output->
getType());
2074 Struct, StructArgTy);
2077 if (DeallocationBlocks.empty()) {
2078 deallocVars(codeReplacer, codeReplacer->
end());
2080 for (BasicBlock *DeallocationBlock : DeallocationBlocks)
2081 deallocVars(DeallocationBlock, DeallocationBlock->getFirstInsertionPt());
2087void CodeExtractor::insertReplacerCall(
2097 for (
auto &U :
Users)
2101 if (
I->isTerminator() &&
I->getFunction() == oldFunction &&
2102 !Blocks.count(
I->getParent()))
2103 I->replaceUsesOfWith(header, codeReplacer);
2109 for (BasicBlock *ExitBB : ExtractedFuncRetVals)
2110 for (PHINode &PN : ExitBB->phis()) {
2111 Value *IncomingCodeReplacerVal =
nullptr;
2118 if (!IncomingCodeReplacerVal) {
2123 "PHI has two incompatbile incoming values from codeRepl");
2127 for (
unsigned i = 0, e = outputs.size(); i != e; ++i) {
2129 std::vector<User *>
Users(outputs[i]->user_begin(), outputs[i]->user_end());
2130 for (User *U :
Users) {
2132 if (inst->
getParent()->getParent() == oldFunction)
2138 FuncRetVal->replaceUsesWithIf(ReplacerCall, [&](Use &U) {
2143 if (BFI && ExtractedFuncRetVals.size() > 1)
2144 calculateNewCallTerminatorWeights(codeReplacer, ExitWeights, BPI);
2150 for (
auto AssumeVH : AC->assumptions()) {
2156 if (
I->getFunction() != &OldFunc)
2162 for (
auto AffectedValVH : AC->assumptionsFor(
I->getOperand(0))) {
2166 if (AffectedCI->getFunction() != &OldFunc)
2169 if (AssumedInst->getFunction() != &OldFunc)
2177 ExcludeArgsFromAggregate.insert(Arg);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Mark last scratch load
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
iv Induction Variable Users
Move duplicate certain instructions close to their use
uint64_t IntrinsicInst * II
static StringRef getName(Value *V)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
A cache of @llvm.assume calls within a function.
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
const Function * getParent() const
Return the enclosing method, or null if none.
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
InstListType::iterator iterator
Instruction iterators...
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 const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
static constexpr BranchProbability getUnknown()
static constexpr BranchProbability getZero()
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
static LLVM_ABI CastInst * CreatePointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI void finalizeSubprogram(DISubprogram *SP)
Finalize a specific subprogram - no new variables may be added to this subprogram afterwards.
LLVM_ABI DISubroutineType * createSubroutineType(DITypeArray ParameterTypes, DINode::DIFlags Flags=DINode::FlagZero, unsigned CC=0)
Create subroutine type.
LLVM_ABI DbgRecord * insertDbgValue(llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, InsertPosition InsertPt)
Insert a new dbg_value record.
LLVM_ABI DISubprogram * createFunction(DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine, DINode::DIFlags Flags=DINode::FlagZero, DISubprogram::DISPFlags SPFlags=DISubprogram::SPFlagZero, DITemplateParameterArray TParams=nullptr, DISubprogram *Decl=nullptr, DITypeArray ThrownTypes=nullptr, DINodeArray Annotations=nullptr, StringRef TargetFuncName="", bool UseKeyInstructions=false)
Create a new descriptor for the specified subprogram.
LLVM_ABI DITypeArray getOrCreateTypeArray(ArrayRef< Metadata * > Elements)
Get a DITypeArray, create one if required.
LLVM_ABI DbgRecord * insertDeclare(Value *Storage, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, BasicBlock *InsertAtEnd)
Insert a new dbg_declare record.
LLVM_ABI DIExpression * createExpression(ArrayRef< uint64_t > Addr={})
Create a new descriptor for the specified variable which has a complex address expression for its add...
LLVM_ABI DILocalVariable * createAutoVariable(DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNo, DIType *Ty, bool AlwaysPreserve=false, DINode::DIFlags Flags=DINode::FlagZero, uint32_t AlignInBits=0)
Create a new descriptor for an auto variable.
StringRef getName() const
bool isArtificial() const
unsigned getColumn() const
DILocalScope * getScope() const
Get the local scope for this label.
std::optional< unsigned > getCoroSuspendIdx() const
static LLVM_ABI DILocalScope * cloneScopeForSubprogram(DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Traverses the scope chain rooted at RootScope until it hits a Subprogram, recreating the chain with "...
Tagged DWARF-like metadata node.
LLVM_ABI StringRef getName() const
Subprogram description. Uses SubclassData1.
DISPFlags
Debug info subprogram flags.
A parsed version of the target data layout string in and methods for querying it.
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getAddress() const
void setVariable(DILocalVariable *NewVar)
DILocalVariable * getVariable() const
LLVM_ABI iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
static LLVM_ABI DebugLoc replaceInlinedAtSubprogram(const DebugLoc &DL, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Rebuild the entire inline-at chain by replacing the subprogram at the end of the chain with NewSP.
LLVM_ABI DILocation * getInlinedAt() const
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
void setSubprogram(DISubprogram *SP)
Set the attached subprogram.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
const BasicBlock & getEntryBlock() const
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasPersonalityFn() const
Check whether this function has a personality function.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
void setPersonalityFn(Constant *Fn)
AttributeList getAttributes() const
Return the attribute list for this Function.
const Function & getFunction() const
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Function::iterator insert(Function::iterator Position, BasicBlock *BB)
Insert BB in the basic block list at Position.
void setEntryCount(uint64_t Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
bool doesNotReturn() const
Determine if the function cannot return.
Argument * getArg(unsigned i) const
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
@ InternalLinkage
Rename collisions when linking (static functions).
InsertPoint - A saved insertion point.
BasicBlock * getBlock() const
BasicBlock::iterator getPoint() const
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY
Return true if the instruction is a llvm.lifetime.start or llvm.lifetime.end marker.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
iterator_range< user_iterator > users()
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
Value * getPointerOperand()
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
LLVM_ABI void removeIncomingValueIf(function_ref< bool(unsigned)> Predicate, bool DeletePHIIfEmpty=true)
Remove all incoming values for which the predicate returns true.
void setIncomingBlock(unsigned i, BasicBlock *BB)
LLVM_ABI Value * removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty=true)
Remove an incoming value.
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.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
A vector that has set insertion semantics.
ArrayRef< value_type > getArrayRef() const
size_type size() const
Determine the number of elements in the SetVector.
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
void clear()
Completely clear the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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.
std::string str() const
Get the contents as an std::string.
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Type * getElementType(unsigned N) const
BasicBlock * getSuccessor(unsigned idx) const
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
void setCondition(Value *V)
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest)
Add an entry to the switch instruction.
CaseIteratorImpl< CaseHandle > CaseIt
void setDefaultDest(BasicBlock *DefaultCase)
Value * getCondition() const
LLVM_ABI CaseIt removeCase(CaseIt I)
This method removes the specified case and its successor from the switch instruction.
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isPointerTy() const
True if this is an instance of PointerType.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
user_iterator user_begin()
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI const Value * stripInBoundsConstantOffsets() const
Strip off pointer casts and all-constant inbounds GEPs.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void dump() const
Support for debugging, callable in GDB: V->dump()
const ParentTy * getParent() const
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI void remapAssignID(DenseMap< DIAssignID *, DIAssignID * > &Map, Instruction &I)
Replace DIAssignID uses and attachments with IDs from Map.
NodeAddr< PhiNode * > Phi
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
DomTreeNodeBase< BasicBlock > DomTreeNode
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.
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
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 BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
LLVM_ABI void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.