80#include "llvm/IR/IntrinsicsWebAssembly.h"
117#define DEBUG_TYPE "isel"
118#define ISEL_DUMP_DEBUG_TYPE DEBUG_TYPE "-dump"
120STATISTIC(NumFastIselFailures,
"Number of instructions fast isel failed on");
121STATISTIC(NumFastIselSuccess,
"Number of instructions fast isel selected");
122STATISTIC(NumFastIselBlocks,
"Number of blocks selected entirely by fast isel");
123STATISTIC(NumDAGBlocks,
"Number of blocks selected using DAG");
124STATISTIC(NumDAGIselRetries,
"Number of times dag isel has to try another path");
125STATISTIC(NumEntryBlocks,
"Number of entry blocks encountered");
127 "Number of entry blocks where fast isel failed to lower arguments");
131 cl::desc(
"Enable abort calls when \"fast\" instruction selection "
132 "fails to lower an instruction: 0 disable the abort, 1 will "
133 "abort but for args, calls and terminators, 2 will also "
134 "abort for argument lowering, and 3 will never fallback "
135 "to SelectionDAG."));
139 cl::desc(
"Emit a diagnostic when \"fast\" instruction selection "
140 "falls back to SelectionDAG."));
144 cl::desc(
"use Machine Branch Probability Info"),
150 cl::desc(
"Print DAGs with sorted nodes in debug dump"),
155 cl::desc(
"Only display the basic block whose name "
156 "matches this for all view-*-dags options"));
159 cl::desc(
"Pop up a window to show dags before the first "
160 "dag combine pass"));
163 cl::desc(
"Pop up a window to show dags before legalize types"));
166 cl::desc(
"Pop up a window to show dags before the post "
167 "legalize types dag combine pass"));
170 cl::desc(
"Pop up a window to show dags before legalize"));
173 cl::desc(
"Pop up a window to show dags before the second "
174 "dag combine pass"));
177 cl::desc(
"Pop up a window to show isel dags as they are selected"));
180 cl::desc(
"Pop up a window to show sched dags as they are processed"));
183 cl::desc(
"Pop up a window to show SUnit dags after they are processed"));
192#define ISEL_DUMP(X) \
194 if (llvm::DebugFlag && \
195 (isCurrentDebugType(DEBUG_TYPE) || \
196 (isCurrentDebugType(ISEL_DUMP_DEBUG_TYPE) && MatchFilterFuncName))) { \
201#define ISEL_DUMP(X) do { } while (false)
221 cl::desc(
"Instruction schedulers available (before register"
234 return Arg.hasAttribute(Attribute::AttrKind::SwiftAsync);
264 SavedOptLevel = IS.OptLevel;
265 SavedFastISel = IS.TM.Options.EnableFastISel;
266 if (NewOptLevel != SavedOptLevel) {
267 IS.OptLevel = NewOptLevel;
268 IS.TM.setOptLevel(NewOptLevel);
269 LLVM_DEBUG(
dbgs() <<
"\nChanging optimization level for Function "
270 << IS.MF->getFunction().getName() <<
"\n");
271 LLVM_DEBUG(
dbgs() <<
"\tBefore: -O" <<
static_cast<int>(SavedOptLevel)
272 <<
" ; After: -O" <<
static_cast<int>(NewOptLevel)
275 IS.TM.setFastISel(IS.TM.getO0WantsFastISel());
278 IS.TM.setFastISel(
false);
280 dbgs() <<
"\tFastISel is "
281 << (IS.TM.Options.EnableFastISel ?
"enabled" :
"disabled")
286 if (IS.OptLevel == SavedOptLevel)
288 LLVM_DEBUG(
dbgs() <<
"\nRestoring optimization level for Function "
289 << IS.MF->getFunction().getName() <<
"\n");
290 LLVM_DEBUG(
dbgs() <<
"\tBefore: -O" <<
static_cast<int>(IS.OptLevel)
291 <<
" ; After: -O" <<
static_cast<int>(SavedOptLevel) <<
"\n");
292 IS.OptLevel = SavedOptLevel;
293 IS.TM.setOptLevel(SavedOptLevel);
294 IS.TM.setFastISel(SavedFastISel);
307 if (
auto *SchedulerCtor = ST.getDAGScheduler(OptLevel)) {
308 return SchedulerCtor(IS, OptLevel);
312 (ST.enableMachineScheduler() && ST.enableMachineSchedDefaultSched()) ||
326 "Unknown sched type!");
335 switch (
MI.getOpcode()) {
336 case TargetOpcode::STATEPOINT:
339 case TargetOpcode::STACKMAP:
340 case TargetOpcode::PATCHPOINT:
347 dbgs() <<
"If a target marks an instruction with "
348 "'usesCustomInserter', it must implement "
349 "TargetLowering::EmitInstrWithCustomInserter!\n";
357 "If a target marks an instruction with 'hasPostISelHook', "
358 "it must implement TargetLowering::AdjustInstrPostInstrSelection!");
366 char &
ID, std::unique_ptr<SelectionDAGISel> S)
396 : Selector->OptLevel;
400 Selector->initializeAnalysisResults(*
this);
401 return Selector->runOnMachineFunction(MF);
430 if (
UseMBPI && RegisterPGOPasses)
437 if (RegisterPGOPasses)
472 : Selector->OptLevel;
475 Selector->initializeAnalysisResults(MFAM);
476 Selector->runOnMachineFunction(MF);
502 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
507 if (PSI && PSI->hasProfileSummary() && RegisterPGOPasses)
520 if (!LibcallResult) {
522 "' analysis required");
534 if (
UseMBPI && RegisterPGOPasses)
570 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
574 if (PSI && PSI->hasProfileSummary() && RegisterPGOPasses)
583 UA = &UAPass->getUniformityInfo();
600 if (
UseMBPI && RegisterPGOPasses)
630 MF->setHasInlineAsm(
false);
657 TLI->initializeSplitCSR(EntryMBB);
659 SelectAllBasicBlocks(Fn);
709 if (!
MBB.succ_empty())
713 if (Term !=
MBB.end() && Term->isReturn()) {
718 TLI->insertCopiesSplitCSR(EntryMBB, Returns);
722 if (!
FuncInfo->ArgDbgValues.empty())
723 for (std::pair<MCRegister, Register> LI :
RegInfo->liveins())
728 for (
unsigned i = 0, e =
FuncInfo->ArgDbgValues.size(); i != e; ++i) {
730 assert(
MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
731 "Function parameters should not be described by DBG_VALUE_LIST.");
732 bool hasFI =
MI->getDebugOperand(0).isFI();
734 hasFI ?
TRI.getFrameRegister(*
MF) :
MI->getDebugOperand(0).getReg();
735 if (Reg.isPhysical())
742 Def->getParent()->insert(std::next(InsertPos),
MI);
753 if (!Reg.isPhysical())
756 if (LDI != LiveInMap.
end()) {
757 assert(!hasFI &&
"There's no handling of frame pointer updating here yet "
761 const MDNode *Variable =
MI->getDebugVariable();
762 const MDNode *Expr =
MI->getDebugExpression();
764 bool IsIndirect =
MI->isIndirectDebugValue();
766 assert(
MI->getDebugOffset().getImm() == 0 &&
767 "DBG_VALUE with nonzero offset");
769 "Expected inlined-at fields to agree");
770 assert(
MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
771 "Didn't expect to see a DBG_VALUE_LIST here");
773 BuildMI(*EntryMBB, ++InsertPos,
DL,
TII->get(TargetOpcode::DBG_VALUE),
774 IsIndirect, LDI->second, Variable, Expr);
781 if (
UseMI.isDebugValue())
783 if (
UseMI.isCopy() && !CopyUseMI &&
UseMI.getParent() == EntryMBB) {
792 TRI.getRegSizeInBits(LDI->second, MRI) ==
807 if (
MF->useDebugInstrRef())
808 MF->finalizeDebugInstrRefs();
812 for (
const auto &
MBB : *
MF) {
816 for (
const auto &
MI :
MBB) {
818 if ((
MCID.isCall() && !
MCID.isReturn()) ||
819 MI.isStackAligningInlineAsm()) {
822 if (
MI.isInlineAsm()) {
823 MF->setHasInlineAsm(
true);
832 ISEL_DUMP(
dbgs() <<
"*** MachineFunction at end of ISel ***\n");
844 if (!R.getLocation().isValid() || ShouldAbort)
845 R << (
" (in function: " + MF.
getName() +
")").str();
863 bool HaveFakeUse =
false;
864 bool HaveTailCall =
false;
867 if (CI->isTailCall()) {
872 if (
II->getIntrinsicID() == Intrinsic::fake_use)
874 }
while (
I != Begin);
877 if (!HaveTailCall || !HaveFakeUse)
886 FakeUse && FakeUse->getIntrinsicID() == Intrinsic::fake_use) {
888 !UsedDef || UsedDef->getParent() !=
I->getParent() ||
889 UsedDef->comesBefore(&*
I))
894 for (
auto *Inst : FakeUses)
895 Inst->moveBefore(*Inst->getParent(),
I);
902 CurDAG->NewNodesMustHaveLegalTypes =
false;
911 SDB->visitDbgInfo(*
I);
916 HadTailCall =
SDB->HasTailCall;
917 SDB->resolveOrClearDbgInfo();
924void SelectionDAGISel::ComputeLiveOutVRegInfo() {
925 SmallPtrSet<SDNode *, 16>
Added;
938 if (
Op.getValueType() == MVT::Other &&
Added.insert(
Op.getNode()).second)
951 EVT SrcVT = Src.getValueType();
955 unsigned NumSignBits =
CurDAG->ComputeNumSignBits(Src);
956 Known =
CurDAG->computeKnownBits(Src);
957 FuncInfo->AddLiveOutRegInfo(DestReg, NumSignBits, Known);
958 }
while (!Worklist.
empty());
961void SelectionDAGISel::CodeGenAndEmitDAG() {
962 StringRef GroupName =
"sdag";
963 StringRef GroupDescription =
"Instruction Selection and Scheduling";
964 std::string BlockName;
965 bool MatchFilterBB =
false;
969 CurDAG->NewNodesMustHaveLegalTypes =
false;
974 FuncInfo->MBB->getBasicBlock()->getName());
983 (
MF->getName() +
":" +
FuncInfo->MBB->getBasicBlock()->getName()).str();
990#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
991 if (
TTI->hasBranchDivergence())
992 CurDAG->VerifyDAGDivergence();
996 CurDAG->viewGraph(
"dag-combine1 input for " + BlockName);
1000 NamedRegionTimer
T(
"combine1",
"DAG Combining 1", GroupName,
1010#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1011 if (
TTI->hasBranchDivergence())
1012 CurDAG->VerifyDAGDivergence();
1018 CurDAG->viewGraph(
"legalize-types input for " + BlockName);
1022 NamedRegionTimer
T(
"legalize_types",
"Type Legalization", GroupName,
1032#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1033 if (
TTI->hasBranchDivergence())
1034 CurDAG->VerifyDAGDivergence();
1038 CurDAG->NewNodesMustHaveLegalTypes =
true;
1042 CurDAG->viewGraph(
"dag-combine-lt input for " + BlockName);
1046 NamedRegionTimer
T(
"combine_lt",
"DAG Combining after legalize types",
1051 ISEL_DUMP(
dbgs() <<
"\nOptimized type-legalized selection DAG: "
1056#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1057 if (
TTI->hasBranchDivergence())
1058 CurDAG->VerifyDAGDivergence();
1063 NamedRegionTimer
T(
"legalize_vec",
"Vector Legalization", GroupName,
1074#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1075 if (
TTI->hasBranchDivergence())
1076 CurDAG->VerifyDAGDivergence();
1080 NamedRegionTimer
T(
"legalize_types2",
"Type Legalization 2", GroupName,
1085 ISEL_DUMP(
dbgs() <<
"\nVector/type-legalized selection DAG: "
1090#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1091 if (
TTI->hasBranchDivergence())
1092 CurDAG->VerifyDAGDivergence();
1096 CurDAG->viewGraph(
"dag-combine-lv input for " + BlockName);
1100 NamedRegionTimer
T(
"combine_lv",
"DAG Combining after legalize vectors",
1105 ISEL_DUMP(
dbgs() <<
"\nOptimized vector-legalized selection DAG: "
1110#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1111 if (
TTI->hasBranchDivergence())
1112 CurDAG->VerifyDAGDivergence();
1117 CurDAG->viewGraph(
"legalize input for " + BlockName);
1120 NamedRegionTimer
T(
"legalize",
"DAG Legalization", GroupName,
1130#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1131 if (
TTI->hasBranchDivergence())
1132 CurDAG->VerifyDAGDivergence();
1136 CurDAG->viewGraph(
"dag-combine2 input for " + BlockName);
1140 NamedRegionTimer
T(
"combine2",
"DAG Combining 2", GroupName,
1150#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1151 if (
TTI->hasBranchDivergence())
1152 CurDAG->VerifyDAGDivergence();
1156 ComputeLiveOutVRegInfo();
1159 CurDAG->viewGraph(
"isel input for " + BlockName);
1164 NamedRegionTimer
T(
"isel",
"Instruction Selection", GroupName,
1166 DoInstructionSelection();
1175 CurDAG->viewGraph(
"scheduler input for " + BlockName);
1178 ScheduleDAGSDNodes *
Scheduler = CreateScheduler();
1180 NamedRegionTimer
T(
"sched",
"Instruction Scheduling", GroupName,
1190 MachineBasicBlock *FirstMBB =
FuncInfo->MBB, *LastMBB;
1192 NamedRegionTimer
T(
"emit",
"Instruction Creation", GroupName,
1202 if (FirstMBB != LastMBB)
1203 SDB->UpdateSplitBlock(FirstMBB, LastMBB);
1207 NamedRegionTimer
T(
"cleanup",
"Instruction Scheduling Cleanup", GroupName,
1225 : SelectionDAG::DAGUpdateListener(DAG), ISelPosition(isp) {}
1230 void NodeDeleted(SDNode *
N, SDNode *
E)
override {
1238 void NodeInserted(SDNode *
N)
override {
1239 SDNode *CurNode = &*ISelPosition;
1240 if (MDNode *MD = DAG.getPCSections(CurNode))
1241 DAG.addPCSections(
N, MD);
1242 if (MDNode *MMRA = DAG.getMMRAMetadata(CurNode))
1243 DAG.addMMRAMetadata(
N, MMRA);
1273 while (!Nodes.
empty()) {
1275 for (
auto *U :
N->users()) {
1276 auto UId = U->getNodeId();
1289 int InvalidId = -(
N->getNodeId() + 1);
1290 N->setNodeId(InvalidId);
1295 int Id =
N->getNodeId();
1301void SelectionDAGISel::DoInstructionSelection() {
1304 <<
FuncInfo->MBB->getName() <<
"'\n");
1322 ISelUpdater ISU(*
CurDAG, ISelPosition);
1333 if (
Node->use_empty())
1340 while (!Nodes.
empty()) {
1357 "Node has already selected predecessor node");
1369 if (!
TLI->isStrictFPEnabled() &&
Node->isStrictFPOpcode()) {
1374 switch (
Node->getOpcode()) {
1383 ActionVT =
Node->getOperand(1).getValueType();
1386 ActionVT =
Node->getValueType(0);
1389 if (
TLI->getOperationAction(
Node->getOpcode(), ActionVT)
1394 LLVM_DEBUG(
dbgs() <<
"\nISEL: Starting selection on root node: ";
1400 CurDAG->setRoot(Dummy.getValue());
1412 if (IID == Intrinsic::eh_exceptionpointer ||
1413 IID == Intrinsic::eh_exceptioncode)
1428 bool IsSingleCatchAllClause =
1433 bool IsCatchLongjmp = CPI->
arg_size() == 0;
1434 if (!IsSingleCatchAllClause && !IsCatchLongjmp) {
1436 bool IntrFound =
false;
1440 if (IID == Intrinsic::wasm_landingpad_index) {
1441 Value *IndexArg =
Call->getArgOperand(1);
1449 assert(IntrFound &&
"wasm.landingpad.index intrinsic not found!");
1456bool SelectionDAGISel::PrepareEHLandingPad() {
1460 const TargetRegisterClass *PtrRC =
1461 TLI->getRegClassFor(
TLI->getPointerTy(
CurDAG->getDataLayout()));
1472 MCRegister EHPhysReg =
TLI->getExceptionPointerRegister(PersonalityFn);
1473 assert(EHPhysReg &&
"target lacks exception pointer register");
1477 TII->get(TargetOpcode::COPY), VReg)
1488 const MCInstrDesc &
II =
TII->get(TargetOpcode::EH_LABEL);
1494 const TargetRegisterInfo &
TRI = *
MF->getSubtarget().getRegisterInfo();
1495 if (
auto *RegMask =
TRI.getCustomEHPadPreservedMask(*
MF))
1496 MF->getRegInfo().addPhysRegsUsedFromRegMask(RegMask);
1503 MF->setCallSiteLandingPad(Label,
SDB->LPadToCallSiteMap[
MBB]);
1505 if (MCRegister
Reg =
TLI->getExceptionPointerRegister(PersonalityFn))
1508 if (MCRegister
Reg =
TLI->getExceptionSelectorRegister(PersonalityFn))
1517 llvm::WinEHFuncInfo *EHInfo =
MF->getWinEHFuncInfo();
1520 for (MachineBasicBlock &
MBB : *
MF) {
1530 MachineInstr *MIb = &*MBBb;
1535 MCSymbol *BeginLabel =
MF->getContext().createTempSymbol();
1536 MCSymbol *EndLabel =
MF->getContext().createTempSymbol();
1539 TII->get(TargetOpcode::EH_LABEL))
1542 MachineInstr *MIe = &*(--MBBe);
1548 TII->get(TargetOpcode::EH_LABEL))
1559 return !
I->mayWriteToMemory() &&
1560 !
I->isTerminator() &&
1572 auto ArgIt = FuncInfo.
ValueMap.find(Arg);
1573 if (ArgIt == FuncInfo.
ValueMap.end())
1575 Register ArgVReg = ArgIt->getSecond();
1579 if (VirtReg == ArgVReg) {
1583 LLVM_DEBUG(
dbgs() <<
"processDbgDeclare: setVariableDbgInfo Var=" << *Var
1584 <<
", Expr=" << *Expr <<
", MCRegister=" << PhysReg
1585 <<
", DbgLoc=" << DbgLoc <<
"\n");
1596 <<
" (bad address)\n");
1603 if (!Address->getType()->isPointerTy())
1609 assert(Var &&
"Missing variable");
1610 assert(DbgLoc &&
"Missing location");
1614 APInt Offset(
DL.getIndexTypeSizeInBits(Address->getType()), 0);
1615 Address = Address->stripAndAccumulateInBoundsConstantOffsets(
DL,
Offset);
1620 int FI = std::numeric_limits<int>::max();
1628 if (FI == std::numeric_limits<int>::max())
1631 if (
Offset.getBoolValue())
1635 LLVM_DEBUG(
dbgs() <<
"processDbgDeclare: setVariableDbgInfo Var=" << *Var
1636 <<
", Expr=" << *Expr <<
", FI=" << FI
1637 <<
", DbgLoc=" << DbgLoc <<
"\n");
1649 DVR.getExpression(), DVR.getVariable(),
1664 assert(!It->Values.hasArgList() &&
"Single loc variadic ops not supported");
1670void SelectionDAGISel::SelectAllBasicBlocks(
const Function &Fn) {
1673 FastISel *FastIS =
nullptr;
1674 if (
TM.Options.EnableFastISel) {
1679 ReversePostOrderTraversal<const Function*> RPOT(&Fn);
1700 ++NumFastIselFailLowerArguments;
1702 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1705 R <<
"FastISel didn't lower all arguments: "
1713 CodeGenAndEmitDAG();
1727 if (FastIS && Inserted)
1732 "expected AssignmentTrackingAnalysis pass results");
1740 for (
const BasicBlock *LLVMBB : RPOT) {
1742 bool AllPredsVisited =
true;
1744 if (!
FuncInfo->VisitedBBs[Pred->getNumber()]) {
1745 AllPredsVisited =
false;
1750 if (AllPredsVisited) {
1751 for (
const PHINode &PN : LLVMBB->
phis())
1752 FuncInfo->ComputePHILiveOutRegInfo(&PN);
1754 for (
const PHINode &PN : LLVMBB->
phis())
1755 FuncInfo->InvalidatePHILiveOutRegInfo(&PN);
1766 const_cast<BasicBlock *
>(LLVMBB)->getFirstNonPHIIt();
1786 if (!PrepareEHLandingPad())
1792 if (NewRoot && NewRoot !=
CurDAG->getRoot())
1793 CurDAG->setRoot(NewRoot);
1802 unsigned NumFastIselRemaining = std::distance(Begin, End);
1808 for (; BI != Begin; --BI) {
1814 --NumFastIselRemaining;
1825 --NumFastIselRemaining;
1826 ++NumFastIselSuccess;
1833 while (BeforeInst != &*Begin) {
1843 <<
"FastISel folded load: " << *BeforeInst <<
"\n");
1846 --NumFastIselRemaining;
1847 ++NumFastIselSuccess;
1861 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1864 R <<
"FastISel missed call";
1867 std::string InstStrStorage;
1868 raw_string_ostream InstStr(InstStrStorage);
1871 R <<
": " << InstStrStorage;
1880 NumFastIselFailures += NumFastIselRemaining;
1891 bool HadTailCall =
false;
1893 SelectBasicBlock(Inst->
getIterator(), BI, HadTailCall);
1905 unsigned RemainingNow = std::distance(Begin, BI);
1906 NumFastIselFailures += NumFastIselRemaining - RemainingNow;
1907 NumFastIselRemaining = RemainingNow;
1911 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1917 R <<
"FastISel missed terminator";
1921 R <<
"FastISel missed";
1925 std::string InstStrStorage;
1926 raw_string_ostream InstStr(InstStrStorage);
1928 R <<
": " << InstStrStorage;
1933 NumFastIselFailures += NumFastIselRemaining;
1940 if (
SP->shouldEmitSDCheck(*LLVMBB)) {
1941 bool FunctionBasedInstrumentation =
1944 SDB->SPDescriptor.initialize(LLVMBB,
FuncInfo->getMBB(LLVMBB),
1945 FunctionBasedInstrumentation);
1951 ++NumFastIselBlocks;
1958 SelectBasicBlock(Begin, BI, HadTailCall);
1970 FuncInfo->PHINodesToUpdate.clear();
1976 reportIPToStateForBlocks(
MF);
1978 SP->copyToMachineFrameInfo(
MF->getFrameInfo());
1983 SDB->clearDanglingDebugInfo();
1984 SDB->SPDescriptor.resetPerFunctionState();
1988SelectionDAGISel::FinishBasicBlock() {
1990 <<
FuncInfo->PHINodesToUpdate.size() <<
"\n";
1991 for (
unsigned i = 0, e =
FuncInfo->PHINodesToUpdate.size(); i != e;
1993 <<
"Node " << i <<
" : (" <<
FuncInfo->PHINodesToUpdate[i].first
1999 for (
unsigned i = 0, e =
FuncInfo->PHINodesToUpdate.size(); i != e; ++i) {
2000 MachineInstrBuilder
PHI(*
MF,
FuncInfo->PHINodesToUpdate[i].first);
2002 "This is not a machine PHI node that we are updating!");
2003 if (!
FuncInfo->MBB->isSuccessor(
PHI->getParent()))
2009 if (
SDB->SPDescriptor.shouldEmitFunctionBasedCheckStackProtector()) {
2012 MachineBasicBlock *ParentMBB =
SDB->SPDescriptor.getParentMBB();
2017 SDB->visitSPDescriptorParent(
SDB->SPDescriptor, ParentMBB);
2020 CodeGenAndEmitDAG();
2023 SDB->SPDescriptor.resetPerBBState();
2024 }
else if (
SDB->SPDescriptor.shouldEmitStackProtector()) {
2025 MachineBasicBlock *ParentMBB =
SDB->SPDescriptor.getParentMBB();
2026 MachineBasicBlock *SuccessMBB =
SDB->SPDescriptor.getSuccessMBB();
2038 SuccessMBB->
splice(SuccessMBB->
end(), ParentMBB, SplitPoint,
2044 SDB->visitSPDescriptorParent(
SDB->SPDescriptor, ParentMBB);
2047 CodeGenAndEmitDAG();
2050 MachineBasicBlock *FailureMBB =
SDB->SPDescriptor.getFailureMBB();
2051 if (FailureMBB->
empty()) {
2054 SDB->visitSPDescriptorFailure(
SDB->SPDescriptor);
2057 CodeGenAndEmitDAG();
2061 SDB->SPDescriptor.resetPerBBState();
2065 for (
auto &BTB :
SDB->SL->BitTestCases) {
2075 CodeGenAndEmitDAG();
2078 BranchProbability UnhandledProb = BTB.Prob;
2079 for (
unsigned j = 0, ej = BTB.Cases.size(); j != ej; ++j) {
2080 UnhandledProb -= BTB.Cases[
j].ExtraProb;
2094 MachineBasicBlock *NextMBB;
2095 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2098 NextMBB = BTB.Cases[
j + 1].TargetBB;
2099 }
else if (j + 1 == ej) {
2101 NextMBB = BTB.Default;
2104 NextMBB = BTB.Cases[
j + 1].ThisBB;
2107 SDB->visitBitTestCase(BTB, NextMBB, UnhandledProb, BTB.Reg, BTB.Cases[j],
2112 CodeGenAndEmitDAG();
2114 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2116 BTB.Cases.pop_back();
2122 for (
const std::pair<MachineInstr *, Register> &
P :
2124 MachineInstrBuilder
PHI(*
MF,
P.first);
2125 MachineBasicBlock *PHIBB =
PHI->getParent();
2127 "This is not a machine PHI node that we are updating!");
2130 if (PHIBB == BTB.Default) {
2131 PHI.addReg(
P.second).addMBB(BTB.Parent);
2132 if (!BTB.ContiguousRange) {
2133 PHI.addReg(
P.second).addMBB(BTB.Cases.back().ThisBB);
2137 for (
const SwitchCG::BitTestCase &
BT : BTB.Cases) {
2138 MachineBasicBlock* cBB =
BT.ThisBB;
2140 PHI.addReg(
P.second).addMBB(cBB);
2144 SDB->SL->BitTestCases.clear();
2149 for (
unsigned i = 0, e =
SDB->SL->JTCases.size(); i != e; ++i) {
2151 if (!
SDB->SL->JTCases[i].first.Emitted) {
2153 FuncInfo->MBB =
SDB->SL->JTCases[i].first.HeaderBB;
2156 SDB->visitJumpTableHeader(
SDB->SL->JTCases[i].second,
2160 CodeGenAndEmitDAG();
2167 SDB->visitJumpTable(
SDB->SL->JTCases[i].second);
2170 CodeGenAndEmitDAG();
2173 for (
unsigned pi = 0, pe =
FuncInfo->PHINodesToUpdate.size();
2175 MachineInstrBuilder
PHI(*
MF,
FuncInfo->PHINodesToUpdate[pi].first);
2178 "This is not a machine PHI node that we are updating!");
2180 if (PHIBB ==
SDB->SL->JTCases[i].second.Default)
2182 .addMBB(
SDB->SL->JTCases[i].first.HeaderBB);
2184 if (
FuncInfo->MBB->isSuccessor(PHIBB))
2188 SDB->SL->JTCases.clear();
2192 for (
unsigned i = 0, e =
SDB->SL->SwitchCases.size(); i != e; ++i) {
2200 if (
SDB->SL->SwitchCases[i].TrueBB !=
SDB->SL->SwitchCases[i].FalseBB)
2207 CodeGenAndEmitDAG();
2211 MachineBasicBlock *ThisBB =
FuncInfo->MBB;
2217 for (MachineBasicBlock *Succ : Succs) {
2228 for (
unsigned pn = 0; ; ++pn) {
2230 "Didn't find PHI entry!");
2231 if (
FuncInfo->PHINodesToUpdate[pn].first ==
PHI) {
2232 PHI.addReg(
FuncInfo->PHINodesToUpdate[pn].second).addMBB(ThisBB);
2240 SDB->SL->SwitchCases.clear();
2261 int64_t DesiredMaskS)
const {
2262 const APInt &ActualMask = RHS->getAPIntValue();
2265 const APInt &DesiredMask =
APInt(LHS.getValueSizeInBits(), DesiredMaskS,
2269 if (ActualMask == DesiredMask)
2278 APInt NeededMask = DesiredMask & ~ActualMask;
2279 if (
CurDAG->MaskedValueIsZero(LHS, NeededMask))
2293 int64_t DesiredMaskS)
const {
2294 const APInt &ActualMask = RHS->getAPIntValue();
2297 const APInt &DesiredMask =
APInt(LHS.getValueSizeInBits(), DesiredMaskS,
2301 if (ActualMask == DesiredMask)
2310 APInt NeededMask = DesiredMask & ~ActualMask;
2330 std::list<HandleSDNode> Handles;
2335 Handles.emplace_back(
2344 if (!Flags.isMemKind() && !Flags.isFuncKind()) {
2346 Handles.insert(Handles.end(),
Ops.begin() + i,
2347 Ops.begin() + i + Flags.getNumOperandRegisters() + 1);
2348 i += Flags.getNumOperandRegisters() + 1;
2350 assert(Flags.getNumOperandRegisters() == 1 &&
2351 "Memory operand with multiple values?");
2353 unsigned TiedToOperand;
2354 if (Flags.isUseOperandTiedToDef(TiedToOperand)) {
2358 for (; TiedToOperand; --TiedToOperand) {
2359 CurOp += Flags.getNumOperandRegisters() + 1;
2365 std::vector<SDValue> SelOps;
2367 Flags.getMemoryConstraintID();
2376 Flags.setMemConstraint(ConstraintID);
2377 Handles.emplace_back(
CurDAG->getTargetConstant(Flags,
DL, MVT::i32));
2384 if (e !=
Ops.size())
2385 Handles.emplace_back(
Ops.back());
2388 for (
auto &handle : Handles)
2389 Ops.push_back(handle.getValue());
2395 bool IgnoreChains) {
2404 Visited.
insert(ImmedUse);
2409 if ((
Op.getValueType() == MVT::Other && IgnoreChains) ||
N == Def)
2411 if (!Visited.
insert(
N).second)
2417 if (Root != ImmedUse) {
2421 if ((
Op.getValueType() == MVT::Other && IgnoreChains) ||
N == Def)
2423 if (!Visited.
insert(
N).second)
2438 return N.hasOneUse();
2445 bool IgnoreChains) {
2494 while (VT == MVT::Glue) {
2505 IgnoreChains =
false;
2511void SelectionDAGISel::Select_INLINEASM(
SDNode *
N) {
2514 std::vector<SDValue>
Ops(
N->op_begin(),
N->op_end());
2517 const EVT VTs[] = {MVT::Other, MVT::Glue};
2524void SelectionDAGISel::Select_READ_REGISTER(
SDNode *
Op) {
2529 EVT VT =
Op->getValueType(0);
2532 const MachineFunction &
MF =
CurDAG->getMachineFunction();
2540 "\" for llvm.read_register",
2541 Fn,
Op->getDebugLoc()));
2543 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, dl, VT), 0);
2547 CurDAG->getCopyFromReg(
Op->getOperand(0), dl,
Reg,
Op->getValueType(0));
2555void SelectionDAGISel::Select_WRITE_REGISTER(
SDNode *
Op) {
2560 EVT VT =
Op->getOperand(2).getValueType();
2563 const MachineFunction &
MF =
CurDAG->getMachineFunction();
2570 "\" for llvm.write_register",
2571 Fn,
Op->getDebugLoc()));
2575 CurDAG->getCopyToReg(
Op->getOperand(0), dl,
Reg,
Op->getOperand(2));
2583void SelectionDAGISel::Select_UNDEF(
SDNode *
N) {
2584 CurDAG->SelectNodeTo(
N, TargetOpcode::IMPLICIT_DEF,
N->getValueType(0));
2589void SelectionDAGISel::Select_FAKE_USE(
SDNode *
N) {
2590 CurDAG->SelectNodeTo(
N, TargetOpcode::FAKE_USE,
N->getValueType(0),
2591 N->getOperand(1),
N->getOperand(0));
2594void SelectionDAGISel::Select_RELOC_NONE(
SDNode *
N) {
2595 CurDAG->SelectNodeTo(
N, TargetOpcode::RELOC_NONE,
N->getValueType(0),
2596 N->getOperand(1),
N->getOperand(0));
2599void SelectionDAGISel::Select_FREEZE(
SDNode *
N) {
2603 CurDAG->SelectNodeTo(
N, TargetOpcode::COPY,
N->getValueType(0),
2607void SelectionDAGISel::Select_ARITH_FENCE(
SDNode *
N) {
2608 CurDAG->SelectNodeTo(
N, TargetOpcode::ARITH_FENCE,
N->getValueType(0),
2612void SelectionDAGISel::Select_MEMBARRIER(
SDNode *
N) {
2613 CurDAG->SelectNodeTo(
N, TargetOpcode::MEMBARRIER,
N->getValueType(0),
2617void SelectionDAGISel::Select_CONVERGENCECTRL_ANCHOR(
SDNode *
N) {
2618 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_ANCHOR,
2619 N->getValueType(0));
2622void SelectionDAGISel::Select_CONVERGENCECTRL_ENTRY(
SDNode *
N) {
2623 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_ENTRY,
2624 N->getValueType(0));
2627void SelectionDAGISel::Select_CONVERGENCECTRL_LOOP(
SDNode *
N) {
2628 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_LOOP,
2629 N->getValueType(0),
N->getOperand(0));
2634 SDNode *OpNode = OpVal.
getNode();
2642 CurDAG->getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
2646 Ops.push_back(OpVal);
2650void SelectionDAGISel::Select_STACKMAP(
SDNode *
N) {
2652 auto *It =
N->op_begin();
2661 assert(
ID.getValueType() == MVT::i64);
2667 Ops.push_back(Shad);
2670 for (; It !=
N->op_end(); It++)
2671 pushStackMapLiveVariable(
Ops, *It,
DL);
2673 Ops.push_back(Chain);
2674 Ops.push_back(InGlue);
2676 SDVTList NodeTys =
CurDAG->getVTList(MVT::Other, MVT::Glue);
2677 CurDAG->SelectNodeTo(
N, TargetOpcode::STACKMAP, NodeTys,
Ops);
2680void SelectionDAGISel::Select_PATCHPOINT(
SDNode *
N) {
2682 auto *It =
N->op_begin();
2687 std::optional<SDValue> Glue;
2688 if (It->getValueType() == MVT::Glue)
2694 assert(
ID.getValueType() == MVT::i64);
2700 Ops.push_back(Shad);
2703 Ops.push_back(*It++);
2708 Ops.push_back(NumArgs);
2711 Ops.push_back(*It++);
2715 Ops.push_back(*It++);
2718 for (; It !=
N->op_end(); It++)
2719 pushStackMapLiveVariable(
Ops, *It,
DL);
2722 Ops.push_back(RegMask);
2723 Ops.push_back(Chain);
2724 if (Glue.has_value())
2725 Ops.push_back(*Glue);
2727 SDVTList NodeTys =
N->getVTList();
2728 CurDAG->SelectNodeTo(
N, TargetOpcode::PATCHPOINT, NodeTys,
Ops);
2734 assert(Val >= 128 &&
"Not a VBR");
2740 NextBits = MatcherTable[Idx++];
2741 Val |= (NextBits&127) << Shift;
2743 }
while (NextBits & 128);
2754 NextBits = MatcherTable[Idx++];
2755 Val |= (NextBits & 127) << Shift;
2757 }
while (NextBits & 128);
2759 if (Shift < 64 && (NextBits & 0x40))
2769 unsigned SimpleVT = MatcherTable[MatcherIndex++];
2771 SimpleVT =
GetVBR(SimpleVT, MatcherTable, MatcherIndex);
2780 unsigned Index = MatcherTable[MatcherIndex++];
2784void SelectionDAGISel::Select_JUMP_TABLE_DEBUG_INFO(
SDNode *
N) {
2786 CurDAG->SelectNodeTo(
N, TargetOpcode::JUMP_TABLE_DEBUG_INFO, MVT::Glue,
2787 CurDAG->getTargetConstant(
N->getConstantOperandVal(1),
2788 dl, MVT::i64,
true));
2793void SelectionDAGISel::UpdateChains(
2800 if (!ChainNodesMatched.
empty()) {
2802 "Matched input chains but didn't produce a chain");
2805 for (
unsigned i = 0, e = ChainNodesMatched.
size(); i != e; ++i) {
2806 SDNode *ChainNode = ChainNodesMatched[i];
2813 "Deleted node left in chain");
2817 if (ChainNode == NodeToMatch && isMorphNodeTo)
2824 SelectionDAG::DAGNodeDeletedListener NDL(
2825 *
CurDAG, [&](SDNode *
N, SDNode *
E) {
2826 llvm::replace(ChainNodesMatched,
N,
static_cast<SDNode *
>(
nullptr));
2832 if (ChainNode != NodeToMatch && ChainNode->
use_empty() &&
2838 if (!NowDeadNodes.
empty())
2839 CurDAG->RemoveDeadNodes(NowDeadNodes);
2857 unsigned int Max = 8192;
2860 if (ChainNodesMatched.
size() == 1)
2861 return ChainNodesMatched[0]->getOperand(0);
2865 std::function<void(
const SDValue)> AddChains = [&](
const SDValue V) {
2866 if (V.getValueType() != MVT::Other)
2870 if (!Visited.
insert(V.getNode()).second)
2873 for (
const SDValue &
Op : V->op_values())
2879 for (
auto *
N : ChainNodesMatched) {
2884 while (!Worklist.
empty())
2888 if (InputChains.
size() == 0)
2895 for (
SDValue V : InputChains) {
2899 if (InputChains.
size() != 1 &&
2900 V->getValueType(V->getNumValues() - 1) == MVT::Glue &&
2901 InputGlue.
getNode() == V.getNode())
2906 for (
auto *
N : ChainNodesMatched)
2911 if (InputChains.
size() == 1)
2912 return InputChains[0];
2914 MVT::Other, InputChains);
2918SDNode *SelectionDAGISel::
2927 int OldGlueResultNo = -1, OldChainResultNo = -1;
2929 unsigned NTMNumResults =
Node->getNumValues();
2930 if (
Node->getValueType(NTMNumResults-1) == MVT::Glue) {
2931 OldGlueResultNo = NTMNumResults-1;
2932 if (NTMNumResults != 1 &&
2933 Node->getValueType(NTMNumResults-2) == MVT::Other)
2934 OldChainResultNo = NTMNumResults-2;
2935 }
else if (
Node->getValueType(NTMNumResults-1) == MVT::Other)
2936 OldChainResultNo = NTMNumResults-1;
2940 SDNode *Res =
CurDAG->MorphNodeTo(Node, ~TargetOpc, VTList,
Ops);
2954 static_cast<unsigned>(OldGlueResultNo) != ResNumResults - 1)
2956 SDValue(Res, ResNumResults - 1));
2962 if ((EmitNodeInfo &
OPFL_Chain) && OldChainResultNo != -1 &&
2963 static_cast<unsigned>(OldChainResultNo) != ResNumResults - 1)
2965 SDValue(Res, ResNumResults - 1));
2983 unsigned RecNo = MatcherTable[MatcherIndex++];
2984 assert(RecNo < RecordedNodes.size() &&
"Invalid CheckSame");
2985 return N == RecordedNodes[RecNo].first;
2993 if (ChildNo >=
N.getNumOperands())
2995 return ::CheckSame(MatcherTable, MatcherIndex,
N.getOperand(ChildNo),
3003 bool TwoBytePredNo =
3007 ? MatcherTable[MatcherIndex++]
3010 PredNo |= MatcherTable[MatcherIndex++] << 8;
3020 ? MatcherTable[MatcherIndex++]
3028 Opc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
3029 return N->getOpcode() ==
Opc;
3036 if (
N.getValueType() == VT)
3046 if (ChildNo >=
N.getNumOperands())
3048 return ::CheckType(VT,
N.getOperand(ChildNo), TLI,
DL);
3060 if (2 >=
N.getNumOperands())
3062 return ::CheckCondCode(MatcherTable, MatcherIndex,
N.getOperand(2));
3078 int64_t Val =
GetSignedVBR(MatcherTable, MatcherIndex);
3081 return C &&
C->getAPIntValue().trySExtValue() == Val;
3087 if (ChildNo >=
N.getNumOperands())
3089 return ::CheckInteger(MatcherTable, MatcherIndex,
N.getOperand(ChildNo));
3095 int64_t Val = MatcherTable[MatcherIndex++];
3097 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3099 if (
N->getOpcode() !=
ISD::AND)
return false;
3108 int64_t Val = MatcherTable[MatcherIndex++];
3110 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3112 if (
N->getOpcode() !=
ISD::OR)
return false;
3128 unsigned Opcode = Table[Index++];
3198 unsigned Res = Table[Index++];
3312 unsigned NumRecordedNodes;
3315 unsigned NumMatchedMemRefs;
3318 SDValue InputChain, InputGlue;
3321 bool HasChainNodesMatched;
3330 SDNode **NodeToMatch;
3331 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RecordedNodes;
3332 SmallVectorImpl<MatchScope> &MatchScopes;
3335 MatchStateUpdater(SelectionDAG &DAG, SDNode **NodeToMatch,
3336 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RN,
3337 SmallVectorImpl<MatchScope> &MS)
3338 : SelectionDAG::DAGUpdateListener(DAG), NodeToMatch(NodeToMatch),
3339 RecordedNodes(
RN), MatchScopes(MS) {}
3341 void NodeDeleted(SDNode *
N, SDNode *
E)
override {
3347 if (!
E ||
E->isMachineOpcode())
3350 if (
N == *NodeToMatch)
3355 for (
auto &
I : RecordedNodes)
3356 if (
I.first.getNode() ==
N)
3359 for (
auto &
I : MatchScopes)
3360 for (
auto &J :
I.NodeStack)
3361 if (J.getNode() ==
N)
3371 const uint8_t *OperandLists) {
3408 CurDAG->RemoveDeadNode(NodeToMatch);
3412 Select_INLINEASM(NodeToMatch);
3415 Select_READ_REGISTER(NodeToMatch);
3418 Select_WRITE_REGISTER(NodeToMatch);
3422 Select_UNDEF(NodeToMatch);
3425 Select_FAKE_USE(NodeToMatch);
3428 Select_RELOC_NONE(NodeToMatch);
3431 Select_FREEZE(NodeToMatch);
3434 Select_ARITH_FENCE(NodeToMatch);
3437 Select_MEMBARRIER(NodeToMatch);
3440 Select_STACKMAP(NodeToMatch);
3443 Select_PATCHPOINT(NodeToMatch);
3446 Select_JUMP_TABLE_DEBUG_INFO(NodeToMatch);
3449 Select_CONVERGENCECTRL_ANCHOR(NodeToMatch);
3452 Select_CONVERGENCECTRL_ENTRY(NodeToMatch);
3455 Select_CONVERGENCECTRL_LOOP(NodeToMatch);
3482 SDValue InputChain, InputGlue, DeactivationSymbol;
3496 size_t MatcherIndex = 0;
3498 if (!OpcodeOffset.empty()) {
3500 if (
N.getOpcode() < OpcodeOffset.size())
3501 MatcherIndex = OpcodeOffset[
N.getOpcode()];
3502 LLVM_DEBUG(
dbgs() <<
" Initial Opcode index to " << MatcherIndex <<
"\n");
3511 unsigned CaseSize = MatcherTable[Idx++];
3513 CaseSize =
GetVBR(CaseSize, MatcherTable, Idx);
3514 if (CaseSize == 0)
break;
3518 Opc |=
static_cast<uint16_t>(MatcherTable[Idx++]) << 8;
3519 if (
Opc >= OpcodeOffset.size())
3520 OpcodeOffset.resize((
Opc+1)*2);
3521 OpcodeOffset[
Opc] = Idx;
3526 if (
N.getOpcode() < OpcodeOffset.size())
3527 MatcherIndex = OpcodeOffset[
N.getOpcode()];
3531 assert(MatcherIndex < TableSize &&
"Invalid index");
3533 size_t CurrentOpcodeIndex = MatcherIndex;
3547 unsigned NumToSkip = MatcherTable[MatcherIndex++];
3548 if (NumToSkip & 128)
3549 NumToSkip =
GetVBR(NumToSkip, MatcherTable, MatcherIndex);
3551 if (NumToSkip == 0) {
3556 FailIndex = MatcherIndex+NumToSkip;
3558 size_t MatcherIndexOfPredicate = MatcherIndex;
3559 (void)MatcherIndexOfPredicate;
3566 Result, *
this, RecordedNodes);
3571 dbgs() <<
" Skipped scope entry (due to false predicate) at "
3572 <<
"index " << MatcherIndexOfPredicate <<
", continuing at "
3573 << FailIndex <<
"\n");
3574 ++NumDAGIselRetries;
3578 MatcherIndex = FailIndex;
3582 if (FailIndex == 0)
break;
3587 NewEntry.FailIndex = FailIndex;
3588 NewEntry.NodeStack.append(NodeStack.
begin(), NodeStack.
end());
3589 NewEntry.NumRecordedNodes = RecordedNodes.
size();
3590 NewEntry.NumMatchedMemRefs = MatchedMemRefs.
size();
3591 NewEntry.InputChain = InputChain;
3592 NewEntry.InputGlue = InputGlue;
3593 NewEntry.HasChainNodesMatched = !ChainNodesMatched.
empty();
3598 SDNode *Parent =
nullptr;
3599 if (NodeStack.
size() > 1)
3600 Parent = NodeStack[NodeStack.
size()-2].getNode();
3610 if (ChildNo >=
N.getNumOperands())
3628 if (
N->getNumOperands() != 0 &&
3629 N->getOperand(
N->getNumOperands()-1).getValueType() == MVT::Glue)
3630 InputGlue =
N->getOperand(
N->getNumOperands()-1);
3636 if (
N->getNumOperands() != 0 &&
3637 N->getOperand(
N->getNumOperands() - 1).getOpcode() ==
3639 DeactivationSymbol =
N->getOperand(
N->getNumOperands() - 1);
3643 unsigned ChildNo = MatcherTable[MatcherIndex++];
3644 if (ChildNo >=
N.getNumOperands())
3646 N =
N.getOperand(ChildNo);
3656 if (ChildNo >=
N.getNumOperands())
3658 N =
N.getOperand(ChildNo);
3674 assert(!NodeStack.
empty() &&
"Node stack imbalance!");
3675 N = NodeStack.
back();
3678 ? MatcherTable[MatcherIndex++]
3680 if (SiblingNo >=
N.getNumOperands())
3682 N =
N.getOperand(SiblingNo);
3689 assert(!NodeStack.
empty() &&
"Node stack imbalance!");
3690 N = NodeStack.
back();
3694 if (!
::CheckSame(MatcherTable, MatcherIndex,
N, RecordedNodes))
break;
3730 unsigned OpNum = MatcherTable[MatcherIndex++];
3733 for (
unsigned i = 0; i < OpNum; ++i)
3734 Operands.
push_back(RecordedNodes[MatcherTable[MatcherIndex++]].first);
3736 unsigned PredNo = MatcherTable[MatcherIndex++];
3751 ? MatcherTable[MatcherIndex++]
3753 unsigned RecNo = MatcherTable[MatcherIndex++];
3754 assert(RecNo < RecordedNodes.
size() &&
"Invalid CheckComplexPat");
3758 std::unique_ptr<MatchStateUpdater> MSU;
3760 MSU.reset(
new MatchStateUpdater(*
CurDAG, &NodeToMatch, RecordedNodes,
3764 RecordedNodes[RecNo].first, CPNum,
3770 if (!
::CheckOpcode(MatcherTable, MatcherIndex,
N.getNode()))
break;
3787 VT =
getHwModeVT(MatcherTable, MatcherIndex, *
this);
3803 unsigned Res = MatcherTable[MatcherIndex++];
3808 CurDAG->getDataLayout()))
3814 unsigned CurNodeOpcode =
N.getOpcode();
3815 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3819 CaseSize = MatcherTable[MatcherIndex++];
3821 CaseSize =
GetVBR(CaseSize, MatcherTable, MatcherIndex);
3822 if (CaseSize == 0)
break;
3825 Opc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
3828 if (CurNodeOpcode ==
Opc)
3832 MatcherIndex += CaseSize;
3836 if (CaseSize == 0)
break;
3839 LLVM_DEBUG(
dbgs() <<
" OpcodeSwitch from " << SwitchStart <<
" to "
3840 << MatcherIndex <<
"\n");
3845 MVT CurNodeVT =
N.getSimpleValueType();
3846 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3850 CaseSize = MatcherTable[MatcherIndex++];
3852 CaseSize =
GetVBR(CaseSize, MatcherTable, MatcherIndex);
3853 if (CaseSize == 0)
break;
3856 if (CaseVT == MVT::iPTR)
3857 CaseVT =
TLI->getPointerTy(
CurDAG->getDataLayout());
3860 if (CurNodeVT == CaseVT)
3864 MatcherIndex += CaseSize;
3868 if (CaseSize == 0)
break;
3872 <<
"] from " << SwitchStart <<
" to " << MatcherIndex
3941 VT =
getHwModeVT(MatcherTable, MatcherIndex, *
this);
3957 CurDAG->getDataLayout()))
3973 if (!
::CheckOrImm(MatcherTable, MatcherIndex,
N, *
this))
break;
3985 assert(NodeStack.
size() != 1 &&
"No parent node");
3988 bool HasMultipleUses =
false;
3989 for (
unsigned i = 1, e = NodeStack.
size()-1; i != e; ++i) {
3990 unsigned NNonChainUses = 0;
3991 SDNode *NS = NodeStack[i].getNode();
3993 if (U.getValueType() != MVT::Other)
3994 if (++NNonChainUses > 1) {
3995 HasMultipleUses =
true;
3998 if (HasMultipleUses)
break;
4000 if (HasMultipleUses)
break;
4035 VT =
getHwModeVT(MatcherTable, MatcherIndex, *
this);
4044 int64_t Val =
GetSignedVBR(MatcherTable, MatcherIndex);
4066 VT =
getHwModeVT(MatcherTable, MatcherIndex, *
this);
4072 unsigned RegNo = MatcherTable[MatcherIndex++];
4084 unsigned RegNo = MatcherTable[MatcherIndex++];
4085 RegNo |= MatcherTable[MatcherIndex++] << 8;
4101 ? MatcherTable[MatcherIndex++]
4103 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitConvertToTarget");
4104 SDValue Imm = RecordedNodes[RecNo].first;
4108 Imm =
CurDAG->getTargetConstant(*Val,
SDLoc(NodeToMatch),
4109 Imm.getValueType());
4112 Imm =
CurDAG->getTargetConstantFP(*Val,
SDLoc(NodeToMatch),
4113 Imm.getValueType());
4116 RecordedNodes.
emplace_back(Imm, RecordedNodes[RecNo].second);
4125 "EmitMergeInputChains should be the first chain producing node");
4127 "Should only have one EmitMergeInputChains per match");
4131 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitMergeInputChains");
4132 ChainNodesMatched.
push_back(RecordedNodes[RecNo].first.getNode());
4138 if (ChainNodesMatched.
back() != NodeToMatch &&
4139 !RecordedNodes[RecNo].first.hasOneUse()) {
4140 ChainNodesMatched.
clear();
4154 "EmitMergeInputChains should be the first chain producing node");
4161 unsigned NumChains = MatcherTable[MatcherIndex++];
4162 assert(NumChains != 0 &&
"Can't TF zero chains");
4165 "Should only have one EmitMergeInputChains per match");
4168 for (
unsigned i = 0; i != NumChains; ++i) {
4169 unsigned RecNo = MatcherTable[MatcherIndex++];
4170 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitMergeInputChains");
4171 ChainNodesMatched.
push_back(RecordedNodes[RecNo].first.getNode());
4177 if (ChainNodesMatched.
back() != NodeToMatch &&
4178 !RecordedNodes[RecNo].first.hasOneUse()) {
4179 ChainNodesMatched.
clear();
4185 if (ChainNodesMatched.
empty())
4210 : MatcherTable[MatcherIndex++];
4211 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitCopyToReg");
4212 unsigned DestPhysReg = MatcherTable[MatcherIndex++];
4214 DestPhysReg |= MatcherTable[MatcherIndex++] << 8;
4217 InputChain =
CurDAG->getEntryNode();
4219 InputChain =
CurDAG->getCopyToReg(InputChain,
SDLoc(NodeToMatch),
4220 DestPhysReg, RecordedNodes[RecNo].first,
4223 InputGlue = InputChain.
getValue(1);
4228 unsigned XFormNo = MatcherTable[MatcherIndex++];
4229 unsigned RecNo = MatcherTable[MatcherIndex++];
4230 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitNodeXForm");
4238 unsigned index = MatcherTable[MatcherIndex++];
4239 index |= (MatcherTable[MatcherIndex++] << 8);
4240 index |= (MatcherTable[MatcherIndex++] << 16);
4241 index |= (MatcherTable[MatcherIndex++] << 24);
4271 uint32_t TargetOpc = MatcherTable[MatcherIndex++];
4272 TargetOpc |= (MatcherTable[MatcherIndex++] << 8);
4273 unsigned EmitNodeInfo;
4292 EmitNodeInfo = MatcherTable[MatcherIndex++];
4317 NumVTs = MatcherTable[MatcherIndex++];
4320 for (
unsigned i = 0; i != NumVTs; ++i) {
4322 if (VT == MVT::iPTR)
4323 VT =
TLI->getPointerTy(
CurDAG->getDataLayout());
4327 for (
unsigned i = 0; i != NumVTs; ++i) {
4329 if (VT == MVT::iPTR)
4330 VT =
TLI->getPointerTy(
CurDAG->getDataLayout()).SimpleTy;
4343 if (VTs.
size() == 1)
4344 VTList =
CurDAG->getVTList(VTs[0]);
4345 else if (VTs.
size() == 2)
4346 VTList =
CurDAG->getVTList(VTs[0], VTs[1]);
4348 VTList =
CurDAG->getVTList(VTs);
4351 unsigned NumOps = MatcherTable[MatcherIndex++];
4356 size_t OperandIndex = MatcherTable[MatcherIndex++];
4357 if (OperandIndex & 128)
4358 OperandIndex =
GetVBR(OperandIndex, MatcherTable, MatcherIndex);
4360 for (
unsigned i = 0; i !=
NumOps; ++i) {
4361 unsigned RecNo = OperandLists[OperandIndex++];
4363 RecNo =
GetVBR(RecNo, OperandLists, OperandIndex);
4365 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitNode");
4366 Ops.push_back(RecordedNodes[RecNo].first);
4374 FirstOpToCopy += (EmitNodeInfo &
OPFL_Chain) ? 1 : 0;
4376 "Invalid variadic node");
4379 for (
unsigned i = FirstOpToCopy, e = NodeToMatch->
getNumOperands();
4382 if (V.getValueType() == MVT::Glue)
break;
4389 Ops.push_back(InputChain);
4390 if (DeactivationSymbol.
getNode() !=
nullptr)
4391 Ops.push_back(DeactivationSymbol);
4393 Ops.push_back(InputGlue);
4399 bool MayRaiseFPException =
4406 bool IsMorphNodeTo =
4409 if (!IsMorphNodeTo) {
4412 Res =
CurDAG->getMachineNode(TargetOpc,
SDLoc(NodeToMatch),
4416 for (
unsigned i = 0, e = VTs.
size(); i != e; ++i) {
4417 if (VTs[i] == MVT::Other || VTs[i] == MVT::Glue)
break;
4422 "NodeToMatch was removed partway through selection");
4426 auto &Chain = ChainNodesMatched;
4428 "Chain node replaced during MorphNode");
4432 Ops, EmitNodeInfo));
4459 bool mayLoad =
MCID.mayLoad();
4460 bool mayStore =
MCID.mayStore();
4466 if (MMO->isLoad()) {
4469 }
else if (MMO->isStore()) {
4477 CurDAG->setNodeMemRefs(Res, FilteredMemRefs);
4481 if (!MatchedMemRefs.
empty() && Res->memoperands_empty())
4482 dbgs() <<
" Dropping mem operands\n";
4483 dbgs() <<
" " << (IsMorphNodeTo ?
"Morphed" :
"Created") <<
" node: ";
4488 if (IsMorphNodeTo) {
4490 UpdateChains(Res, InputChain, ChainNodesMatched,
true);
4500 unsigned NumResults = MatcherTable[MatcherIndex++];
4502 for (
unsigned i = 0; i != NumResults; ++i) {
4503 unsigned ResSlot = MatcherTable[MatcherIndex++];
4505 ResSlot =
GetVBR(ResSlot, MatcherTable, MatcherIndex);
4507 assert(ResSlot < RecordedNodes.
size() &&
"Invalid CompleteMatch");
4508 SDValue Res = RecordedNodes[ResSlot].first;
4510 assert(i < NodeToMatch->getNumValues() &&
4513 "Invalid number of results to complete!");
4519 "invalid replacement");
4524 UpdateChains(NodeToMatch, InputChain, ChainNodesMatched,
false);
4537 "Didn't replace all uses of the node?");
4538 CurDAG->RemoveDeadNode(NodeToMatch);
4547 LLVM_DEBUG(
dbgs() <<
" Match failed at index " << CurrentOpcodeIndex
4549 ++NumDAGIselRetries;
4551 if (MatchScopes.
empty()) {
4552 CannotYetSelect(NodeToMatch);
4558 MatchScope &LastScope = MatchScopes.
back();
4559 RecordedNodes.
resize(LastScope.NumRecordedNodes);
4560 NodeStack.
assign(LastScope.NodeStack.begin(), LastScope.NodeStack.end());
4561 N = NodeStack.
back();
4563 if (LastScope.NumMatchedMemRefs != MatchedMemRefs.
size())
4564 MatchedMemRefs.
resize(LastScope.NumMatchedMemRefs);
4565 MatcherIndex = LastScope.FailIndex;
4569 InputChain = LastScope.InputChain;
4570 InputGlue = LastScope.InputGlue;
4571 if (!LastScope.HasChainNodesMatched)
4572 ChainNodesMatched.
clear();
4577 unsigned NumToSkip = MatcherTable[MatcherIndex++];
4578 if (NumToSkip & 128)
4579 NumToSkip =
GetVBR(NumToSkip, MatcherTable, MatcherIndex);
4583 if (NumToSkip != 0) {
4584 LastScope.FailIndex = MatcherIndex+NumToSkip;
4598 if (
N->isMachineOpcode()) {
4600 return MCID.mayRaiseFPException();
4605 if (
N->isTargetOpcode()) {
4609 return N->isStrictFPOpcode();
4622 int32_t Off =
C->getSExtValue();
4625 return (Off >= 0) && (((
A.value() - 1) & Off) ==
unsigned(Off));
4630void SelectionDAGISel::CannotYetSelect(
SDNode *
N) {
4633 Msg <<
"Cannot select: ";
4635 Msg.enable_colors(
errs().has_colors());
4641 Msg <<
"\nIn function: " <<
MF->
getName();
4643 bool HasInputChain =
N->getOperand(0).getValueType() == MVT::Other;
4644 unsigned iid =
N->getConstantOperandVal(HasInputChain);
4645 if (iid < Intrinsic::num_intrinsics)
4648 Msg <<
"unknown intrinsic #" << iid;
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[]
PostRA Machine Instruction Scheduler
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
This header defines classes/functions to handle pass execution timing information with interfaces for...
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckNodePredicate(unsigned Opcode, const uint8_t *MatcherTable, size_t &MatcherIndex, const SelectionDAGISel &SDISel, SDValue Op)
CheckNodePredicate - Implements OP_CheckNodePredicate.
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckSame(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N, const SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes)
CheckSame - Implements OP_CheckSame.
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 CheckOrImm(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N, const SelectionDAGISel &SDISel)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckCondCode(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildInteger(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N, unsigned ChildNo)
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 uint8_t *MatcherTable, size_t &Idx)
GetVBR - decode a vbr encoding whose top bit is set.
static cl::opt< bool > DumpSortedDAG("dump-sorted-dags", cl::Hidden, cl::desc("Print DAGs with sorted nodes in debug dump"), cl::init(false))
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 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 LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckChildSame(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N, const SmallVectorImpl< std::pair< SDValue, SDNode * > > &RecordedNodes, unsigned ChildNo)
CheckChildSame - Implements OP_CheckChildXSame.
static void processSingleLocVars(FunctionLoweringInfo &FuncInfo, FunctionVarLocs const *FnVarLocs)
Collect single location variable information generated with assignment tracking.
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 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 LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckInteger(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckPatternPredicate(unsigned Opcode, const uint8_t *MatcherTable, size_t &MatcherIndex, const SelectionDAGISel &SDISel)
CheckPatternPredicate - Implements OP_CheckPatternPredicate.
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 CheckOpcode(const uint8_t *MatcherTable, size_t &MatcherIndex, SDNode *N)
static SDValue HandleMergeInputChains(const SmallVectorImpl< SDNode * > &ChainNodesMatched, SDValue InputGlue, SelectionDAG *CurDAG)
HandleMergeInputChains - This implements the OPC_EmitMergeInputChains operation for when the pattern ...
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckType(MVT::SimpleValueType VT, SDValue N, const TargetLowering *TLI, const DataLayout &DL)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckAndImm(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N, const SelectionDAGISel &SDISel)
static bool hasExceptionPointerOrCodeUser(const CatchPadInst *CPI)
static LLVM_ATTRIBUTE_ALWAYS_INLINE bool CheckValueType(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N, const TargetLowering *TLI, const DataLayout &DL)
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 LLVM_ATTRIBUTE_ALWAYS_INLINE int64_t GetSignedVBR(const unsigned char *MatcherTable, size_t &Idx)
static bool maintainPGOProfile(const TargetMachine &TM, CodeGenOptLevel OptLevel)
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 MVT::SimpleValueType getSimpleVT(const uint8_t *MatcherTable, size_t &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 CheckChild2CondCode(const uint8_t *MatcherTable, size_t &MatcherIndex, SDValue N)
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 LLVM_ATTRIBUTE_ALWAYS_INLINE MVT getHwModeVT(const uint8_t *MatcherTable, size_t &MatcherIndex, const SelectionDAGISel &SDISel)
Decode a HwMode VT in MatcherTable by calling getValueTypeForHwMode.
static size_t IsPredicateKnownToFail(const uint8_t *Table, size_t 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 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.
Record a mapping from subtarget to LibcallLoweringInfo.
const LibcallLoweringInfo & getLibcallLowering(const TargetSubtargetInfo &Subtarget) const
Describe properties that are true of each instruction in the target description file.
virtual unsigned getHwMode(enum HwModeType type=HwMode_Default) const
HwMode ID corresponding to the 'type' parameter is retrieved from the HwMode bit set of the current s...
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.
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
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 & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
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,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI void clearKillFlags(Register Reg) const
clearKillFlags - Iterate over all the uses of the given register and clear the kill flag from the Mac...
ArrayRef< std::pair< MCRegister, Register > > liveins() const
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
bool use_empty(Register RegNo) const
use_empty - Return true if there are no instructions using the specified register.
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
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)
const TargetTransformInfo * TTI
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_CheckChild4TypeByHwMode0
@ OPC_CheckChild2CondCode
@ OPC_CheckChild2TypeByHwMode
@ OPC_CheckPatternPredicateTwoByte
@ OPC_CheckPatternPredicate1
@ OPC_CheckChild4TypeByHwMode
@ OPC_MorphNodeTo1GlueOutput
@ OPC_CaptureDeactivationSymbol
@ OPC_EmitMergeInputChains1_1
@ OPC_CheckPatternPredicate2
@ OPC_EmitConvertToTarget2
@ OPC_EmitConvertToTarget0
@ OPC_CheckPatternPredicate4
@ OPC_EmitConvertToTarget1
@ OPC_CheckPatternPredicate
@ OPC_CheckChild1TypeByHwMode0
@ OPC_CheckPatternPredicate6
@ OPC_CheckPatternPredicate7
@ OPC_CheckChild5TypeByHwMode
@ OPC_EmitMergeInputChains
@ OPC_CheckChild0TypeByHwMode0
@ OPC_EmitMergeInputChains1_0
@ OPC_CheckFoldableChainNode
@ OPC_CheckChild6TypeByHwMode
@ OPC_EmitConvertToTarget3
@ OPC_CheckChild7TypeByHwMode0
@ OPC_CheckChild7TypeByHwMode
@ OPC_EmitRegisterByHwMode
@ OPC_CheckPredicateWithOperands
@ OPC_EmitIntegerByHwMode0
@ OPC_CheckChild3TypeByHwMode0
@ OPC_EmitConvertToTarget4
@ OPC_CheckChild2TypeByHwMode0
@ OPC_EmitIntegerByHwMode
@ OPC_CheckChild3TypeByHwMode
@ OPC_CheckTypeResByHwMode
@ OPC_CheckChild5TypeByHwMode0
@ OPC_EmitConvertToTarget7
@ OPC_EmitMergeInputChains1_2
@ OPC_CheckChild6TypeByHwMode0
@ OPC_EmitConvertToTarget5
@ OPC_MorphNodeToByHwMode
@ OPC_CheckPatternPredicate0
@ OPC_EmitRegisterByHwMode2
@ OPC_MorphNodeTo1GlueInput
@ OPC_CheckChild0TypeByHwMode
@ OPC_CheckChild1TypeByHwMode
@ 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
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)
virtual MVT getValueTypeForHwMode(unsigned Index) const
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.
void SelectCodeCommon(SDNode *NodeToMatch, const uint8_t *MatcherTable, unsigned TableSize, const uint8_t *OperandLists)
const LibcallLoweringInfo * LibcallLowering
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 assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
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.
MachineBasicBlock * emitPatchPoint(MachineInstr &MI, MachineBasicBlock *MBB) const
Replace/modify any TargetFrameIndex operands with a targte-dependent sequence of memory operands that...
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.
const std::optional< PGOOptions > & getPGOOption() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
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 ...
@ CONVERGENCECTRL_ANCHOR
The llvm.experimental.convergence.* intrinsics.
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ 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.
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
@ MEMBARRIER
MEMBARRIER - Compiler barrier only; generate a no-op.
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ 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...
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ 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,...
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ STRICT_SINT_TO_FP
STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to a floating point value.
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
@ RELOC_NONE
Issue a no-op relocation against a given symbol at the current location.
@ 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...
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ 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.
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ 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....
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.
@ Kill
The last use of a register.
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 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.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
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.
A struct capturing PGO tunables.
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