80#include "llvm/IR/IntrinsicsWebAssembly.h"
116#define DEBUG_TYPE "isel"
117#define ISEL_DUMP_DEBUG_TYPE DEBUG_TYPE "-dump"
119STATISTIC(NumFastIselFailures,
"Number of instructions fast isel failed on");
120STATISTIC(NumFastIselSuccess,
"Number of instructions fast isel selected");
121STATISTIC(NumFastIselBlocks,
"Number of blocks selected entirely by fast isel");
122STATISTIC(NumDAGBlocks,
"Number of blocks selected using DAG");
123STATISTIC(NumDAGIselRetries,
"Number of times dag isel has to try another path");
124STATISTIC(NumEntryBlocks,
"Number of entry blocks encountered");
126 "Number of entry blocks where fast isel failed to lower arguments");
130 cl::desc(
"Enable abort calls when \"fast\" instruction selection "
131 "fails to lower an instruction: 0 disable the abort, 1 will "
132 "abort but for args, calls and terminators, 2 will also "
133 "abort for argument lowering, and 3 will never fallback "
134 "to SelectionDAG."));
138 cl::desc(
"Emit a diagnostic when \"fast\" instruction selection "
139 "falls back to SelectionDAG."));
143 cl::desc(
"use Machine Branch Probability Info"),
149 cl::desc(
"Only display the basic block whose name "
150 "matches this for all view-*-dags options"));
153 cl::desc(
"Pop up a window to show dags before the first "
154 "dag combine pass"));
157 cl::desc(
"Pop up a window to show dags before legalize types"));
160 cl::desc(
"Pop up a window to show dags before the post "
161 "legalize types dag combine pass"));
164 cl::desc(
"Pop up a window to show dags before legalize"));
167 cl::desc(
"Pop up a window to show dags before the second "
168 "dag combine pass"));
171 cl::desc(
"Pop up a window to show isel dags as they are selected"));
174 cl::desc(
"Pop up a window to show sched dags as they are processed"));
177 cl::desc(
"Pop up a window to show SUnit dags after they are processed"));
186#define ISEL_DUMP(X) \
188 if (llvm::DebugFlag && \
189 (isCurrentDebugType(DEBUG_TYPE) || \
190 (isCurrentDebugType(ISEL_DUMP_DEBUG_TYPE) && MatchFilterFuncName))) { \
195#define ISEL_DUMP(X) do { } while (false)
215 cl::desc(
"Instruction schedulers available (before register"
228 return Arg.hasAttribute(Attribute::AttrKind::SwiftAsync);
245 SavedOptLevel = IS.OptLevel;
246 SavedFastISel = IS.TM.Options.EnableFastISel;
247 if (NewOptLevel != SavedOptLevel) {
248 IS.OptLevel = NewOptLevel;
249 IS.TM.setOptLevel(NewOptLevel);
250 LLVM_DEBUG(
dbgs() <<
"\nChanging optimization level for Function "
251 << IS.MF->getFunction().getName() <<
"\n");
252 LLVM_DEBUG(
dbgs() <<
"\tBefore: -O" <<
static_cast<int>(SavedOptLevel)
253 <<
" ; After: -O" <<
static_cast<int>(NewOptLevel)
256 IS.TM.setFastISel(IS.TM.getO0WantsFastISel());
259 IS.TM.setFastISel(
false);
261 dbgs() <<
"\tFastISel is "
262 << (IS.TM.Options.EnableFastISel ?
"enabled" :
"disabled")
267 if (IS.OptLevel == SavedOptLevel)
269 LLVM_DEBUG(
dbgs() <<
"\nRestoring optimization level for Function "
270 << IS.MF->getFunction().getName() <<
"\n");
271 LLVM_DEBUG(
dbgs() <<
"\tBefore: -O" <<
static_cast<int>(IS.OptLevel)
272 <<
" ; After: -O" <<
static_cast<int>(SavedOptLevel) <<
"\n");
273 IS.OptLevel = SavedOptLevel;
274 IS.TM.setOptLevel(SavedOptLevel);
275 IS.TM.setFastISel(SavedFastISel);
288 if (
auto *SchedulerCtor = ST.getDAGScheduler(OptLevel)) {
289 return SchedulerCtor(IS, OptLevel);
293 (ST.enableMachineScheduler() && ST.enableMachineSchedDefaultSched()) ||
307 "Unknown sched type!");
317 dbgs() <<
"If a target marks an instruction with "
318 "'usesCustomInserter', it must implement "
319 "TargetLowering::EmitInstrWithCustomInserter!\n";
327 "If a target marks an instruction with 'hasPostISelHook', "
328 "it must implement TargetLowering::AdjustInstrPostInstrSelection!");
336 char &
ID, std::unique_ptr<SelectionDAGISel> S)
367 : Selector->OptLevel;
371 Selector->initializeAnalysisResults(*
this);
372 return Selector->runOnMachineFunction(MF);
440 : Selector->OptLevel;
443 Selector->initializeAnalysisResults(MFAM);
444 Selector->runOnMachineFunction(MF);
462 TII =
MF->getSubtarget().getInstrInfo();
463 TLI =
MF->getSubtarget().getTargetLowering();
467 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
502#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
516 TII =
MF->getSubtarget().getInstrInfo();
517 TLI =
MF->getSubtarget().getTargetLowering();
522 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
535 UA = &UAPass->getUniformityInfo();
560#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
577 MF->setHasInlineAsm(
false);
604 TLI->initializeSplitCSR(EntryMBB);
606 SelectAllBasicBlocks(Fn);
634 MRI.constrainRegClass(To,
MRI.getRegClass(From));
640 if (!
MRI.use_empty(To))
641 MRI.clearKillFlags(From);
642 MRI.replaceRegWith(From, To);
656 if (!
MBB.succ_empty())
660 if (Term !=
MBB.end() && Term->isReturn()) {
665 TLI->insertCopiesSplitCSR(EntryMBB, Returns);
669 if (!
FuncInfo->ArgDbgValues.empty())
670 for (std::pair<MCRegister, Register> LI :
RegInfo->liveins())
675 for (
unsigned i = 0, e =
FuncInfo->ArgDbgValues.size(); i != e; ++i) {
677 assert(
MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
678 "Function parameters should not be described by DBG_VALUE_LIST.");
679 bool hasFI =
MI->getDebugOperand(0).isFI();
681 hasFI ?
TRI.getFrameRegister(*
MF) :
MI->getDebugOperand(0).getReg();
682 if (Reg.isPhysical())
689 Def->getParent()->insert(std::next(InsertPos),
MI);
700 if (!Reg.isPhysical())
703 if (LDI != LiveInMap.
end()) {
704 assert(!hasFI &&
"There's no handling of frame pointer updating here yet "
708 const MDNode *Variable =
MI->getDebugVariable();
709 const MDNode *Expr =
MI->getDebugExpression();
711 bool IsIndirect =
MI->isIndirectDebugValue();
713 assert(
MI->getDebugOffset().getImm() == 0 &&
714 "DBG_VALUE with nonzero offset");
716 "Expected inlined-at fields to agree");
717 assert(
MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
718 "Didn't expect to see a DBG_VALUE_LIST here");
720 BuildMI(*EntryMBB, ++InsertPos,
DL,
TII->get(TargetOpcode::DBG_VALUE),
721 IsIndirect, LDI->second, Variable, Expr);
728 if (
UseMI.isDebugValue())
730 if (
UseMI.isCopy() && !CopyUseMI &&
UseMI.getParent() == EntryMBB) {
739 TRI.getRegSizeInBits(LDI->second,
MRI) ==
754 if (
MF->useDebugInstrRef())
755 MF->finalizeDebugInstrRefs();
759 for (
const auto &
MBB : *
MF) {
763 for (
const auto &
MI :
MBB) {
765 if ((
MCID.isCall() && !
MCID.isReturn()) ||
766 MI.isStackAligningInlineAsm()) {
769 if (
MI.isInlineAsm()) {
770 MF->setHasInlineAsm(
true);
779 ISEL_DUMP(
dbgs() <<
"*** MachineFunction at end of ISel ***\n");
791 if (!R.getLocation().isValid() || ShouldAbort)
792 R << (
" (in function: " + MF.
getName() +
")").str();
810 bool HaveFakeUse =
false;
811 bool HaveTailCall =
false;
814 if (CI->isTailCall()) {
819 if (
II->getIntrinsicID() == Intrinsic::fake_use)
821 }
while (
I != Begin);
824 if (!HaveTailCall || !HaveFakeUse)
833 FakeUse && FakeUse->getIntrinsicID() == Intrinsic::fake_use) {
835 !UsedDef || UsedDef->getParent() !=
I->getParent() ||
836 UsedDef->comesBefore(&*
I))
841 for (
auto *Inst : FakeUses)
842 Inst->moveBefore(*Inst->getParent(),
I);
849 CurDAG->NewNodesMustHaveLegalTypes =
false;
858 SDB->visitDbgInfo(*
I);
863 HadTailCall =
SDB->HasTailCall;
864 SDB->resolveOrClearDbgInfo();
871void SelectionDAGISel::ComputeLiveOutVRegInfo() {
872 SmallPtrSet<SDNode *, 16>
Added;
885 if (
Op.getValueType() == MVT::Other &&
Added.insert(
Op.getNode()).second)
898 EVT SrcVT = Src.getValueType();
902 unsigned NumSignBits =
CurDAG->ComputeNumSignBits(Src);
903 Known =
CurDAG->computeKnownBits(Src);
904 FuncInfo->AddLiveOutRegInfo(DestReg, NumSignBits, Known);
905 }
while (!Worklist.
empty());
908void SelectionDAGISel::CodeGenAndEmitDAG() {
909 StringRef GroupName =
"sdag";
910 StringRef GroupDescription =
"Instruction Selection and Scheduling";
911 std::string BlockName;
912 bool MatchFilterBB =
false;
916 CurDAG->NewNodesMustHaveLegalTypes =
false;
921 FuncInfo->MBB->getBasicBlock()->getName());
930 (
MF->getName() +
":" +
FuncInfo->MBB->getBasicBlock()->getName()).str();
937#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
939 CurDAG->VerifyDAGDivergence();
943 CurDAG->viewGraph(
"dag-combine1 input for " + BlockName);
947 NamedRegionTimer
T(
"combine1",
"DAG Combining 1", GroupName,
957#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
959 CurDAG->VerifyDAGDivergence();
965 CurDAG->viewGraph(
"legalize-types input for " + BlockName);
969 NamedRegionTimer
T(
"legalize_types",
"Type Legalization", GroupName,
979#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
981 CurDAG->VerifyDAGDivergence();
985 CurDAG->NewNodesMustHaveLegalTypes =
true;
989 CurDAG->viewGraph(
"dag-combine-lt input for " + BlockName);
993 NamedRegionTimer
T(
"combine_lt",
"DAG Combining after legalize types",
998 ISEL_DUMP(
dbgs() <<
"\nOptimized type-legalized selection DAG: "
1003#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1005 CurDAG->VerifyDAGDivergence();
1010 NamedRegionTimer
T(
"legalize_vec",
"Vector Legalization", GroupName,
1021#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1023 CurDAG->VerifyDAGDivergence();
1027 NamedRegionTimer
T(
"legalize_types2",
"Type Legalization 2", GroupName,
1032 ISEL_DUMP(
dbgs() <<
"\nVector/type-legalized selection DAG: "
1037#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1039 CurDAG->VerifyDAGDivergence();
1043 CurDAG->viewGraph(
"dag-combine-lv input for " + BlockName);
1047 NamedRegionTimer
T(
"combine_lv",
"DAG Combining after legalize vectors",
1052 ISEL_DUMP(
dbgs() <<
"\nOptimized vector-legalized selection DAG: "
1057#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1059 CurDAG->VerifyDAGDivergence();
1064 CurDAG->viewGraph(
"legalize input for " + BlockName);
1067 NamedRegionTimer
T(
"legalize",
"DAG Legalization", GroupName,
1077#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1079 CurDAG->VerifyDAGDivergence();
1083 CurDAG->viewGraph(
"dag-combine2 input for " + BlockName);
1087 NamedRegionTimer
T(
"combine2",
"DAG Combining 2", GroupName,
1097#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1099 CurDAG->VerifyDAGDivergence();
1103 ComputeLiveOutVRegInfo();
1106 CurDAG->viewGraph(
"isel input for " + BlockName);
1111 NamedRegionTimer
T(
"isel",
"Instruction Selection", GroupName,
1113 DoInstructionSelection();
1122 CurDAG->viewGraph(
"scheduler input for " + BlockName);
1125 ScheduleDAGSDNodes *
Scheduler = CreateScheduler();
1127 NamedRegionTimer
T(
"sched",
"Instruction Scheduling", GroupName,
1137 MachineBasicBlock *FirstMBB =
FuncInfo->MBB, *LastMBB;
1139 NamedRegionTimer
T(
"emit",
"Instruction Creation", GroupName,
1149 if (FirstMBB != LastMBB)
1150 SDB->UpdateSplitBlock(FirstMBB, LastMBB);
1154 NamedRegionTimer
T(
"cleanup",
"Instruction Scheduling Cleanup", GroupName,
1172 : SelectionDAG::DAGUpdateListener(DAG), ISelPosition(isp) {}
1177 void NodeDeleted(SDNode *
N, SDNode *
E)
override {
1185 void NodeInserted(SDNode *
N)
override {
1186 SDNode *CurNode = &*ISelPosition;
1187 if (MDNode *MD = DAG.getPCSections(CurNode))
1188 DAG.addPCSections(
N, MD);
1189 if (MDNode *MMRA = DAG.getMMRAMetadata(CurNode))
1190 DAG.addMMRAMetadata(
N, MMRA);
1220 while (!Nodes.
empty()) {
1222 for (
auto *U :
N->users()) {
1223 auto UId = U->getNodeId();
1236 int InvalidId = -(
N->getNodeId() + 1);
1237 N->setNodeId(InvalidId);
1242 int Id =
N->getNodeId();
1248void SelectionDAGISel::DoInstructionSelection() {
1251 <<
FuncInfo->MBB->getName() <<
"'\n");
1269 ISelUpdater ISU(*
CurDAG, ISelPosition);
1280 if (
Node->use_empty())
1287 while (!Nodes.
empty()) {
1304 "Node has already selected predecessor node");
1316 if (!
TLI->isStrictFPEnabled() &&
Node->isStrictFPOpcode()) {
1321 switch (
Node->getOpcode()) {
1330 ActionVT =
Node->getOperand(1).getValueType();
1333 ActionVT =
Node->getValueType(0);
1336 if (
TLI->getOperationAction(
Node->getOpcode(), ActionVT)
1341 LLVM_DEBUG(
dbgs() <<
"\nISEL: Starting selection on root node: ";
1347 CurDAG->setRoot(Dummy.getValue());
1359 if (IID == Intrinsic::eh_exceptionpointer ||
1360 IID == Intrinsic::eh_exceptioncode)
1375 bool IsSingleCatchAllClause =
1380 bool IsCatchLongjmp = CPI->
arg_size() == 0;
1381 if (!IsSingleCatchAllClause && !IsCatchLongjmp) {
1383 bool IntrFound =
false;
1387 if (IID == Intrinsic::wasm_landingpad_index) {
1388 Value *IndexArg =
Call->getArgOperand(1);
1396 assert(IntrFound &&
"wasm.landingpad.index intrinsic not found!");
1403bool SelectionDAGISel::PrepareEHLandingPad() {
1407 const TargetRegisterClass *PtrRC =
1408 TLI->getRegClassFor(
TLI->getPointerTy(
CurDAG->getDataLayout()));
1419 MCRegister EHPhysReg =
TLI->getExceptionPointerRegister(PersonalityFn);
1420 assert(EHPhysReg &&
"target lacks exception pointer register");
1424 TII->get(TargetOpcode::COPY), VReg)
1435 const MCInstrDesc &
II =
TII->get(TargetOpcode::EH_LABEL);
1441 const TargetRegisterInfo &
TRI = *
MF->getSubtarget().getRegisterInfo();
1442 if (
auto *RegMask =
TRI.getCustomEHPadPreservedMask(*
MF))
1443 MF->getRegInfo().addPhysRegsUsedFromRegMask(RegMask);
1450 MF->setCallSiteLandingPad(Label,
SDB->LPadToCallSiteMap[
MBB]);
1452 if (MCRegister
Reg =
TLI->getExceptionPointerRegister(PersonalityFn))
1455 if (MCRegister
Reg =
TLI->getExceptionSelectorRegister(PersonalityFn))
1464 llvm::WinEHFuncInfo *EHInfo =
MF->getWinEHFuncInfo();
1467 for (MachineBasicBlock &
MBB : *
MF) {
1477 MachineInstr *MIb = &*MBBb;
1482 MCSymbol *BeginLabel =
MF->getContext().createTempSymbol();
1483 MCSymbol *EndLabel =
MF->getContext().createTempSymbol();
1486 TII->get(TargetOpcode::EH_LABEL))
1489 MachineInstr *MIe = &*(--MBBe);
1495 TII->get(TargetOpcode::EH_LABEL))
1506 return !
I->mayWriteToMemory() &&
1507 !
I->isTerminator() &&
1519 auto ArgIt = FuncInfo.
ValueMap.find(Arg);
1520 if (ArgIt == FuncInfo.
ValueMap.end())
1522 Register ArgVReg = ArgIt->getSecond();
1526 if (VirtReg == ArgVReg) {
1530 LLVM_DEBUG(
dbgs() <<
"processDbgDeclare: setVariableDbgInfo Var=" << *Var
1531 <<
", Expr=" << *Expr <<
", MCRegister=" << PhysReg
1532 <<
", DbgLoc=" << DbgLoc <<
"\n");
1543 <<
" (bad address)\n");
1550 if (!Address->getType()->isPointerTy())
1556 assert(Var &&
"Missing variable");
1557 assert(DbgLoc &&
"Missing location");
1561 APInt Offset(
DL.getIndexTypeSizeInBits(Address->getType()), 0);
1562 Address = Address->stripAndAccumulateInBoundsConstantOffsets(
DL,
Offset);
1567 int FI = std::numeric_limits<int>::max();
1575 if (FI == std::numeric_limits<int>::max())
1578 if (
Offset.getBoolValue())
1582 LLVM_DEBUG(
dbgs() <<
"processDbgDeclare: setVariableDbgInfo Var=" << *Var
1583 <<
", Expr=" << *Expr <<
", FI=" << FI
1584 <<
", DbgLoc=" << DbgLoc <<
"\n");
1596 DVR.getExpression(), DVR.getVariable(),
1611 assert(!It->Values.hasArgList() &&
"Single loc variadic ops not supported");
1617void SelectionDAGISel::SelectAllBasicBlocks(
const Function &Fn) {
1620 FastISel *FastIS =
nullptr;
1621 if (
TM.Options.EnableFastISel) {
1626 ReversePostOrderTraversal<const Function*> RPOT(&Fn);
1647 ++NumFastIselFailLowerArguments;
1649 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1652 R <<
"FastISel didn't lower all arguments: "
1660 CodeGenAndEmitDAG();
1674 if (FastIS && Inserted)
1679 "expected AssignmentTrackingAnalysis pass results");
1687 for (
const BasicBlock *LLVMBB : RPOT) {
1689 bool AllPredsVisited =
true;
1691 if (!
FuncInfo->VisitedBBs[Pred->getNumber()]) {
1692 AllPredsVisited =
false;
1697 if (AllPredsVisited) {
1698 for (
const PHINode &PN : LLVMBB->
phis())
1699 FuncInfo->ComputePHILiveOutRegInfo(&PN);
1701 for (
const PHINode &PN : LLVMBB->
phis())
1702 FuncInfo->InvalidatePHILiveOutRegInfo(&PN);
1713 const_cast<BasicBlock *
>(LLVMBB)->getFirstNonPHIIt();
1733 if (!PrepareEHLandingPad())
1739 if (NewRoot && NewRoot !=
CurDAG->getRoot())
1740 CurDAG->setRoot(NewRoot);
1749 unsigned NumFastIselRemaining = std::distance(Begin, End);
1755 for (; BI != Begin; --BI) {
1761 --NumFastIselRemaining;
1772 --NumFastIselRemaining;
1773 ++NumFastIselSuccess;
1780 while (BeforeInst != &*Begin) {
1790 <<
"FastISel folded load: " << *BeforeInst <<
"\n");
1793 --NumFastIselRemaining;
1794 ++NumFastIselSuccess;
1808 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1811 R <<
"FastISel missed call";
1814 std::string InstStrStorage;
1815 raw_string_ostream InstStr(InstStrStorage);
1818 R <<
": " << InstStrStorage;
1830 bool HadTailCall =
false;
1832 SelectBasicBlock(Inst->
getIterator(), BI, HadTailCall);
1844 unsigned RemainingNow = std::distance(Begin, BI);
1845 NumFastIselFailures += NumFastIselRemaining - RemainingNow;
1846 NumFastIselRemaining = RemainingNow;
1850 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1856 R <<
"FastISel missed terminator";
1860 R <<
"FastISel missed";
1864 std::string InstStrStorage;
1865 raw_string_ostream InstStr(InstStrStorage);
1867 R <<
": " << InstStrStorage;
1872 NumFastIselFailures += NumFastIselRemaining;
1879 if (
SP->shouldEmitSDCheck(*LLVMBB)) {
1880 bool FunctionBasedInstrumentation =
1882 SDB->SPDescriptor.initialize(LLVMBB,
FuncInfo->getMBB(LLVMBB),
1883 FunctionBasedInstrumentation);
1889 ++NumFastIselBlocks;
1896 SelectBasicBlock(Begin, BI, HadTailCall);
1908 FuncInfo->PHINodesToUpdate.clear();
1914 reportIPToStateForBlocks(
MF);
1916 SP->copyToMachineFrameInfo(
MF->getFrameInfo());
1921 SDB->clearDanglingDebugInfo();
1922 SDB->SPDescriptor.resetPerFunctionState();
1926SelectionDAGISel::FinishBasicBlock() {
1928 <<
FuncInfo->PHINodesToUpdate.size() <<
"\n";
1929 for (
unsigned i = 0, e =
FuncInfo->PHINodesToUpdate.size(); i != e;
1931 <<
"Node " << i <<
" : (" <<
FuncInfo->PHINodesToUpdate[i].first
1937 for (
unsigned i = 0, e =
FuncInfo->PHINodesToUpdate.size(); i != e; ++i) {
1938 MachineInstrBuilder
PHI(*
MF,
FuncInfo->PHINodesToUpdate[i].first);
1940 "This is not a machine PHI node that we are updating!");
1941 if (!
FuncInfo->MBB->isSuccessor(
PHI->getParent()))
1947 if (
SDB->SPDescriptor.shouldEmitFunctionBasedCheckStackProtector()) {
1950 MachineBasicBlock *ParentMBB =
SDB->SPDescriptor.getParentMBB();
1955 SDB->visitSPDescriptorParent(
SDB->SPDescriptor, ParentMBB);
1958 CodeGenAndEmitDAG();
1961 SDB->SPDescriptor.resetPerBBState();
1962 }
else if (
SDB->SPDescriptor.shouldEmitStackProtector()) {
1963 MachineBasicBlock *ParentMBB =
SDB->SPDescriptor.getParentMBB();
1964 MachineBasicBlock *SuccessMBB =
SDB->SPDescriptor.getSuccessMBB();
1976 SuccessMBB->
splice(SuccessMBB->
end(), ParentMBB, SplitPoint,
1982 SDB->visitSPDescriptorParent(
SDB->SPDescriptor, ParentMBB);
1985 CodeGenAndEmitDAG();
1988 MachineBasicBlock *FailureMBB =
SDB->SPDescriptor.getFailureMBB();
1989 if (FailureMBB->
empty()) {
1992 SDB->visitSPDescriptorFailure(
SDB->SPDescriptor);
1995 CodeGenAndEmitDAG();
1999 SDB->SPDescriptor.resetPerBBState();
2003 for (
auto &BTB :
SDB->SL->BitTestCases) {
2013 CodeGenAndEmitDAG();
2016 BranchProbability UnhandledProb = BTB.Prob;
2017 for (
unsigned j = 0, ej = BTB.Cases.size(); j != ej; ++j) {
2018 UnhandledProb -= BTB.Cases[
j].ExtraProb;
2032 MachineBasicBlock *NextMBB;
2033 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2036 NextMBB = BTB.Cases[
j + 1].TargetBB;
2037 }
else if (j + 1 == ej) {
2039 NextMBB = BTB.Default;
2042 NextMBB = BTB.Cases[
j + 1].ThisBB;
2045 SDB->visitBitTestCase(BTB, NextMBB, UnhandledProb, BTB.Reg, BTB.Cases[j],
2050 CodeGenAndEmitDAG();
2052 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2054 BTB.Cases.pop_back();
2060 for (
const std::pair<MachineInstr *, Register> &
P :
2062 MachineInstrBuilder
PHI(*
MF,
P.first);
2063 MachineBasicBlock *PHIBB =
PHI->getParent();
2065 "This is not a machine PHI node that we are updating!");
2068 if (PHIBB == BTB.Default) {
2069 PHI.addReg(
P.second).addMBB(BTB.Parent);
2070 if (!BTB.ContiguousRange) {
2071 PHI.addReg(
P.second).addMBB(BTB.Cases.back().ThisBB);
2075 for (
const SwitchCG::BitTestCase &
BT : BTB.Cases) {
2076 MachineBasicBlock* cBB =
BT.ThisBB;
2078 PHI.addReg(
P.second).addMBB(cBB);
2082 SDB->SL->BitTestCases.clear();
2087 for (
unsigned i = 0, e =
SDB->SL->JTCases.size(); i != e; ++i) {
2089 if (!
SDB->SL->JTCases[i].first.Emitted) {
2091 FuncInfo->MBB =
SDB->SL->JTCases[i].first.HeaderBB;
2094 SDB->visitJumpTableHeader(
SDB->SL->JTCases[i].second,
2098 CodeGenAndEmitDAG();
2105 SDB->visitJumpTable(
SDB->SL->JTCases[i].second);
2108 CodeGenAndEmitDAG();
2111 for (
unsigned pi = 0, pe =
FuncInfo->PHINodesToUpdate.size();
2113 MachineInstrBuilder
PHI(*
MF,
FuncInfo->PHINodesToUpdate[pi].first);
2116 "This is not a machine PHI node that we are updating!");
2118 if (PHIBB ==
SDB->SL->JTCases[i].second.Default)
2120 .addMBB(
SDB->SL->JTCases[i].first.HeaderBB);
2122 if (
FuncInfo->MBB->isSuccessor(PHIBB))
2126 SDB->SL->JTCases.clear();
2130 for (
unsigned i = 0, e =
SDB->SL->SwitchCases.size(); i != e; ++i) {
2138 if (
SDB->SL->SwitchCases[i].TrueBB !=
SDB->SL->SwitchCases[i].FalseBB)
2145 CodeGenAndEmitDAG();
2149 MachineBasicBlock *ThisBB =
FuncInfo->MBB;
2155 for (MachineBasicBlock *Succ : Succs) {
2166 for (
unsigned pn = 0; ; ++pn) {
2168 "Didn't find PHI entry!");
2169 if (
FuncInfo->PHINodesToUpdate[pn].first ==
PHI) {
2170 PHI.addReg(
FuncInfo->PHINodesToUpdate[pn].second).addMBB(ThisBB);
2178 SDB->SL->SwitchCases.clear();
2199 int64_t DesiredMaskS)
const {
2200 const APInt &ActualMask = RHS->getAPIntValue();
2203 const APInt &DesiredMask =
APInt(LHS.getValueSizeInBits(), DesiredMaskS,
2207 if (ActualMask == DesiredMask)
2216 APInt NeededMask = DesiredMask & ~ActualMask;
2217 if (
CurDAG->MaskedValueIsZero(LHS, NeededMask))
2231 int64_t DesiredMaskS)
const {
2232 const APInt &ActualMask = RHS->getAPIntValue();
2235 const APInt &DesiredMask =
APInt(LHS.getValueSizeInBits(), DesiredMaskS,
2239 if (ActualMask == DesiredMask)
2248 APInt NeededMask = DesiredMask & ~ActualMask;
2268 std::list<HandleSDNode> Handles;
2273 Handles.emplace_back(
2282 if (!Flags.isMemKind() && !Flags.isFuncKind()) {
2284 Handles.insert(Handles.end(),
Ops.begin() + i,
2285 Ops.begin() + i + Flags.getNumOperandRegisters() + 1);
2286 i += Flags.getNumOperandRegisters() + 1;
2288 assert(Flags.getNumOperandRegisters() == 1 &&
2289 "Memory operand with multiple values?");
2291 unsigned TiedToOperand;
2292 if (Flags.isUseOperandTiedToDef(TiedToOperand)) {
2296 for (; TiedToOperand; --TiedToOperand) {
2297 CurOp += Flags.getNumOperandRegisters() + 1;
2303 std::vector<SDValue> SelOps;
2305 Flags.getMemoryConstraintID();
2314 Flags.setMemConstraint(ConstraintID);
2315 Handles.emplace_back(
CurDAG->getTargetConstant(Flags,
DL, MVT::i32));
2322 if (e !=
Ops.size())
2323 Handles.emplace_back(
Ops.back());
2326 for (
auto &handle : Handles)
2327 Ops.push_back(handle.getValue());
2333 bool IgnoreChains) {
2342 Visited.
insert(ImmedUse);
2347 if ((
Op.getValueType() == MVT::Other && IgnoreChains) ||
N == Def)
2349 if (!Visited.
insert(
N).second)
2355 if (Root != ImmedUse) {
2359 if ((
Op.getValueType() == MVT::Other && IgnoreChains) ||
N == Def)
2361 if (!Visited.
insert(
N).second)
2376 return N.hasOneUse();
2383 bool IgnoreChains) {
2432 while (VT == MVT::Glue) {
2443 IgnoreChains =
false;
2449void SelectionDAGISel::Select_INLINEASM(
SDNode *
N) {
2452 std::vector<SDValue>
Ops(
N->op_begin(),
N->op_end());
2455 const EVT VTs[] = {MVT::Other, MVT::Glue};
2462void SelectionDAGISel::Select_READ_REGISTER(
SDNode *
Op) {
2467 EVT VT =
Op->getValueType(0);
2470 const MachineFunction &
MF =
CurDAG->getMachineFunction();
2478 "\" for llvm.read_register",
2479 Fn,
Op->getDebugLoc()));
2481 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, dl, VT), 0);
2485 CurDAG->getCopyFromReg(
Op->getOperand(0), dl,
Reg,
Op->getValueType(0));
2493void SelectionDAGISel::Select_WRITE_REGISTER(
SDNode *
Op) {
2498 EVT VT =
Op->getOperand(2).getValueType();
2501 const MachineFunction &
MF =
CurDAG->getMachineFunction();
2508 "\" for llvm.write_register",
2509 Fn,
Op->getDebugLoc()));
2513 CurDAG->getCopyToReg(
Op->getOperand(0), dl,
Reg,
Op->getOperand(2));
2521void SelectionDAGISel::Select_UNDEF(
SDNode *
N) {
2522 CurDAG->SelectNodeTo(
N, TargetOpcode::IMPLICIT_DEF,
N->getValueType(0));
2527void SelectionDAGISel::Select_FAKE_USE(
SDNode *
N) {
2528 CurDAG->SelectNodeTo(
N, TargetOpcode::FAKE_USE,
N->getValueType(0),
2529 N->getOperand(1),
N->getOperand(0));
2532void SelectionDAGISel::Select_FREEZE(
SDNode *
N) {
2536 CurDAG->SelectNodeTo(
N, TargetOpcode::COPY,
N->getValueType(0),
2540void SelectionDAGISel::Select_ARITH_FENCE(
SDNode *
N) {
2541 CurDAG->SelectNodeTo(
N, TargetOpcode::ARITH_FENCE,
N->getValueType(0),
2545void SelectionDAGISel::Select_MEMBARRIER(
SDNode *
N) {
2546 CurDAG->SelectNodeTo(
N, TargetOpcode::MEMBARRIER,
N->getValueType(0),
2550void SelectionDAGISel::Select_CONVERGENCECTRL_ANCHOR(
SDNode *
N) {
2551 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_ANCHOR,
2552 N->getValueType(0));
2555void SelectionDAGISel::Select_CONVERGENCECTRL_ENTRY(
SDNode *
N) {
2556 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_ENTRY,
2557 N->getValueType(0));
2560void SelectionDAGISel::Select_CONVERGENCECTRL_LOOP(
SDNode *
N) {
2561 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_LOOP,
2562 N->getValueType(0),
N->getOperand(0));
2567 SDNode *OpNode = OpVal.
getNode();
2575 CurDAG->getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
2579 Ops.push_back(OpVal);
2583void SelectionDAGISel::Select_STACKMAP(
SDNode *
N) {
2585 auto *It =
N->op_begin();
2594 assert(
ID.getValueType() == MVT::i64);
2600 Ops.push_back(Shad);
2603 for (; It !=
N->op_end(); It++)
2604 pushStackMapLiveVariable(
Ops, *It,
DL);
2606 Ops.push_back(Chain);
2607 Ops.push_back(InGlue);
2609 SDVTList NodeTys =
CurDAG->getVTList(MVT::Other, MVT::Glue);
2610 CurDAG->SelectNodeTo(
N, TargetOpcode::STACKMAP, NodeTys,
Ops);
2613void SelectionDAGISel::Select_PATCHPOINT(
SDNode *
N) {
2615 auto *It =
N->op_begin();
2620 std::optional<SDValue> Glue;
2621 if (It->getValueType() == MVT::Glue)
2627 assert(
ID.getValueType() == MVT::i64);
2633 Ops.push_back(Shad);
2636 Ops.push_back(*It++);
2641 Ops.push_back(NumArgs);
2644 Ops.push_back(*It++);
2648 Ops.push_back(*It++);
2651 for (; It !=
N->op_end(); It++)
2652 pushStackMapLiveVariable(
Ops, *It,
DL);
2655 Ops.push_back(RegMask);
2656 Ops.push_back(Chain);
2657 if (Glue.has_value())
2658 Ops.push_back(*Glue);
2660 SDVTList NodeTys =
N->getVTList();
2661 CurDAG->SelectNodeTo(
N, TargetOpcode::PATCHPOINT, NodeTys,
Ops);
2667 assert(Val >= 128 &&
"Not a VBR");
2673 NextBits = MatcherTable[Idx++];
2674 Val |= (NextBits&127) << Shift;
2676 }
while (NextBits & 128);
2684getSimpleVT(
const unsigned char *MatcherTable,
unsigned &MatcherIndex) {
2685 unsigned SimpleVT = MatcherTable[MatcherIndex++];
2687 SimpleVT =
GetVBR(SimpleVT, MatcherTable, MatcherIndex);
2692void SelectionDAGISel::Select_JUMP_TABLE_DEBUG_INFO(
SDNode *
N) {
2694 CurDAG->SelectNodeTo(
N, TargetOpcode::JUMP_TABLE_DEBUG_INFO, MVT::Glue,
2695 CurDAG->getTargetConstant(
N->getConstantOperandVal(1),
2696 dl, MVT::i64,
true));
2701void SelectionDAGISel::UpdateChains(
2708 if (!ChainNodesMatched.
empty()) {
2710 "Matched input chains but didn't produce a chain");
2713 for (
unsigned i = 0, e = ChainNodesMatched.
size(); i != e; ++i) {
2714 SDNode *ChainNode = ChainNodesMatched[i];
2721 "Deleted node left in chain");
2725 if (ChainNode == NodeToMatch && isMorphNodeTo)
2732 SelectionDAG::DAGNodeDeletedListener NDL(
2733 *
CurDAG, [&](SDNode *
N, SDNode *
E) {
2734 llvm::replace(ChainNodesMatched,
N,
static_cast<SDNode *
>(
nullptr));
2740 if (ChainNode != NodeToMatch && ChainNode->
use_empty() &&
2746 if (!NowDeadNodes.
empty())
2747 CurDAG->RemoveDeadNodes(NowDeadNodes);
2765 unsigned int Max = 8192;
2768 if (ChainNodesMatched.
size() == 1)
2769 return ChainNodesMatched[0]->getOperand(0);
2773 std::function<void(
const SDValue)> AddChains = [&](
const SDValue V) {
2774 if (V.getValueType() != MVT::Other)
2778 if (!Visited.
insert(V.getNode()).second)
2781 for (
const SDValue &
Op : V->op_values())
2787 for (
auto *
N : ChainNodesMatched) {
2792 while (!Worklist.
empty())
2796 if (InputChains.
size() == 0)
2806 for (
auto *
N : ChainNodesMatched)
2811 if (InputChains.
size() == 1)
2812 return InputChains[0];
2814 MVT::Other, InputChains);
2818SDNode *SelectionDAGISel::
2827 int OldGlueResultNo = -1, OldChainResultNo = -1;
2829 unsigned NTMNumResults =
Node->getNumValues();
2830 if (
Node->getValueType(NTMNumResults-1) == MVT::Glue) {
2831 OldGlueResultNo = NTMNumResults-1;
2832 if (NTMNumResults != 1 &&
2833 Node->getValueType(NTMNumResults-2) == MVT::Other)
2834 OldChainResultNo = NTMNumResults-2;
2835 }
else if (
Node->getValueType(NTMNumResults-1) == MVT::Other)
2836 OldChainResultNo = NTMNumResults-1;
2840 SDNode *Res =
CurDAG->MorphNodeTo(Node, ~TargetOpc, VTList,
Ops);
2854 static_cast<unsigned>(OldGlueResultNo) != ResNumResults - 1)
2856 SDValue(Res, ResNumResults - 1));
2862 if ((EmitNodeInfo &
OPFL_Chain) && OldChainResultNo != -1 &&
2863 static_cast<unsigned>(OldChainResultNo) != ResNumResults - 1)
2865 SDValue(Res, ResNumResults - 1));
2883 unsigned RecNo = MatcherTable[MatcherIndex++];
2884 assert(RecNo < RecordedNodes.size() &&
"Invalid CheckSame");
2885 return N == RecordedNodes[RecNo].first;
2890 const unsigned char *MatcherTable,
unsigned &MatcherIndex,
SDValue N,
2893 if (ChildNo >=
N.getNumOperands())
2895 return ::CheckSame(MatcherTable, MatcherIndex,
N.getOperand(ChildNo),
2903 bool TwoBytePredNo =
2907 ? MatcherTable[MatcherIndex++]
2910 PredNo |= MatcherTable[MatcherIndex++] << 8;
2920 ? MatcherTable[MatcherIndex++]
2929 Opc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
2930 return N->getOpcode() ==
Opc;
2937 if (
N.getValueType() == VT)
2947 if (ChildNo >=
N.getNumOperands())
2949 return ::CheckType(VT,
N.getOperand(ChildNo), TLI,
DL);
2962 if (2 >=
N.getNumOperands())
2964 return ::CheckCondCode(MatcherTable, MatcherIndex,
N.getOperand(2));
2992 int64_t Val = MatcherTable[MatcherIndex++];
2994 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
2999 return C &&
C->getAPIntValue().trySExtValue() == Val;
3005 if (ChildNo >=
N.getNumOperands())
3007 return ::CheckInteger(MatcherTable, MatcherIndex,
N.getOperand(ChildNo));
3013 int64_t Val = MatcherTable[MatcherIndex++];
3015 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3017 if (
N->getOpcode() !=
ISD::AND)
return false;
3026 int64_t Val = MatcherTable[MatcherIndex++];
3028 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3030 if (
N->getOpcode() !=
ISD::OR)
return false;
3047 unsigned Opcode = Table[Index++];
3107 unsigned Res = Table[Index++];
3194 unsigned NumRecordedNodes;
3197 unsigned NumMatchedMemRefs;
3200 SDValue InputChain, InputGlue;
3203 bool HasChainNodesMatched;
3212 SDNode **NodeToMatch;
3213 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RecordedNodes;
3214 SmallVectorImpl<MatchScope> &MatchScopes;
3217 MatchStateUpdater(SelectionDAG &DAG, SDNode **NodeToMatch,
3218 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RN,
3219 SmallVectorImpl<MatchScope> &MS)
3220 : SelectionDAG::DAGUpdateListener(DAG), NodeToMatch(NodeToMatch),
3221 RecordedNodes(
RN), MatchScopes(MS) {}
3223 void NodeDeleted(SDNode *
N, SDNode *
E)
override {
3229 if (!
E ||
E->isMachineOpcode())
3232 if (
N == *NodeToMatch)
3237 for (
auto &
I : RecordedNodes)
3238 if (
I.first.getNode() ==
N)
3241 for (
auto &
I : MatchScopes)
3242 for (
auto &J :
I.NodeStack)
3243 if (J.getNode() ==
N)
3251 const unsigned char *MatcherTable,
3252 unsigned TableSize) {
3261 case ISD::HANDLENODE:
3262 case ISD::MDNODE_SDNODE:
3277 case ISD::ANNOTATION_LABEL:
3278 case ISD::LIFETIME_START:
3279 case ISD::LIFETIME_END:
3280 case ISD::PSEUDO_PROBE:
3288 CurDAG->RemoveDeadNode(NodeToMatch);
3290 case ISD::INLINEASM:
3291 case ISD::INLINEASM_BR:
3292 Select_INLINEASM(NodeToMatch);
3295 Select_READ_REGISTER(NodeToMatch);
3298 Select_WRITE_REGISTER(NodeToMatch);
3302 Select_UNDEF(NodeToMatch);
3305 Select_FAKE_USE(NodeToMatch);
3308 Select_FREEZE(NodeToMatch);
3310 case ISD::ARITH_FENCE:
3311 Select_ARITH_FENCE(NodeToMatch);
3313 case ISD::MEMBARRIER:
3314 Select_MEMBARRIER(NodeToMatch);
3317 Select_STACKMAP(NodeToMatch);
3319 case ISD::PATCHPOINT:
3320 Select_PATCHPOINT(NodeToMatch);
3322 case ISD::JUMP_TABLE_DEBUG_INFO:
3323 Select_JUMP_TABLE_DEBUG_INFO(NodeToMatch);
3325 case ISD::CONVERGENCECTRL_ANCHOR:
3326 Select_CONVERGENCECTRL_ANCHOR(NodeToMatch);
3328 case ISD::CONVERGENCECTRL_ENTRY:
3329 Select_CONVERGENCECTRL_ENTRY(NodeToMatch);
3331 case ISD::CONVERGENCECTRL_LOOP:
3332 Select_CONVERGENCECTRL_LOOP(NodeToMatch);
3359 SDValue InputChain, InputGlue;
3373 unsigned MatcherIndex = 0;
3375 if (!OpcodeOffset.empty()) {
3377 if (
N.getOpcode() < OpcodeOffset.size())
3378 MatcherIndex = OpcodeOffset[
N.getOpcode()];
3379 LLVM_DEBUG(
dbgs() <<
" Initial Opcode index to " << MatcherIndex <<
"\n");
3388 unsigned CaseSize = MatcherTable[Idx++];
3390 CaseSize =
GetVBR(CaseSize, MatcherTable, Idx);
3391 if (CaseSize == 0)
break;
3395 Opc |=
static_cast<uint16_t>(MatcherTable[Idx++]) << 8;
3396 if (
Opc >= OpcodeOffset.size())
3397 OpcodeOffset.resize((
Opc+1)*2);
3398 OpcodeOffset[
Opc] = Idx;
3403 if (
N.getOpcode() < OpcodeOffset.size())
3404 MatcherIndex = OpcodeOffset[
N.getOpcode()];
3408 assert(MatcherIndex < TableSize &&
"Invalid index");
3410 unsigned CurrentOpcodeIndex = MatcherIndex;
3424 unsigned NumToSkip = MatcherTable[MatcherIndex++];
3425 if (NumToSkip & 128)
3426 NumToSkip =
GetVBR(NumToSkip, MatcherTable, MatcherIndex);
3428 if (NumToSkip == 0) {
3433 FailIndex = MatcherIndex+NumToSkip;
3435 unsigned MatcherIndexOfPredicate = MatcherIndex;
3436 (void)MatcherIndexOfPredicate;
3443 Result, *
this, RecordedNodes);
3448 dbgs() <<
" Skipped scope entry (due to false predicate) at "
3449 <<
"index " << MatcherIndexOfPredicate <<
", continuing at "
3450 << FailIndex <<
"\n");
3451 ++NumDAGIselRetries;
3455 MatcherIndex = FailIndex;
3459 if (FailIndex == 0)
break;
3463 MatchScope NewEntry;
3464 NewEntry.FailIndex = FailIndex;
3465 NewEntry.NodeStack.append(NodeStack.
begin(), NodeStack.
end());
3466 NewEntry.NumRecordedNodes = RecordedNodes.
size();
3467 NewEntry.NumMatchedMemRefs = MatchedMemRefs.
size();
3468 NewEntry.InputChain = InputChain;
3469 NewEntry.InputGlue = InputGlue;
3470 NewEntry.HasChainNodesMatched = !ChainNodesMatched.
empty();
3476 SDNode *Parent =
nullptr;
3477 if (NodeStack.
size() > 1)
3478 Parent = NodeStack[NodeStack.
size()-2].getNode();
3479 RecordedNodes.
push_back(std::make_pair(
N, Parent));
3488 if (ChildNo >=
N.getNumOperands())
3491 RecordedNodes.
push_back(std::make_pair(
N->getOperand(ChildNo),
3497 MatchedMemRefs.
push_back(MN->getMemOperand());
3507 if (
N->getNumOperands() != 0 &&
3508 N->getOperand(
N->getNumOperands()-1).getValueType() == MVT::Glue)
3509 InputGlue =
N->getOperand(
N->getNumOperands()-1);
3513 unsigned ChildNo = MatcherTable[MatcherIndex++];
3514 if (ChildNo >=
N.getNumOperands())
3516 N =
N.getOperand(ChildNo);
3526 if (ChildNo >=
N.getNumOperands())
3528 N =
N.getOperand(ChildNo);
3544 assert(!NodeStack.
empty() &&
"Node stack imbalance!");
3545 N = NodeStack.
back();
3548 ? MatcherTable[MatcherIndex++]
3550 if (SiblingNo >=
N.getNumOperands())
3552 N =
N.getOperand(SiblingNo);
3559 assert(!NodeStack.
empty() &&
"Node stack imbalance!");
3560 N = NodeStack.
back();
3564 if (!
::CheckSame(MatcherTable, MatcherIndex,
N, RecordedNodes))
break;
3600 unsigned OpNum = MatcherTable[MatcherIndex++];
3603 for (
unsigned i = 0; i < OpNum; ++i)
3604 Operands.push_back(RecordedNodes[MatcherTable[MatcherIndex++]].first);
3606 unsigned PredNo = MatcherTable[MatcherIndex++];
3621 ? MatcherTable[MatcherIndex++]
3623 unsigned RecNo = MatcherTable[MatcherIndex++];
3624 assert(RecNo < RecordedNodes.
size() &&
"Invalid CheckComplexPat");
3628 std::unique_ptr<MatchStateUpdater> MSU;
3630 MSU.reset(
new MatchStateUpdater(*
CurDAG, &NodeToMatch, RecordedNodes,
3634 RecordedNodes[RecNo].first, CPNum,
3640 if (!
::CheckOpcode(MatcherTable, MatcherIndex,
N.getNode()))
break;
3663 unsigned Res = MatcherTable[MatcherIndex++];
3671 unsigned CurNodeOpcode =
N.getOpcode();
3672 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3676 CaseSize = MatcherTable[MatcherIndex++];
3678 CaseSize =
GetVBR(CaseSize, MatcherTable, MatcherIndex);
3679 if (CaseSize == 0)
break;
3682 Opc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
3685 if (CurNodeOpcode ==
Opc)
3689 MatcherIndex += CaseSize;
3693 if (CaseSize == 0)
break;
3696 LLVM_DEBUG(
dbgs() <<
" OpcodeSwitch from " << SwitchStart <<
" to "
3697 << MatcherIndex <<
"\n");
3702 MVT CurNodeVT =
N.getSimpleValueType();
3703 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3707 CaseSize = MatcherTable[MatcherIndex++];
3709 CaseSize =
GetVBR(CaseSize, MatcherTable, MatcherIndex);
3710 if (CaseSize == 0)
break;
3713 if (CaseVT == MVT::iPTR)
3714 CaseVT =
TLI->getPointerTy(
CurDAG->getDataLayout());
3717 if (CurNodeVT == CaseVT)
3721 MatcherIndex += CaseSize;
3725 if (CaseSize == 0)
break;
3729 <<
"] from " << SwitchStart <<
" to " << MatcherIndex
3783 CurDAG->getDataLayout()))
3799 if (!
::CheckOrImm(MatcherTable, MatcherIndex,
N, *
this))
break;
3811 assert(NodeStack.
size() != 1 &&
"No parent node");
3814 bool HasMultipleUses =
false;
3815 for (
unsigned i = 1, e = NodeStack.
size()-1; i != e; ++i) {
3816 unsigned NNonChainUses = 0;
3817 SDNode *NS = NodeStack[i].getNode();
3819 if (U.getValueType() != MVT::Other)
3820 if (++NNonChainUses > 1) {
3821 HasMultipleUses =
true;
3824 if (HasMultipleUses)
break;
3826 if (HasMultipleUses)
break;
3865 int64_t Val = MatcherTable[MatcherIndex++];
3867 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3870 RecordedNodes.
push_back(std::pair<SDValue, SDNode *>(
3871 CurDAG->getSignedConstant(Val,
SDLoc(NodeToMatch), VT,
3891 unsigned RegNo = MatcherTable[MatcherIndex++];
3892 RecordedNodes.
push_back(std::pair<SDValue, SDNode *>(
3893 CurDAG->getRegister(RegNo, VT),
nullptr));
3901 unsigned RegNo = MatcherTable[MatcherIndex++];
3902 RegNo |= MatcherTable[MatcherIndex++] << 8;
3903 RecordedNodes.
push_back(std::pair<SDValue, SDNode*>(
3904 CurDAG->getRegister(RegNo, VT),
nullptr));
3919 ? MatcherTable[MatcherIndex++]
3921 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitConvertToTarget");
3922 SDValue Imm = RecordedNodes[RecNo].first;
3926 Imm =
CurDAG->getTargetConstant(*Val,
SDLoc(NodeToMatch),
3927 Imm.getValueType());
3930 Imm =
CurDAG->getTargetConstantFP(*Val,
SDLoc(NodeToMatch),
3931 Imm.getValueType());
3934 RecordedNodes.
push_back(std::make_pair(Imm, RecordedNodes[RecNo].second));
3943 "EmitMergeInputChains should be the first chain producing node");
3945 "Should only have one EmitMergeInputChains per match");
3949 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitMergeInputChains");
3950 ChainNodesMatched.
push_back(RecordedNodes[RecNo].first.getNode());
3956 if (ChainNodesMatched.
back() != NodeToMatch &&
3957 !RecordedNodes[RecNo].first.hasOneUse()) {
3958 ChainNodesMatched.
clear();
3972 "EmitMergeInputChains should be the first chain producing node");
3979 unsigned NumChains = MatcherTable[MatcherIndex++];
3980 assert(NumChains != 0 &&
"Can't TF zero chains");
3983 "Should only have one EmitMergeInputChains per match");
3986 for (
unsigned i = 0; i != NumChains; ++i) {
3987 unsigned RecNo = MatcherTable[MatcherIndex++];
3988 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitMergeInputChains");
3989 ChainNodesMatched.
push_back(RecordedNodes[RecNo].first.getNode());
3995 if (ChainNodesMatched.
back() != NodeToMatch &&
3996 !RecordedNodes[RecNo].first.hasOneUse()) {
3997 ChainNodesMatched.
clear();
4003 if (ChainNodesMatched.
empty())
4028 : MatcherTable[MatcherIndex++];
4029 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitCopyToReg");
4030 unsigned DestPhysReg = MatcherTable[MatcherIndex++];
4032 DestPhysReg |= MatcherTable[MatcherIndex++] << 8;
4035 InputChain =
CurDAG->getEntryNode();
4037 InputChain =
CurDAG->getCopyToReg(InputChain,
SDLoc(NodeToMatch),
4038 DestPhysReg, RecordedNodes[RecNo].first,
4041 InputGlue = InputChain.
getValue(1);
4046 unsigned XFormNo = MatcherTable[MatcherIndex++];
4047 unsigned RecNo = MatcherTable[MatcherIndex++];
4048 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitNodeXForm");
4050 RecordedNodes.
push_back(std::pair<SDValue,SDNode*>(Res,
nullptr));
4056 unsigned index = MatcherTable[MatcherIndex++];
4057 index |= (MatcherTable[MatcherIndex++] << 8);
4058 index |= (MatcherTable[MatcherIndex++] << 16);
4059 index |= (MatcherTable[MatcherIndex++] << 24);
4091 uint16_t TargetOpc = MatcherTable[MatcherIndex++];
4092 TargetOpc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
4093 unsigned EmitNodeInfo;
4112 EmitNodeInfo = MatcherTable[MatcherIndex++];
4137 NumVTs = MatcherTable[MatcherIndex++];
4139 for (
unsigned i = 0; i != NumVTs; ++i) {
4141 if (VT == MVT::iPTR)
4142 VT =
TLI->getPointerTy(
CurDAG->getDataLayout()).SimpleTy;
4154 if (VTs.
size() == 1)
4155 VTList =
CurDAG->getVTList(VTs[0]);
4156 else if (VTs.
size() == 2)
4157 VTList =
CurDAG->getVTList(VTs[0], VTs[1]);
4159 VTList =
CurDAG->getVTList(VTs);
4162 unsigned NumOps = MatcherTable[MatcherIndex++];
4164 for (
unsigned i = 0; i !=
NumOps; ++i) {
4165 unsigned RecNo = MatcherTable[MatcherIndex++];
4167 RecNo =
GetVBR(RecNo, MatcherTable, MatcherIndex);
4169 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitNode");
4170 Ops.push_back(RecordedNodes[RecNo].first);
4177 FirstOpToCopy += (EmitNodeInfo &
OPFL_Chain) ? 1 : 0;
4179 "Invalid variadic node");
4182 for (
unsigned i = FirstOpToCopy, e = NodeToMatch->
getNumOperands();
4185 if (V.getValueType() == MVT::Glue)
break;
4192 Ops.push_back(InputChain);
4194 Ops.push_back(InputGlue);
4200 bool MayRaiseFPException =
4207 bool IsMorphNodeTo =
4210 if (!IsMorphNodeTo) {
4213 Res =
CurDAG->getMachineNode(TargetOpc,
SDLoc(NodeToMatch),
4217 for (
unsigned i = 0, e = VTs.
size(); i != e; ++i) {
4218 if (VTs[i] == MVT::Other || VTs[i] == MVT::Glue)
break;
4224 "NodeToMatch was removed partway through selection");
4228 auto &Chain = ChainNodesMatched;
4230 "Chain node replaced during MorphNode");
4234 Ops, EmitNodeInfo));
4261 bool mayLoad =
MCID.mayLoad();
4262 bool mayStore =
MCID.mayStore();
4268 if (MMO->isLoad()) {
4271 }
else if (MMO->isStore()) {
4279 CurDAG->setNodeMemRefs(Res, FilteredMemRefs);
4283 if (!MatchedMemRefs.
empty() && Res->memoperands_empty())
4284 dbgs() <<
" Dropping mem operands\n";
4285 dbgs() <<
" " << (IsMorphNodeTo ?
"Morphed" :
"Created") <<
" node: ";
4290 if (IsMorphNodeTo) {
4292 UpdateChains(Res, InputChain, ChainNodesMatched,
true);
4302 unsigned NumResults = MatcherTable[MatcherIndex++];
4304 for (
unsigned i = 0; i != NumResults; ++i) {
4305 unsigned ResSlot = MatcherTable[MatcherIndex++];
4307 ResSlot =
GetVBR(ResSlot, MatcherTable, MatcherIndex);
4309 assert(ResSlot < RecordedNodes.
size() &&
"Invalid CompleteMatch");
4310 SDValue Res = RecordedNodes[ResSlot].first;
4312 assert(i < NodeToMatch->getNumValues() &&
4315 "Invalid number of results to complete!");
4321 "invalid replacement");
4326 UpdateChains(NodeToMatch, InputChain, ChainNodesMatched,
false);
4339 "Didn't replace all uses of the node?");
4340 CurDAG->RemoveDeadNode(NodeToMatch);
4349 LLVM_DEBUG(
dbgs() <<
" Match failed at index " << CurrentOpcodeIndex
4351 ++NumDAGIselRetries;
4353 if (MatchScopes.
empty()) {
4354 CannotYetSelect(NodeToMatch);
4360 MatchScope &LastScope = MatchScopes.
back();
4361 RecordedNodes.
resize(LastScope.NumRecordedNodes);
4363 NodeStack.
append(LastScope.NodeStack.begin(), LastScope.NodeStack.end());
4364 N = NodeStack.
back();
4366 if (LastScope.NumMatchedMemRefs != MatchedMemRefs.
size())
4367 MatchedMemRefs.
resize(LastScope.NumMatchedMemRefs);
4368 MatcherIndex = LastScope.FailIndex;
4372 InputChain = LastScope.InputChain;
4373 InputGlue = LastScope.InputGlue;
4374 if (!LastScope.HasChainNodesMatched)
4375 ChainNodesMatched.
clear();
4380 unsigned NumToSkip = MatcherTable[MatcherIndex++];
4381 if (NumToSkip & 128)
4382 NumToSkip =
GetVBR(NumToSkip, MatcherTable, MatcherIndex);
4386 if (NumToSkip != 0) {
4387 LastScope.FailIndex = MatcherIndex+NumToSkip;
4401 if (
N->isMachineOpcode()) {
4403 return MCID.mayRaiseFPException();
4408 if (
N->isTargetOpcode()) {
4412 return N->isStrictFPOpcode();
4425 int32_t Off =
C->getSExtValue();
4428 return (Off >= 0) && (((
A.value() - 1) & Off) ==
unsigned(Off));
4433void SelectionDAGISel::CannotYetSelect(
SDNode *
N) {
4436 Msg <<
"Cannot select: ";
4438 Msg.enable_colors(
errs().has_colors());
4444 Msg <<
"\nIn function: " <<
MF->
getName();
4446 bool HasInputChain =
N->getOperand(0).getValueType() == MVT::Other;
4447 unsigned iid =
N->getConstantOperandVal(HasInputChain);
4448 if (iid < Intrinsic::num_intrinsics)
4451 Msg <<
"unknown intrinsic #" << iid;
unsigned const MachineRegisterInfo * MRI
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
MachineInstrBuilder & UseMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_ATTRIBUTE_ALWAYS_INLINE
LLVM_ATTRIBUTE_ALWAYS_INLINE - On compilers where we have a directive to do so, mark a method "always...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file defines the FastISel class.
Module.h This file contains the declarations for the Module class.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
mir Rename Register Operands
Machine Instruction Scheduler
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckValueType(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const TargetLowering *TLI, const DataLayout &DL)
static cl::opt< bool > ViewSUnitDAGs("view-sunit-dags", cl::Hidden, cl::desc("Pop up a window to show SUnit dags after they are processed"))
static cl::opt< bool > ViewDAGCombineLT("view-dag-combine-lt-dags", cl::Hidden, cl::desc("Pop up a window to show dags before the post " "legalize types dag combine pass"))
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckPatternPredicate(unsigned Opcode, const unsigned char *MatcherTable, unsigned &MatcherIndex, const SelectionDAGISel &SDISel)
CheckPatternPredicate - Implements OP_CheckPatternPredicate.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildSame(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes, unsigned ChildNo)
CheckChildSame - Implements OP_CheckChildXSame.
static uint64_t decodeSignRotatedValue(uint64_t V)
Decode a signed value stored with the sign bit in the LSB for dense VBR encoding.
static cl::opt< bool > ViewISelDAGs("view-isel-dags", cl::Hidden, cl::desc("Pop up a window to show isel dags as they are selected"))
static LLVM_ATTRIBUTE_ALWAYS_INLINE uint64_t GetVBR(uint64_t Val, const unsigned char *MatcherTable, unsigned &Idx)
GetVBR - decode a vbr encoding whose top bit is set.
static void reportFastISelFailure(MachineFunction &MF, OptimizationRemarkEmitter &ORE, OptimizationRemarkMissed &R, bool ShouldAbort)
static cl::opt< bool > ViewDAGCombine2("view-dag-combine2-dags", cl::Hidden, cl::desc("Pop up a window to show dags before the second " "dag combine pass"))
static RegisterScheduler defaultListDAGScheduler("default", "Best scheduler for the target", createDefaultScheduler)
static unsigned IsPredicateKnownToFail(const unsigned char *Table, unsigned Index, SDValue N, bool &Result, const SelectionDAGISel &SDISel, SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes)
IsPredicateKnownToFail - If we know how and can do so without pushing a scope, evaluate the current n...
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckNodePredicate(unsigned Opcode, const unsigned char *MatcherTable, unsigned &MatcherIndex, const SelectionDAGISel &SDISel, SDValue Op)
CheckNodePredicate - Implements OP_CheckNodePredicate.
static cl::opt< int > EnableFastISelAbort("fast-isel-abort", cl::Hidden, cl::desc("Enable abort calls when \"fast\" instruction selection " "fails to lower an instruction: 0 disable the abort, 1 will " "abort but for args, calls and terminators, 2 will also " "abort for argument lowering, and 3 will never fallback " "to SelectionDAG."))
static void mapWasmLandingPadIndex(MachineBasicBlock *MBB, const CatchPadInst *CPI)
static void processSingleLocVars(FunctionLoweringInfo &FuncInfo, FunctionVarLocs const *FnVarLocs)
Collect single location variable information generated with assignment tracking.
static LLVM_ATTRIBUTE_ALWAYS_INLINE MVT::SimpleValueType getSimpleVT(const unsigned char *MatcherTable, unsigned &MatcherIndex)
getSimpleVT - Decode a value in MatcherTable, if it's a VBR encoded value, use GetVBR to decode it.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckInteger(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckAndImm(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SelectionDAGISel &SDISel)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckOrImm(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SelectionDAGISel &SDISel)
static cl::opt< bool > UseMBPI("use-mbpi", cl::desc("use Machine Branch Probability Info"), cl::init(true), cl::Hidden)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildType(MVT::SimpleValueType VT, SDValue N, const TargetLowering *TLI, const DataLayout &DL, unsigned ChildNo)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckSame(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, const SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes)
CheckSame - Implements OP_CheckSame.
static bool dontUseFastISelFor(const Function &Fn)
static bool findNonImmUse(SDNode *Root, SDNode *Def, SDNode *ImmedUse, bool IgnoreChains)
findNonImmUse - Return true if "Def" is a predecessor of "Root" via a path beyond "ImmedUse".
static cl::opt< bool > ViewDAGCombine1("view-dag-combine1-dags", cl::Hidden, cl::desc("Pop up a window to show dags before the first " "dag combine pass"))
static bool processIfEntryValueDbgDeclare(FunctionLoweringInfo &FuncInfo, const Value *Arg, DIExpression *Expr, DILocalVariable *Var, DebugLoc DbgLoc)
static cl::opt< bool > ViewSchedDAGs("view-sched-dags", cl::Hidden, cl::desc("Pop up a window to show sched dags as they are processed"))
static void processDbgDeclares(FunctionLoweringInfo &FuncInfo)
Collect llvm.dbg.declare information.
static void preserveFakeUses(BasicBlock::iterator Begin, BasicBlock::iterator End)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckType(MVT::SimpleValueType VT, SDValue N, const TargetLowering *TLI, const DataLayout &DL)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckCondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N)
static bool hasExceptionPointerOrCodeUser(const CatchPadInst *CPI)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChild2CondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N)
static cl::opt< bool > ViewLegalizeDAGs("view-legalize-dags", cl::Hidden, cl::desc("Pop up a window to show dags before legalize"))
static cl::opt< bool > ViewLegalizeTypesDAGs("view-legalize-types-dags", cl::Hidden, cl::desc("Pop up a window to show dags before legalize types"))
static cl::opt< RegisterScheduler::FunctionPassCtor, false, RegisterPassParser< RegisterScheduler > > ISHeuristic("pre-RA-sched", cl::init(&createDefaultScheduler), cl::Hidden, cl::desc("Instruction schedulers available (before register" " allocation):"))
ISHeuristic command line option for instruction schedulers.
static cl::opt< bool > EnableFastISelFallbackReport("fast-isel-report-on-fallback", cl::Hidden, cl::desc("Emit a diagnostic when \"fast\" instruction selection " "falls back to SelectionDAG."))
static bool processDbgDeclare(FunctionLoweringInfo &FuncInfo, const Value *Address, DIExpression *Expr, DILocalVariable *Var, DebugLoc DbgLoc)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckOpcode(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDNode *N)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildInteger(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, unsigned ChildNo)
static cl::opt< std::string > FilterDAGBasicBlockName("filter-view-dags", cl::Hidden, cl::desc("Only display the basic block whose name " "matches this for all view-*-dags options"))
static SDValue HandleMergeInputChains(SmallVectorImpl< SDNode * > &ChainNodesMatched, SelectionDAG *CurDAG)
HandleMergeInputChains - This implements the OPC_EmitMergeInputChains operation for when the pattern ...
static bool isFoldedOrDeadInstruction(const Instruction *I, const FunctionLoweringInfo &FuncInfo)
isFoldedOrDeadInstruction - Return true if the specified instruction is side-effect free and is eithe...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This file describes how to lower LLVM code to machine code.
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
AAResults & getAAResults()
Class for arbitrary precision integers.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
LLVM Basic Block Representation.
unsigned getNumber() const
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
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
InstListType::iterator iterator
Instruction iterators...
bool isEHPad() const
Return true if this basic block is an exception handling block.
LLVM_ABI const Instruction * getFirstMayFaultInst() const
Returns the first potential AsynchEH faulty instruction currently it checks for loads/stores (which m...
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis pass which computes BranchProbabilityInfo.
Legacy analysis pass which computes BranchProbabilityInfo.
This class represents a function call, abstracting a target machine's calling convention.
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
A parsed version of the target data layout string in and methods for querying it.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
iterator find(const_arg_type_t< KeyT > Val)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Diagnostic information for ISel fallback path.
void setLastLocalValue(MachineInstr *I)
Update the position of the last instruction emitted for materializing constants for use in the curren...
void handleDbgInfo(const Instruction *II)
Target-independent lowering of non-instruction debug info associated with this instruction.
bool tryToFoldLoad(const LoadInst *LI, const Instruction *FoldInst)
We're checking to see if we can fold LI into FoldInst.
void removeDeadCode(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
Remove all dead instructions between the I and E.
void startNewBlock()
Set the current block to which generated machine instructions will be appended.
bool selectInstruction(const Instruction *I)
Do "fast" instruction selection for the given LLVM IR instruction and append the generated machine in...
void finishBasicBlock()
Flush the local value map.
void recomputeInsertPt()
Reset InsertPt to prepare for inserting instructions into the current block.
bool lowerArguments()
Do "fast" instruction selection for function arguments and append the machine instructions to the cur...
unsigned arg_size() const
arg_size - Return the number of funcletpad arguments.
Value * getArgOperand(unsigned i) const
getArgOperand/setArgOperand - Return/set the i-th funcletpad argument.
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
SmallPtrSet< const DbgVariableRecord *, 8 > PreprocessedDVRDeclares
Collection of dbg_declare instructions handled after argument lowering and before ISel proper.
DenseMap< const AllocaInst *, int > StaticAllocaMap
StaticAllocaMap - Keep track of frame indices for fixed sized allocas in the entry block.
int getArgumentFrameIndex(const Argument *A)
getArgumentFrameIndex - Get frame index for the byval argument.
bool isExportedInst(const Value *V) const
isExportedInst - Return true if the specified value is an instruction exported from its block.
DenseMap< const Value *, Register > ValueMap
ValueMap - Since we emit code for the function a basic block at a time, we must remember which virtua...
MachineRegisterInfo * RegInfo
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
Data structure describing the variable locations in a function.
const VarLocInfo * single_locs_begin() const
DILocalVariable * getDILocalVariable(const VarLocInfo *Loc) const
Return the DILocalVariable for the location definition represented by ID.
const VarLocInfo * single_locs_end() const
One past the last single-location variable location definition.
const BasicBlock & getEntryBlock() const
FunctionType * getFunctionType() const
Returns the FunctionType for me.
unsigned getMaxBlockNumber() const
Return a value larger than the largest block number.
iterator_range< arg_iterator > args()
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
bool hasGC() const
hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm to use during code generatio...
bool hasOptNone() const
Do not optimize this function (-O0).
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
An analysis pass which caches information about the Function.
An analysis pass which caches information about the entire Module.
Module * getParent()
Get the module that this global value is contained inside of...
This class is used to form a handle around another node that is persistent and is updated across invo...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
bool isTerminator() const
A wrapper class for inspecting calls to intrinsic functions.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
This is an alternative analysis pass to BlockFrequencyInfoWrapperPass.
static void getLazyBFIAnalysisUsage(AnalysisUsage &AU)
Helper for client passes to set up the analysis usage on behalf of this pass.
Describe properties that are true of each instruction in the target description file.
const MDNode * getMD() const
const MDOperand & getOperand(unsigned I) const
LLVM_ABI StringRef getString() const
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
instr_iterator instr_end()
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator insertAfter(iterator I, MachineInstr *MI)
Insert MI into the instruction list after I.
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasCalls() const
Return true if the current function has any function calls.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
void setWasmLandingPadIndex(const MachineBasicBlock *LPad, unsigned Index)
Map the landing pad to its index. Used for Wasm exception handling.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void setUseDebugInstrRef(bool UseInstrRef)
Set whether this function will use instruction referencing or not.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Function & getFunction()
Return the LLVM function that this machine code represents.
bool shouldUseDebugInstrRef() const
Determine whether, in the current machine configuration, we should use instruction referencing or not...
const MachineFunctionProperties & getProperties() const
Get the function properties.
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, int Slot, const DILocation *Loc)
Collect information used to emit debugging information of a variable in a stack slot.
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
An analysis that produces MachineModuleInfo for a module.
This class contains meta information specific to a module.
Register getReg() const
getReg - Returns the register number.
MachinePassRegistry - Track the registration of machine passes.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
ArrayRef< std::pair< MCRegister, Register > > liveins() const
An SDNode that represents everything that will be needed to construct a MachineInstr.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
This class is used by SelectionDAGISel to temporarily override the optimization level on a per-functi...
OptLevelChanger(SelectionDAGISel &ISel, CodeGenOptLevel NewOptLevel)
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
RegisterPassParser class - Handle the addition of new machine passes.
ScheduleDAGSDNodes *(*)(SelectionDAGISel *, CodeGenOptLevel) FunctionPassCtor
static LLVM_ABI MachinePassRegistry< FunctionPassCtor > Registry
RegisterScheduler class - Track the registration of instruction schedulers.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
SDNode * getGluedUser() const
If this node has a glue value with a user, return the user (there is at most one).
LLVM_ABI bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
iterator_range< use_iterator > uses()
void setNodeId(int Id)
Set unique node id.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Represents a use of a SDNode.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
SelectionDAGISelLegacy(char &ID, std::unique_ptr< SelectionDAGISel > S)
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
std::optional< BatchAAResults > BatchAA
std::unique_ptr< FunctionLoweringInfo > FuncInfo
SmallPtrSet< const Instruction *, 4 > ElidedArgCopyInstrs
virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, InlineAsm::ConstraintCode ConstraintID, std::vector< SDValue > &OutOps)
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckOrMask - The isel is trying to match something like (or X, 255).
void initializeAnalysisResults(MachineFunctionAnalysisManager &MFAM)
virtual bool CheckNodePredicate(SDValue Op, unsigned PredNo) const
CheckNodePredicate - This function is generated by tblgen in the target.
virtual bool CheckNodePredicateWithOperands(SDValue Op, unsigned PredNo, ArrayRef< SDValue > Operands) const
CheckNodePredicateWithOperands - This function is generated by tblgen in the target.
const TargetLowering * TLI
virtual void PostprocessISelDAG()
PostprocessISelDAG() - This hook allows the target to hack on the graph right after selection.
std::unique_ptr< OptimizationRemarkEmitter > ORE
Current optimization remark emitter.
MachineRegisterInfo * RegInfo
unsigned DAGSize
DAGSize - Size of DAG being instruction selected.
@ OPC_MorphNodeTo2GlueOutput
@ OPC_CheckPatternPredicate5
@ OPC_EmitCopyToRegTwoByte
@ OPC_MorphNodeTo2GlueInput
@ OPC_CheckChild2CondCode
@ OPC_CheckPatternPredicateTwoByte
@ OPC_CheckPatternPredicate1
@ OPC_MorphNodeTo1GlueOutput
@ OPC_EmitMergeInputChains1_1
@ OPC_CheckPatternPredicate2
@ OPC_EmitConvertToTarget2
@ OPC_EmitConvertToTarget0
@ OPC_CheckPatternPredicate4
@ OPC_EmitConvertToTarget1
@ OPC_CheckPatternPredicate
@ OPC_MorphNodeTo0GlueInput
@ OPC_CheckPatternPredicate6
@ OPC_MorphNodeTo0GlueOutput
@ OPC_CheckPatternPredicate7
@ OPC_EmitMergeInputChains
@ OPC_EmitMergeInputChains1_0
@ OPC_CheckFoldableChainNode
@ OPC_EmitConvertToTarget3
@ OPC_CheckPredicateWithOperands
@ OPC_EmitConvertToTarget4
@ OPC_EmitStringInteger32
@ OPC_EmitConvertToTarget7
@ OPC_EmitMergeInputChains1_2
@ OPC_EmitConvertToTarget5
@ OPC_CheckPatternPredicate0
@ OPC_MorphNodeTo1GlueInput
@ OPC_CheckPatternPredicate3
@ OPC_EmitConvertToTarget
@ OPC_EmitConvertToTarget6
bool isOrEquivalentToAdd(const SDNode *N) const
virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N, unsigned PatternNo, SmallVectorImpl< std::pair< SDValue, SDNode * > > &Result)
virtual bool CheckPatternPredicate(unsigned PredNo) const
CheckPatternPredicate - This function is generated by tblgen in the target.
static int getNumFixedFromVariadicInfo(unsigned Flags)
getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the number of fixed arity values ...
const TargetLibraryInfo * LibInfo
static int getUninvalidatedNodeId(SDNode *N)
const TargetInstrInfo * TII
std::unique_ptr< SwiftErrorValueTracking > SwiftError
void SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, unsigned TableSize)
static void EnforceNodeIdInvariant(SDNode *N)
void ReplaceUses(SDValue F, SDValue T)
ReplaceUses - replace all uses of the old node F with the use of the new node T.
virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const
IsProfitableToFold - Returns true if it's profitable to fold the specific operand node N of U during ...
virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo)
bool MatchFilterFuncName
True if the function currently processing is in the function printing list (i.e.
void SelectInlineAsmMemoryOperands(std::vector< SDValue > &Ops, const SDLoc &DL)
SelectInlineAsmMemoryOperands - Calls to this are automatically generated by tblgen.
static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root, CodeGenOptLevel OptLevel, bool IgnoreChains=false)
IsLegalToFold - Returns true if the specific operand node N of U can be folded during instruction sel...
virtual bool ComplexPatternFuncMutatesDAG() const
Return true if complex patterns for this target can mutate the DAG.
virtual void PreprocessISelDAG()
PreprocessISelDAG - This hook allows targets to hack on the graph before instruction selection starts...
BatchAAResults * getBatchAA() const
Returns a (possibly null) pointer to the current BatchAAResults.
bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS, int64_t DesiredMaskS) const
CheckAndMask - The isel is trying to match something like (and X, 255).
virtual ~SelectionDAGISel()
virtual StringRef getPatternForIndex(unsigned index)
getPatternForIndex - Patterns selected by tablegen during ISEL
bool mayRaiseFPException(SDNode *Node) const
Return whether the node may raise an FP exception.
std::unique_ptr< SelectionDAGBuilder > SDB
void ReplaceNode(SDNode *F, SDNode *T)
Replace all uses of F with T, then remove F from the DAG.
SelectionDAGISel(TargetMachine &tm, CodeGenOptLevel OL=CodeGenOptLevel::Default)
virtual bool runOnMachineFunction(MachineFunction &mf)
static void InvalidateNodeId(SDNode *N)
virtual StringRef getIncludePathForIndex(unsigned index)
getIncludePathForIndex - get the td source location of pattern instantiation
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
virtual bool mayRaiseFPException(unsigned Opcode) const
Returns true if a node with the given target-specific opcode may raise a floating-point exception.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
allnodes_const_iterator allnodes_begin() const
const DataLayout & getDataLayout() const
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
ilist< SDNode >::iterator allnodes_iterator
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 append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Sched::Preference getSchedulingPreference() const
Return target scheduling preference.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
Primary interface to the complete machine description for the target machine.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool isTokenTy() const
Return true if this is 'token'.
bool isVoidTy() const
Return true if this is 'void'.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
iterator_range< user_iterator > users()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
self_iterator getIterator()
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
@ POISON
POISON - A poison node.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
@ UNDEF
UNDEF - An undefined node.
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
@ BasicBlock
Various leaf nodes.
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
@ STRICT_SINT_TO_FP
STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to a floating point value.
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
@ AND
Bitwise operators - logical and, logical or, logical xor.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI StringRef getBaseName(ID id)
Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....
@ Kill
The last use of a register.
initializer< Ty > init(const Ty &Val)
DiagnosticInfoOptimizationBase::Argument NV
NodeAddr< NodeBase * > Node
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
LLVM_ABI ScheduleDAGSDNodes * createDefaultScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createDefaultScheduler - This creates an instruction scheduler appropriate for the target.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
bool succ_empty(const Instruction *I)
LLVM_ABI ScheduleDAGSDNodes * createBURRListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createBURRListDAGScheduler - This creates a bottom up register usage reduction list scheduler.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI ScheduleDAGSDNodes * createHybridListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel)
createHybridListDAGScheduler - This creates a bottom up register pressure aware list scheduler that m...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
MachineBasicBlock::iterator findSplitPointForStackProtector(MachineBasicBlock *BB, const TargetInstrInfo &TII)
Find the split point at which to splice the end of BB into its success stack protector check machine ...
LLVM_ABI bool TimePassesIsEnabled
If the user specifies the -time-passes argument on an LLVM tool command line then the value of this b...
LLVM_ABI LLT getLLTForMVT(MVT Ty)
Get a rough equivalent of an LLT for a given MVT.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI void initializeGCModuleInfoPass(PassRegistry &)
LLVM_ABI ScheduleDAGSDNodes * createFastDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createFastDAGScheduler - This creates a "fast" scheduler.
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
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 ScheduleDAGSDNodes * createDAGLinearizer(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createDAGLinearizer - This creates a "no-scheduling" scheduler which linearize the DAG using topologi...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool isFunctionInPrintList(StringRef FunctionName)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
CodeGenOptLevel
Code generation optimization level.
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 raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
LLVM_ABI ScheduleDAGSDNodes * createSourceListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createSourceListDAGScheduler - This creates a bottom up list scheduler that schedules nodes in source...
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
DWARFExpression::Operation Op
LLVM_ABI void initializeAAResultsWrapperPassPass(PassRegistry &)
LLVM_ABI void initializeTargetLibraryInfoWrapperPassPass(PassRegistry &)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI ScheduleDAGSDNodes * createILPListDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel)
createILPListDAGScheduler - This creates a bottom up register pressure aware list scheduler that trie...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
LLVM_ABI void initializeBranchProbabilityInfoWrapperPassPass(PassRegistry &)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI ScheduleDAGSDNodes * createVLIWDAGScheduler(SelectionDAGISel *IS, CodeGenOptLevel OptLevel)
createVLIWDAGScheduler - Scheduler for VLIW targets.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
bool isInteger() const
Return true if this is an integer or a vector integer type.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, MCSymbol *InvokeEnd)
DenseMap< const BasicBlock *, int > BlockToStateMap