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))
172 if (CI->isMustTailCall())
175 if (
const Function *
F = CI->getCalledFunction()) {
176 auto IID =
F->getIntrinsicID();
177 if (IID == Intrinsic::vastart) {
186 if (IID == Intrinsic::eh_typeid_for)
198 bool AllowVarArgs,
bool AllowAlloca) {
199 assert(!BBs.
empty() &&
"The set of blocks to extract must be non-empty");
209 if (!Result.insert(BB))
213 LLVM_DEBUG(
dbgs() <<
"Region front block: " << Result.front()->getName()
216 for (
auto *BB : Result) {
221 if (BB == Result.front()) {
223 LLVM_DEBUG(
dbgs() <<
"The first block cannot be an unwind block\n");
232 if (!Result.count(PBB)) {
233 LLVM_DEBUG(
dbgs() <<
"No blocks in this region may have entries from "
234 "outside the region except for the first block!\n"
235 <<
"Problematic source BB: " << BB->getName() <<
"\n"
236 <<
"Problematic destination BB: " << PBB->getName()
248 switch (TargetTriple.
getArch()) {
263 bool AllowVarArgs,
bool AllowAlloca,
266 std::string Suffix,
bool ArgsInZeroAddressSpace,
267 bool VoidReturnWithSingleOutput)
269 BPI(BPI), AC(AC), AllocationBlock(AllocationBlock),
270 DeallocationBlocks(DeallocationBlocks), AllowVarArgs(AllowVarArgs),
272 Suffix(Suffix), ArgsInZeroAddressSpace(ArgsInZeroAddressSpace),
273 VoidReturnWithSingleOutput(VoidReturnWithSingleOutput) {}
279 if (Blocks.
count(
I->getParent()))
290 if (!Blocks.
count(
I->getParent()))
300 if (Blocks.
count(Succ))
302 if (!CommonExitBlock) {
303 CommonExitBlock = Succ;
306 if (CommonExitBlock != Succ)
312 if (
any_of(Blocks, hasNonCommonExitSucc))
315 return CommonExitBlock;
322 Allocas.push_back(AI);
324 findSideEffectInfoForBlock(BB);
328void CodeExtractorAnalysisCache::findSideEffectInfoForBlock(
BasicBlock &BB) {
330 unsigned Opcode =
II.getOpcode();
331 Value *MemAddr =
nullptr;
333 case Instruction::Store:
334 case Instruction::Load: {
335 if (Opcode == Instruction::Store) {
337 MemAddr =
SI->getPointerOperand();
347 SideEffectingBlocks.insert(&BB);
350 BaseMemAddrs[&BB].insert(
Base);
358 SideEffectingBlocks.insert(&BB);
362 if (
II.mayHaveSideEffects()) {
363 SideEffectingBlocks.insert(&BB);
373 if (SideEffectingBlocks.count(&BB))
375 auto It = BaseMemAddrs.find(&BB);
376 if (It != BaseMemAddrs.end())
377 return It->second.count(Addr);
384 Function *Func = (*Blocks.begin())->getParent();
386 if (Blocks.count(&BB))
396 BasicBlock *SinglePredFromOutlineRegion =
nullptr;
397 assert(!Blocks.count(CommonExitBlock) &&
398 "Expect a block outside the region!");
400 if (!Blocks.count(Pred))
402 if (!SinglePredFromOutlineRegion) {
403 SinglePredFromOutlineRegion = Pred;
404 }
else if (SinglePredFromOutlineRegion != Pred) {
405 SinglePredFromOutlineRegion =
nullptr;
410 if (SinglePredFromOutlineRegion)
411 return SinglePredFromOutlineRegion;
417 while (
I != BB->end()) {
430 assert(!getFirstPHI(CommonExitBlock) &&
"Phi not expected");
438 if (Blocks.count(Pred))
440 Pred->getTerminator()->replaceUsesOfWith(CommonExitBlock, NewExitBlock);
443 Blocks.insert(CommonExitBlock);
444 return CommonExitBlock;
452 nullptr, Name, AllocaIP.
getPoint());
454 if (CastedAlloc && ArgsInZeroAddressSpace &&
DL.getAllocaAddrSpace() != 0) {
458 (*CastedAlloc)->insertAfter(Alloca->
getIterator());
473CodeExtractor::LifetimeMarkerInfo
477 LifetimeMarkerInfo Info;
487 Info.LifeStart = IntrInst;
493 Info.LifeEnd = IntrInst;
502 if (!
Info.LifeStart || !
Info.LifeEnd)
508 if ((
Info.SinkLifeStart ||
Info.HoistLifeEnd) &&
513 if (
Info.HoistLifeEnd && !ExitBlock)
520 ValueSet &SinkCands, ValueSet &HoistCands,
522 Function *Func = (*Blocks.begin())->getParent();
525 auto moveOrIgnoreLifetimeMarkers =
526 [&](
const LifetimeMarkerInfo &LMI) ->
bool {
529 if (LMI.SinkLifeStart) {
532 SinkCands.
insert(LMI.LifeStart);
534 if (LMI.HoistLifeEnd) {
535 LLVM_DEBUG(
dbgs() <<
"Hoisting lifetime.end: " << *LMI.LifeEnd <<
"\n");
536 HoistCands.
insert(LMI.LifeEnd);
545 if (Blocks.count(BB))
554 LifetimeMarkerInfo MarkerInfo = getLifetimeMarkers(CEAC, AI, ExitBlock);
555 bool Moved = moveOrIgnoreLifetimeMarkers(MarkerInfo);
571 if (U->stripInBoundsConstantOffsets() != AI)
575 for (
User *BU : Bitcast->users()) {
584 << *Bitcast <<
" in out-of-region lifetime marker "
585 << *IntrInst <<
"\n");
586 LifetimeBitcastUsers.
push_back(IntrInst);
596 I->replaceUsesOfWith(
I->getOperand(1), CastI);
603 if (U->stripInBoundsConstantOffsets() == AI) {
605 LifetimeMarkerInfo LMI = getLifetimeMarkers(CEAC, Bitcast, ExitBlock);
621 if (Bitcasts.
empty())
624 LLVM_DEBUG(
dbgs() <<
"Sinking alloca (via bitcast): " << *AI <<
"\n");
626 for (
unsigned I = 0, E = Bitcasts.
size();
I != E; ++
I) {
628 const LifetimeMarkerInfo &LMI = BitcastLifetimeInfo[
I];
630 "Unsafe to sink bitcast without lifetime markers");
631 moveOrIgnoreLifetimeMarkers(LMI);
633 LLVM_DEBUG(
dbgs() <<
"Sinking bitcast-of-alloca: " << *BitcastAddr
635 SinkCands.
insert(BitcastAddr);
649 if (AllowVarArgs &&
F->getFunctionType()->isVarArg()) {
650 auto containsVarArgIntrinsic = [](
const Instruction &
I) {
652 if (
const Function *Callee = CI->getCalledFunction())
653 return Callee->getIntrinsicID() == Intrinsic::vastart ||
654 Callee->getIntrinsicID() == Intrinsic::vaend;
658 for (
auto &BB : *
F) {
659 if (Blocks.count(&BB))
673 bool IsSave =
II->getIntrinsicID() == Intrinsic::stacksave;
674 bool IsRestore =
II->getIntrinsicID() == Intrinsic::stackrestore;
675 if (IsSave &&
any_of(
II->users(), [&Blks = this->Blocks](
User *U) {
676 return !definedInRegion(Blks, U);
687 const ValueSet &SinkCands,
688 bool CollectGlobalInputs) {
693 for (
auto &OI :
II.operands()) {
695 if (!SinkCands.
count(V) &&
701 for (
User *U :
II.users())
711 FuncRetVal =
nullptr;
712 if (!VoidReturnWithSingleOutput && !AggregateArgs && Outputs.
size() == 1 &&
714 FuncRetVal = Outputs[0];
722void CodeExtractor::severSplitPHINodesOfEntry(
BasicBlock *&Header) {
723 unsigned NumPredsFromRegion = 0;
724 unsigned NumPredsOutsideRegion = 0;
726 if (Header != &Header->getParent()->getEntryBlock()) {
735 ++NumPredsFromRegion;
737 ++NumPredsOutsideRegion;
741 if (NumPredsOutsideRegion <= 1)
return;
753 Blocks.remove(OldPred);
754 Blocks.insert(NewBB);
759 if (NumPredsFromRegion) {
799void CodeExtractor::severSplitPHINodesOfExits() {
800 for (BasicBlock *ExitBB : ExtractedFuncRetVals) {
803 for (PHINode &PN : ExitBB->phis()) {
805 SmallVector<unsigned, 2> IncomingVals;
813 if (IncomingVals.
size() <= 1)
820 ExitBB->getName() +
".split",
821 ExitBB->getParent(), ExitBB);
823 for (BasicBlock *PredBB : Preds)
824 if (Blocks.count(PredBB))
825 PredBB->getTerminator()->replaceUsesOfWith(ExitBB, NewBB);
827 Blocks.insert(NewBB);
834 for (
unsigned i : IncomingVals)
836 for (
unsigned i :
reverse(IncomingVals))
843void CodeExtractor::splitReturnBlocks() {
844 for (BasicBlock *
Block : Blocks)
847 Block->splitBasicBlock(RI->getIterator(),
Block->getName() +
".ret");
858 DT->changeImmediateDominator(
I, NewNode);
863Function *CodeExtractor::constructFunctionDeclaration(
864 const ValueSet &inputs,
const ValueSet &outputs,
BlockFrequency EntryFreq,
869 Function *oldFunction = Blocks.front()->getParent();
870 Module *
M = Blocks.front()->getModule();
873 std::vector<Type *> ParamTy;
874 std::vector<Type *> AggParamTy;
875 const DataLayout &
DL =
M->getDataLayout();
878 for (
Value *value : inputs) {
880 if (AggregateArgs && !ExcludeArgsFromAggregate.contains(value)) {
881 AggParamTy.push_back(value->getType());
882 StructValues.insert(value);
884 ParamTy.push_back(value->getType());
888 for (
Value *output : outputs) {
890 if (AggregateArgs && !ExcludeArgsFromAggregate.contains(output)) {
891 AggParamTy.push_back(output->getType());
892 StructValues.insert(output);
899 (ParamTy.size() + AggParamTy.size()) ==
900 (inputs.size() + outputs.size()) &&
901 "Number of scalar and aggregate params does not match inputs, outputs");
902 assert((StructValues.empty() || AggregateArgs) &&
903 "Expeced StructValues only with AggregateArgs set");
906 if (!AggParamTy.empty()) {
909 M->getContext(), ArgsInZeroAddressSpace ? 0 :
DL.getAllocaAddrSpace()));
912 Type *RetTy = FuncRetVal ? FuncRetVal->getType() : getSwitchType();
914 dbgs() <<
"Function type: " << *RetTy <<
" f(";
915 for (
Type *i : ParamTy)
916 dbgs() << *i <<
", ";
921 RetTy, ParamTy, AllowVarArgs && oldFunction->
isVarArg());
939 for (
const auto &Attr : oldFunction->
getAttributes().getFnAttrs()) {
940 if (Attr.isStringAttribute()) {
941 if (Attr.getKindAsString() ==
"thunk")
944 switch (Attr.getKindAsEnum()) {
947 case Attribute::AllocSize:
948 case Attribute::Builtin:
949 case Attribute::Convergent:
950 case Attribute::JumpTable:
951 case Attribute::Naked:
952 case Attribute::NoBuiltin:
953 case Attribute::NoMerge:
954 case Attribute::NoReturn:
955 case Attribute::NoSync:
956 case Attribute::ReturnsTwice:
957 case Attribute::Speculatable:
958 case Attribute::StackAlignment:
959 case Attribute::WillReturn:
960 case Attribute::AllocKind:
961 case Attribute::PresplitCoroutine:
962 case Attribute::Memory:
963 case Attribute::NoFPClass:
964 case Attribute::CoroDestroyOnlyWhenComplete:
965 case Attribute::CoroElideSafe:
966 case Attribute::NoDivergenceSource:
967 case Attribute::NoCreateUndefOrPoison:
970 case Attribute::AlwaysInline:
971 case Attribute::Cold:
972 case Attribute::DisableSanitizerInstrumentation:
973 case Attribute::Flatten:
974 case Attribute::FnRetThunkExtern:
976 case Attribute::HybridPatchable:
977 case Attribute::NoRecurse:
978 case Attribute::InlineHint:
979 case Attribute::MinSize:
980 case Attribute::NoCallback:
981 case Attribute::NoDuplicate:
982 case Attribute::NoFree:
983 case Attribute::NoImplicitFloat:
984 case Attribute::NoInline:
985 case Attribute::NoIPA:
986 case Attribute::NoOutline:
987 case Attribute::NonLazyBind:
988 case Attribute::NoRedZone:
989 case Attribute::NoUnwind:
990 case Attribute::NoSanitizeBounds:
991 case Attribute::NoSanitizeCoverage:
992 case Attribute::NullPointerIsValid:
993 case Attribute::OptimizeForDebugging:
994 case Attribute::OptForFuzzing:
995 case Attribute::OptimizeNone:
996 case Attribute::OptimizeForSize:
997 case Attribute::SafeStack:
998 case Attribute::ShadowCallStack:
999 case Attribute::SanitizeAddress:
1000 case Attribute::SanitizeMemory:
1001 case Attribute::SanitizeNumericalStability:
1002 case Attribute::SanitizeThread:
1003 case Attribute::SanitizeType:
1004 case Attribute::SanitizeHWAddress:
1005 case Attribute::SanitizeMemTag:
1006 case Attribute::SanitizeRealtime:
1007 case Attribute::SanitizeRealtimeBlocking:
1008 case Attribute::SanitizeAllocToken:
1009 case Attribute::SpeculativeLoadHardening:
1010 case Attribute::StackProtect:
1011 case Attribute::StackProtectReq:
1012 case Attribute::StackProtectStrong:
1013 case Attribute::StrictFP:
1014 case Attribute::UWTable:
1015 case Attribute::VScaleRange:
1016 case Attribute::NoCfCheck:
1017 case Attribute::MustProgress:
1018 case Attribute::NoProfile:
1019 case Attribute::SkipProfile:
1020 case Attribute::DenormalFPEnv:
1023 case Attribute::Alignment:
1024 case Attribute::AllocatedPointer:
1025 case Attribute::AllocAlign:
1026 case Attribute::ByVal:
1027 case Attribute::Captures:
1028 case Attribute::Dereferenceable:
1029 case Attribute::DereferenceableOrNull:
1030 case Attribute::ElementType:
1031 case Attribute::InAlloca:
1032 case Attribute::InReg:
1033 case Attribute::Nest:
1034 case Attribute::NoAlias:
1035 case Attribute::NoUndef:
1036 case Attribute::NonNull:
1037 case Attribute::Preallocated:
1038 case Attribute::ReadNone:
1039 case Attribute::ReadOnly:
1040 case Attribute::Returned:
1041 case Attribute::SExt:
1042 case Attribute::StructRet:
1043 case Attribute::SwiftError:
1044 case Attribute::SwiftSelf:
1045 case Attribute::SwiftAsync:
1046 case Attribute::ZExt:
1047 case Attribute::ImmArg:
1048 case Attribute::ByRef:
1049 case Attribute::WriteOnly:
1050 case Attribute::Writable:
1051 case Attribute::DeadOnUnwind:
1052 case Attribute::Range:
1053 case Attribute::Initializes:
1054 case Attribute::NoExt:
1060 case Attribute::DeadOnReturn:
1073 for (
Value *input : inputs) {
1074 if (StructValues.contains(input))
1077 ScalarAI->
setName(input->getName());
1078 if (input->isSwiftError())
1080 Attribute::SwiftError);
1083 for (
Value *output : outputs) {
1084 if (StructValues.contains(output))
1087 ScalarAI->
setName(output->getName() +
".out");
1093 auto Count = BFI->getProfileCountFromFreq(EntryFreq);
1094 if (
Count.has_value())
1111 if (!
I.getDebugLoc())
1138 Value *Mem =
II->getOperand(0);
1142 if (
II->getIntrinsicID() == Intrinsic::lifetime_start)
1143 LifetimesStart.
insert(Mem);
1144 II->eraseFromParent();
1159 bool InsertBefore) {
1160 for (
Value *Mem : Objects) {
1163 "Input memory not defined in original function");
1171 Marker->insertBefore(Term->getIterator());
1175 if (!LifetimesStart.
empty()) {
1176 insertMarkers(Intrinsic::lifetime_start, LifetimesStart,
1180 if (!LifetimesEnd.
empty()) {
1181 insertMarkers(Intrinsic::lifetime_end, LifetimesEnd,
1186void CodeExtractor::moveCodeToFunction(
Function *newFunction) {
1187 auto newFuncIt = newFunction->
begin();
1188 for (BasicBlock *
Block : Blocks) {
1190 Block->removeFromParent();
1197 newFuncIt = newFunction->
insert(std::next(newFuncIt),
Block);
1201void CodeExtractor::calculateNewCallTerminatorWeights(
1205 using Distribution = BlockFrequencyInfoImplBase::Distribution;
1206 using BlockNode = BlockFrequencyInfoImplBase::BlockNode;
1213 Distribution BranchDist;
1220 BlockNode ExitNode(i);
1223 BranchDist.addExit(ExitNode, ExitFreq);
1229 if (BranchDist.Total == 0) {
1230 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1235 BranchDist.normalize();
1238 for (
unsigned I = 0,
E = BranchDist.Weights.size();
I <
E; ++
I) {
1239 const auto &Weight = BranchDist.Weights[
I];
1242 BranchWeights[Weight.TargetNode.Index] = Weight.Amount;
1243 BranchProbability BP(Weight.Amount, BranchDist.Total);
1244 EdgeProbabilities[Weight.TargetNode.Index] = BP;
1246 BPI->setEdgeProbability(CodeReplacer, EdgeProbabilities);
1248 LLVMContext::MD_prof,
1249 MDBuilder(TI->
getContext()).createBranchWeights(BranchWeights));
1259 if (DVR->getFunction() != &
F)
1260 DVR->eraseFromParent();
1291 assert(OldSP->getUnit() &&
"Missing compile unit for subprogram");
1296 DISubprogram::SPFlagOptimized |
1297 DISubprogram::SPFlagLocalToUnit;
1300 0, SPType, 0, DINode::FlagZero, SPFlags);
1303 auto UpdateOrInsertDebugRecord = [&](
auto *DR,
Value *OldLoc,
Value *NewLoc,
1305 if (DR->getParent()->getParent() == &NewFunc) {
1306 DR->replaceVariableLocationOp(OldLoc, NewLoc);
1310 DIB.
insertDeclare(NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1315 NewLoc, DR->getVariable(), Expr, DR->getDebugLoc(),
1326 for (
auto *DVR : DPUsers)
1327 UpdateOrInsertDebugRecord(DVR,
Input, NewVal, Expr, DVR->isDbgDeclare());
1330 auto IsInvalidLocation = [&NewFunc](
Value *Location) {
1338 return Arg->getParent() != &NewFunc;
1355 DINode *&NewVar = RemappedMetadata[OldVar];
1358 *OldVar->getScope(), *NewSP, Ctx, Cache);
1360 NewScope, OldVar->
getName(), OldVar->getFile(), OldVar->getLine(),
1361 OldVar->getType(),
false, DINode::FlagZero,
1362 OldVar->getAlignInBits());
1367 auto UpdateDbgLabel = [&](
auto *LabelRecord) {
1370 if (LabelRecord->getDebugLoc().getInlinedAt())
1372 DILabel *OldLabel = LabelRecord->getLabel();
1373 DINode *&NewLabel = RemappedMetadata[OldLabel];
1376 *OldLabel->
getScope(), *NewSP, Ctx, Cache);
1385 auto UpdateDbgRecordsOnInst = [&](
Instruction &
I) ->
void {
1386 for (
DbgRecord &DR :
I.getDbgRecordRange()) {
1388 UpdateDbgLabel(DLR);
1414 UpdateDbgRecordsOnInst(
I);
1416 for (
auto *DVR : DVRsToDelete)
1417 DVR->getMarker()->MarkedInstr->dropOneDbgRecord(DVR);
1429 *NewSP, Ctx, Cache));
1432 auto updateLoopInfoLoc = [&Ctx, &Cache, NewSP](
Metadata *MD) ->
Metadata * {
1448 ValueSet Inputs, Outputs;
1454 ValueSet &inputs, ValueSet &outputs) {
1463 normalizeCFGForExtraction(header);
1471 AC->unregisterAssumption(AI);
1472 AI->eraseFromParent();
1477 ValueSet SinkingCands, HoistingCands;
1479 findAllocas(CEAC, SinkingCands, HoistingCands, CommonExit);
1489 ValueSet LifetimesStart;
1492 if (!HoistingCands.
empty()) {
1495 for (
auto *
II : HoistingCands)
1497 computeExtractedFuncRetVals();
1507 assert(BPI &&
"Both BPI and BFI are required to preserve profile info");
1509 if (Blocks.count(Pred))
1512 BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, header);
1515 for (
BasicBlock *Succ : ExtractedFuncRetVals) {
1517 if (!Blocks.count(
Block))
1522 BF += BFI->getBlockFreq(
Block) * BPI->getEdgeProbability(
Block, Succ);
1530 while (ReplIP && Blocks.count(ReplIP))
1534 std::string SuffixToUse =
1539 ValueSet StructValues;
1541 Function *newFunction = constructFunctionDeclaration(
1542 inputs, outputs, EntryFreq, oldFunction->
getName() +
"." + SuffixToUse,
1543 StructValues, StructTy);
1546 emitFunctionBody(inputs, outputs, StructValues, newFunction, StructTy, header,
1547 SinkingCands, NewValues);
1549 std::vector<Value *> Reloads;
1550 CallInst *TheCall = emitReplacerCall(
1551 inputs, outputs, StructValues, newFunction, StructTy, oldFunction, ReplIP,
1552 EntryFreq, LifetimesStart.
getArrayRef(), Reloads);
1554 insertReplacerCall(oldFunction, header, TheCall, outputs, Reloads,
1569void CodeExtractor::normalizeCFGForExtraction(
BasicBlock *&header) {
1572 splitReturnBlocks();
1575 severSplitPHINodesOfEntry(header);
1581 computeExtractedFuncRetVals();
1582 severSplitPHINodesOfExits();
1585void CodeExtractor::computeExtractedFuncRetVals() {
1586 ExtractedFuncRetVals.clear();
1591 if (Blocks.count(Succ))
1594 bool IsNew = ExitBlocks.
insert(Succ).second;
1596 ExtractedFuncRetVals.push_back(Succ);
1601Type *CodeExtractor::getSwitchType() {
1604 assert(ExtractedFuncRetVals.size() < 0xffff &&
1605 "too many exit blocks for switch");
1606 switch (ExtractedFuncRetVals.size()) {
1618void CodeExtractor::emitFunctionBody(
1619 const ValueSet &inputs,
const ValueSet &outputs,
1620 const ValueSet &StructValues,
Function *newFunction,
1634 for (
auto *
II : SinkingCands) {
1640 for (
auto *
II : SinkingCands) {
1647 Argument *AggArg = StructValues.empty()
1653 for (
unsigned i = 0, e = inputs.size(), aggIdx = 0; i != e; ++i) {
1655 if (StructValues.contains(inputs[i])) {
1660 StructArgTy, AggArg, Idx,
"gep_" + inputs[i]->
getName(), newFuncRoot);
1663 "loadgep_" + inputs[i]->getName(), newFuncRoot);
1676 unsigned AlignmentValue;
1677 const Triple &TargetTriple =
1685 inputs[i]->stripPointerCasts()->getPointerAlignment(
DL).value();
1687 AlignmentValue = inputs[i]->getPointerAlignment(
DL).value();
1690 LLVMContext::MD_align,
1693 MDB.createConstant(ConstantInt::get(
1696 RewriteVal = LoadGEP;
1699 RewriteVal = &*ScalarAI++;
1704 moveCodeToFunction(newFunction);
1706 for (
unsigned i = 0, e = inputs.size(); i != e; ++i) {
1707 Value *RewriteVal = NewValues[i];
1709 std::vector<User *>
Users(inputs[i]->user_begin(), inputs[i]->user_end());
1712 if (Blocks.count(inst->getParent()))
1713 inst->replaceUsesOfWith(inputs[i], RewriteVal);
1721 std::map<BasicBlock *, BasicBlock *> ExitBlockMap;
1725 for (
auto P :
enumerate(ExtractedFuncRetVals)) {
1727 size_t SuccNum =
P.index();
1731 ExitBlockMap[OldTarget] = NewTarget;
1733 Value *brVal =
nullptr;
1734 Type *RetTy = FuncRetVal ? FuncRetVal->getType() : getSwitchType();
1735 assert(ExtractedFuncRetVals.size() < 0xffff &&
1736 "too many exit blocks for switch");
1737 switch (ExtractedFuncRetVals.size()) {
1746 brVal = ConstantInt::get(RetTy, !SuccNum);
1749 brVal = ConstantInt::get(RetTy, SuccNum);
1756 for (BasicBlock *
Block : Blocks) {
1763 BasicBlock *NewTarget = ExitBlockMap[OldTarget];
1764 assert(NewTarget &&
"Unknown target block!");
1788 unsigned AggIdx = 0;
1790 for (
Value *Input : inputs) {
1791 if (StructValues.contains(Input))
1797 for (
Value *Output : outputs) {
1804 InsertPt = InvokeI->getNormalDest()->getFirstInsertionPt();
1806 InsertPt =
Phi->getParent()->getFirstInsertionPt();
1808 InsertPt = std::next(OutI->getIterator());
1811 if (StructValues.contains(Output))
1818 assert((InsertPt->getFunction() == newFunction ||
1819 Blocks.count(InsertPt->getParent())) &&
1820 "InsertPt should be in new function");
1822 if (StructValues.contains(Output)) {
1823 assert(AggArg &&
"Number of aggregate output arguments should match "
1824 "the number of defined values");
1829 StructArgTy, AggArg, Idx,
"gep_" + Output->getName(), InsertPt);
1830 new StoreInst(Output,
GEP, InsertPt);
1834 "Number of scalar output arguments should match "
1835 "the number of defined values");
1836 new StoreInst(Output, &*ScalarAI, InsertPt);
1841 if (ExtractedFuncRetVals.empty()) {
1845 if (
none_of(Blocks, [](
const BasicBlock *BB) {
1853CallInst *CodeExtractor::emitReplacerCall(
1854 const ValueSet &inputs,
const ValueSet &outputs,
1855 const ValueSet &StructValues,
Function *newFunction,
1858 std::vector<Value *> &Reloads) {
1865 if (AllocationBlock)
1866 assert(AllocationBlock->getParent() == oldFunction &&
1867 "AllocationBlock is not in the same function");
1869 AllocationBlock ? AllocationBlock : &oldFunction->
getEntryBlock();
1873 BFI->setBlockFreq(codeReplacer, EntryFreq);
1875 std::vector<Value *> params;
1878 for (
Value *input : inputs) {
1879 if (StructValues.contains(input))
1882 params.push_back(input);
1886 std::vector<Value *> ReloadOutputs;
1887 for (
Value *output : outputs) {
1888 if (StructValues.contains(output))
1894 output->getType(), output->getName() +
".loc");
1895 params.push_back(OutAlloc);
1896 ReloadOutputs.push_back(OutAlloc);
1900 if (!StructValues.empty()) {
1901 AddrSpaceCastInst *StructSpaceCast =
nullptr;
1904 StructArgTy,
"structArg", &StructSpaceCast);
1905 if (StructSpaceCast)
1906 params.push_back(StructSpaceCast);
1908 params.push_back(Struct);
1910 unsigned AggIdx = 0;
1911 for (
Value *input : inputs) {
1912 if (!StructValues.contains(input))
1919 StructArgTy, Struct, Idx,
"gep_" + input->getName());
1920 GEP->insertInto(codeReplacer, codeReplacer->
end());
1921 new StoreInst(input,
GEP, codeReplacer);
1929 newFunction, params, ExtractedFuncRetVals.size() > 1 ?
"targetBlock" :
"",
1933 unsigned ParamIdx = 0;
1934 unsigned AggIdx = 0;
1935 for (
auto input : inputs) {
1936 if (StructValues.contains(input)) {
1939 if (input->isSwiftError())
1956 for (
unsigned i = 0, e = outputs.size(), scalarIdx = 0; i != e; ++i) {
1957 Value *Output =
nullptr;
1958 if (StructValues.contains(outputs[i])) {
1963 StructArgTy, Struct, Idx,
"gep_reload_" + outputs[i]->
getName());
1964 GEP->insertInto(codeReplacer, codeReplacer->
end());
1968 Output = ReloadOutputs[scalarIdx];
1972 new LoadInst(outputs[i]->
getType(), Output,
1973 outputs[i]->
getName() +
".reload", codeReplacer);
1974 Reloads.push_back(
load);
1978 SwitchInst *TheSwitch =
1980 codeReplacer, 0, codeReplacer);
1981 for (
auto P :
enumerate(ExtractedFuncRetVals)) {
1983 size_t SuccNum =
P.index();
1990 Type *OldFnRetTy = TheSwitch->
getParent()->getParent()->getReturnType();
1991 switch (ExtractedFuncRetVals.size()) {
1999 }
else if (OldFnRetTy->
isVoidTy()) {
2052 auto deallocVars = [&](
BasicBlock *DeallocBlock,
2055 for (
Value *Output : outputs) {
2056 if (!StructValues.contains(Output))
2057 deallocateVar(IRBuilder<>::InsertPoint(DeallocBlock, DeallocIP),
2058 ReloadOutputs[Index++], Output->
getType());
2062 deallocateVar(IRBuilder<>::InsertPoint(DeallocBlock, DeallocIP), Struct,
2066 if (DeallocationBlocks.empty()) {
2067 deallocVars(codeReplacer, codeReplacer->
end());
2069 for (BasicBlock *DeallocationBlock : DeallocationBlocks)
2070 deallocVars(DeallocationBlock, DeallocationBlock->getFirstInsertionPt());
2076void CodeExtractor::insertReplacerCall(
2086 for (
auto &U :
Users)
2090 if (
I->isTerminator() &&
I->getFunction() == oldFunction &&
2091 !Blocks.count(
I->getParent()))
2092 I->replaceUsesOfWith(header, codeReplacer);
2098 for (BasicBlock *ExitBB : ExtractedFuncRetVals)
2099 for (PHINode &PN : ExitBB->phis()) {
2100 Value *IncomingCodeReplacerVal =
nullptr;
2107 if (!IncomingCodeReplacerVal) {
2112 "PHI has two incompatbile incoming values from codeRepl");
2116 for (
unsigned i = 0, e = outputs.size(); i != e; ++i) {
2118 std::vector<User *>
Users(outputs[i]->user_begin(), outputs[i]->user_end());
2119 for (User *U :
Users) {
2121 if (inst->
getParent()->getParent() == oldFunction)
2127 FuncRetVal->replaceUsesWithIf(ReplacerCall, [&](Use &U) {
2132 if (BFI && ExtractedFuncRetVals.size() > 1)
2133 calculateNewCallTerminatorWeights(codeReplacer, ExitWeights, BPI);
2139 for (
auto AssumeVH : AC->assumptions()) {
2145 if (
I->getFunction() != &OldFunc)
2151 for (
auto AffectedValVH : AC->assumptionsFor(
I->getOperand(0))) {
2155 if (AffectedCI->getFunction() != &OldFunc)
2158 if (AssumedInst->getFunction() != &OldFunc)
2166 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
Machine Check Debug Module
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 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 BranchProbability getUnknown()
static 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 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 DbgInstPtr insertDeclare(llvm::Value *Storage, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, BasicBlock *InsertAtEnd)
Insert a new llvm.dbg.declare intrinsic call.
LLVM_ABI DbgInstPtr insertDbgValueIntrinsic(llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, InsertPosition InsertPt)
Insert a new llvm.dbg.value intrinsic call.
LLVM_ABI DITypeArray getOrCreateTypeArray(ArrayRef< Metadata * > Elements)
Get a DITypeArray, create one if required.
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.
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)
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(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type 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.