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(
"Print DAGs with sorted nodes in debug dump"),
154 cl::desc(
"Only display the basic block whose name "
155 "matches this for all view-*-dags options"));
158 cl::desc(
"Pop up a window to show dags before the first "
159 "dag combine pass"));
162 cl::desc(
"Pop up a window to show dags before legalize types"));
165 cl::desc(
"Pop up a window to show dags before the post "
166 "legalize types dag combine pass"));
169 cl::desc(
"Pop up a window to show dags before legalize"));
172 cl::desc(
"Pop up a window to show dags before the second "
173 "dag combine pass"));
176 cl::desc(
"Pop up a window to show isel dags as they are selected"));
179 cl::desc(
"Pop up a window to show sched dags as they are processed"));
182 cl::desc(
"Pop up a window to show SUnit dags after they are processed"));
191#define ISEL_DUMP(X) \
193 if (llvm::DebugFlag && \
194 (isCurrentDebugType(DEBUG_TYPE) || \
195 (isCurrentDebugType(ISEL_DUMP_DEBUG_TYPE) && MatchFilterFuncName))) { \
200#define ISEL_DUMP(X) do { } while (false)
220 cl::desc(
"Instruction schedulers available (before register"
233 return Arg.hasAttribute(Attribute::AttrKind::SwiftAsync);
263 SavedOptLevel = IS.OptLevel;
264 SavedFastISel = IS.TM.Options.EnableFastISel;
265 if (NewOptLevel != SavedOptLevel) {
266 IS.OptLevel = NewOptLevel;
267 IS.TM.setOptLevel(NewOptLevel);
268 LLVM_DEBUG(
dbgs() <<
"\nChanging optimization level for Function "
269 << IS.MF->getFunction().getName() <<
"\n");
270 LLVM_DEBUG(
dbgs() <<
"\tBefore: -O" <<
static_cast<int>(SavedOptLevel)
271 <<
" ; After: -O" <<
static_cast<int>(NewOptLevel)
274 IS.TM.setFastISel(IS.TM.getO0WantsFastISel());
277 IS.TM.setFastISel(
false);
279 dbgs() <<
"\tFastISel is "
280 << (IS.TM.Options.EnableFastISel ?
"enabled" :
"disabled")
285 if (IS.OptLevel == SavedOptLevel)
287 LLVM_DEBUG(
dbgs() <<
"\nRestoring optimization level for Function "
288 << IS.MF->getFunction().getName() <<
"\n");
289 LLVM_DEBUG(
dbgs() <<
"\tBefore: -O" <<
static_cast<int>(IS.OptLevel)
290 <<
" ; After: -O" <<
static_cast<int>(SavedOptLevel) <<
"\n");
291 IS.OptLevel = SavedOptLevel;
292 IS.TM.setOptLevel(SavedOptLevel);
293 IS.TM.setFastISel(SavedFastISel);
306 if (
auto *SchedulerCtor = ST.getDAGScheduler(OptLevel)) {
307 return SchedulerCtor(IS, OptLevel);
311 (ST.enableMachineScheduler() && ST.enableMachineSchedDefaultSched()) ||
325 "Unknown sched type!");
335 dbgs() <<
"If a target marks an instruction with "
336 "'usesCustomInserter', it must implement "
337 "TargetLowering::EmitInstrWithCustomInserter!\n";
345 "If a target marks an instruction with 'hasPostISelHook', "
346 "it must implement TargetLowering::AdjustInstrPostInstrSelection!");
354 char &
ID, std::unique_ptr<SelectionDAGISel> S)
385 : Selector->OptLevel;
389 Selector->initializeAnalysisResults(*
this);
390 return Selector->runOnMachineFunction(MF);
420 if (
UseMBPI && RegisterPGOPasses)
427 if (RegisterPGOPasses)
459 : Selector->OptLevel;
462 Selector->initializeAnalysisResults(MFAM);
463 Selector->runOnMachineFunction(MF);
482 TII =
MF->getSubtarget().getInstrInfo();
483 TLI =
MF->getSubtarget().getTargetLowering();
487 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
492 if (PSI && PSI->hasProfileSummary() && RegisterPGOPasses)
510 if (
UseMBPI && RegisterPGOPasses)
535 TII =
MF->getSubtarget().getInstrInfo();
536 TLI =
MF->getSubtarget().getTargetLowering();
541 ORE = std::make_unique<OptimizationRemarkEmitter>(&Fn);
545 if (PSI && PSI->hasProfileSummary() && RegisterPGOPasses)
554 UA = &UAPass->getUniformityInfo();
566 if (
UseMBPI && RegisterPGOPasses)
594 MF->setHasInlineAsm(
false);
621 TLI->initializeSplitCSR(EntryMBB);
623 SelectAllBasicBlocks(Fn);
651 MRI.constrainRegClass(To,
MRI.getRegClass(From));
657 if (!
MRI.use_empty(To))
658 MRI.clearKillFlags(From);
659 MRI.replaceRegWith(From, To);
673 if (!
MBB.succ_empty())
677 if (Term !=
MBB.end() && Term->isReturn()) {
682 TLI->insertCopiesSplitCSR(EntryMBB, Returns);
686 if (!
FuncInfo->ArgDbgValues.empty())
687 for (std::pair<MCRegister, Register> LI :
RegInfo->liveins())
692 for (
unsigned i = 0, e =
FuncInfo->ArgDbgValues.size(); i != e; ++i) {
694 assert(
MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
695 "Function parameters should not be described by DBG_VALUE_LIST.");
696 bool hasFI =
MI->getDebugOperand(0).isFI();
698 hasFI ?
TRI.getFrameRegister(*
MF) :
MI->getDebugOperand(0).getReg();
699 if (Reg.isPhysical())
706 Def->getParent()->insert(std::next(InsertPos),
MI);
717 if (!Reg.isPhysical())
720 if (LDI != LiveInMap.
end()) {
721 assert(!hasFI &&
"There's no handling of frame pointer updating here yet "
725 const MDNode *Variable =
MI->getDebugVariable();
726 const MDNode *Expr =
MI->getDebugExpression();
728 bool IsIndirect =
MI->isIndirectDebugValue();
730 assert(
MI->getDebugOffset().getImm() == 0 &&
731 "DBG_VALUE with nonzero offset");
733 "Expected inlined-at fields to agree");
734 assert(
MI->getOpcode() != TargetOpcode::DBG_VALUE_LIST &&
735 "Didn't expect to see a DBG_VALUE_LIST here");
737 BuildMI(*EntryMBB, ++InsertPos,
DL,
TII->get(TargetOpcode::DBG_VALUE),
738 IsIndirect, LDI->second, Variable, Expr);
745 if (
UseMI.isDebugValue())
747 if (
UseMI.isCopy() && !CopyUseMI &&
UseMI.getParent() == EntryMBB) {
756 TRI.getRegSizeInBits(LDI->second,
MRI) ==
771 if (
MF->useDebugInstrRef())
772 MF->finalizeDebugInstrRefs();
776 for (
const auto &
MBB : *
MF) {
780 for (
const auto &
MI :
MBB) {
782 if ((
MCID.isCall() && !
MCID.isReturn()) ||
783 MI.isStackAligningInlineAsm()) {
786 if (
MI.isInlineAsm()) {
787 MF->setHasInlineAsm(
true);
796 ISEL_DUMP(
dbgs() <<
"*** MachineFunction at end of ISel ***\n");
808 if (!R.getLocation().isValid() || ShouldAbort)
809 R << (
" (in function: " + MF.
getName() +
")").str();
827 bool HaveFakeUse =
false;
828 bool HaveTailCall =
false;
831 if (CI->isTailCall()) {
836 if (
II->getIntrinsicID() == Intrinsic::fake_use)
838 }
while (
I != Begin);
841 if (!HaveTailCall || !HaveFakeUse)
850 FakeUse && FakeUse->getIntrinsicID() == Intrinsic::fake_use) {
852 !UsedDef || UsedDef->getParent() !=
I->getParent() ||
853 UsedDef->comesBefore(&*
I))
858 for (
auto *Inst : FakeUses)
859 Inst->moveBefore(*Inst->getParent(),
I);
866 CurDAG->NewNodesMustHaveLegalTypes =
false;
875 SDB->visitDbgInfo(*
I);
880 HadTailCall =
SDB->HasTailCall;
881 SDB->resolveOrClearDbgInfo();
888void SelectionDAGISel::ComputeLiveOutVRegInfo() {
889 SmallPtrSet<SDNode *, 16>
Added;
902 if (
Op.getValueType() == MVT::Other &&
Added.insert(
Op.getNode()).second)
915 EVT SrcVT = Src.getValueType();
919 unsigned NumSignBits =
CurDAG->ComputeNumSignBits(Src);
920 Known =
CurDAG->computeKnownBits(Src);
921 FuncInfo->AddLiveOutRegInfo(DestReg, NumSignBits, Known);
922 }
while (!Worklist.
empty());
925void SelectionDAGISel::CodeGenAndEmitDAG() {
926 StringRef GroupName =
"sdag";
927 StringRef GroupDescription =
"Instruction Selection and Scheduling";
928 std::string BlockName;
929 bool MatchFilterBB =
false;
933 CurDAG->NewNodesMustHaveLegalTypes =
false;
938 FuncInfo->MBB->getBasicBlock()->getName());
947 (
MF->getName() +
":" +
FuncInfo->MBB->getBasicBlock()->getName()).str();
954#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
955 if (
TTI->hasBranchDivergence())
956 CurDAG->VerifyDAGDivergence();
960 CurDAG->viewGraph(
"dag-combine1 input for " + BlockName);
964 NamedRegionTimer
T(
"combine1",
"DAG Combining 1", GroupName,
974#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
975 if (
TTI->hasBranchDivergence())
976 CurDAG->VerifyDAGDivergence();
982 CurDAG->viewGraph(
"legalize-types input for " + BlockName);
986 NamedRegionTimer
T(
"legalize_types",
"Type Legalization", GroupName,
996#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
997 if (
TTI->hasBranchDivergence())
998 CurDAG->VerifyDAGDivergence();
1002 CurDAG->NewNodesMustHaveLegalTypes =
true;
1006 CurDAG->viewGraph(
"dag-combine-lt input for " + BlockName);
1010 NamedRegionTimer
T(
"combine_lt",
"DAG Combining after legalize types",
1015 ISEL_DUMP(
dbgs() <<
"\nOptimized type-legalized selection DAG: "
1020#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1021 if (
TTI->hasBranchDivergence())
1022 CurDAG->VerifyDAGDivergence();
1027 NamedRegionTimer
T(
"legalize_vec",
"Vector Legalization", GroupName,
1038#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1039 if (
TTI->hasBranchDivergence())
1040 CurDAG->VerifyDAGDivergence();
1044 NamedRegionTimer
T(
"legalize_types2",
"Type Legalization 2", GroupName,
1049 ISEL_DUMP(
dbgs() <<
"\nVector/type-legalized selection DAG: "
1054#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1055 if (
TTI->hasBranchDivergence())
1056 CurDAG->VerifyDAGDivergence();
1060 CurDAG->viewGraph(
"dag-combine-lv input for " + BlockName);
1064 NamedRegionTimer
T(
"combine_lv",
"DAG Combining after legalize vectors",
1069 ISEL_DUMP(
dbgs() <<
"\nOptimized vector-legalized selection DAG: "
1074#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1075 if (
TTI->hasBranchDivergence())
1076 CurDAG->VerifyDAGDivergence();
1081 CurDAG->viewGraph(
"legalize input for " + BlockName);
1084 NamedRegionTimer
T(
"legalize",
"DAG Legalization", GroupName,
1094#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1095 if (
TTI->hasBranchDivergence())
1096 CurDAG->VerifyDAGDivergence();
1100 CurDAG->viewGraph(
"dag-combine2 input for " + BlockName);
1104 NamedRegionTimer
T(
"combine2",
"DAG Combining 2", GroupName,
1114#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
1115 if (
TTI->hasBranchDivergence())
1116 CurDAG->VerifyDAGDivergence();
1120 ComputeLiveOutVRegInfo();
1123 CurDAG->viewGraph(
"isel input for " + BlockName);
1128 NamedRegionTimer
T(
"isel",
"Instruction Selection", GroupName,
1130 DoInstructionSelection();
1139 CurDAG->viewGraph(
"scheduler input for " + BlockName);
1142 ScheduleDAGSDNodes *
Scheduler = CreateScheduler();
1144 NamedRegionTimer
T(
"sched",
"Instruction Scheduling", GroupName,
1154 MachineBasicBlock *FirstMBB =
FuncInfo->MBB, *LastMBB;
1156 NamedRegionTimer
T(
"emit",
"Instruction Creation", GroupName,
1166 if (FirstMBB != LastMBB)
1167 SDB->UpdateSplitBlock(FirstMBB, LastMBB);
1171 NamedRegionTimer
T(
"cleanup",
"Instruction Scheduling Cleanup", GroupName,
1189 : SelectionDAG::DAGUpdateListener(DAG), ISelPosition(isp) {}
1194 void NodeDeleted(SDNode *
N, SDNode *
E)
override {
1202 void NodeInserted(SDNode *
N)
override {
1203 SDNode *CurNode = &*ISelPosition;
1204 if (MDNode *MD = DAG.getPCSections(CurNode))
1205 DAG.addPCSections(
N, MD);
1206 if (MDNode *MMRA = DAG.getMMRAMetadata(CurNode))
1207 DAG.addMMRAMetadata(
N, MMRA);
1237 while (!Nodes.
empty()) {
1239 for (
auto *U :
N->users()) {
1240 auto UId = U->getNodeId();
1253 int InvalidId = -(
N->getNodeId() + 1);
1254 N->setNodeId(InvalidId);
1259 int Id =
N->getNodeId();
1265void SelectionDAGISel::DoInstructionSelection() {
1268 <<
FuncInfo->MBB->getName() <<
"'\n");
1286 ISelUpdater ISU(*
CurDAG, ISelPosition);
1297 if (
Node->use_empty())
1304 while (!Nodes.
empty()) {
1321 "Node has already selected predecessor node");
1333 if (!
TLI->isStrictFPEnabled() &&
Node->isStrictFPOpcode()) {
1338 switch (
Node->getOpcode()) {
1347 ActionVT =
Node->getOperand(1).getValueType();
1350 ActionVT =
Node->getValueType(0);
1353 if (
TLI->getOperationAction(
Node->getOpcode(), ActionVT)
1358 LLVM_DEBUG(
dbgs() <<
"\nISEL: Starting selection on root node: ";
1364 CurDAG->setRoot(Dummy.getValue());
1376 if (IID == Intrinsic::eh_exceptionpointer ||
1377 IID == Intrinsic::eh_exceptioncode)
1392 bool IsSingleCatchAllClause =
1397 bool IsCatchLongjmp = CPI->
arg_size() == 0;
1398 if (!IsSingleCatchAllClause && !IsCatchLongjmp) {
1400 bool IntrFound =
false;
1404 if (IID == Intrinsic::wasm_landingpad_index) {
1405 Value *IndexArg =
Call->getArgOperand(1);
1413 assert(IntrFound &&
"wasm.landingpad.index intrinsic not found!");
1420bool SelectionDAGISel::PrepareEHLandingPad() {
1424 const TargetRegisterClass *PtrRC =
1425 TLI->getRegClassFor(
TLI->getPointerTy(
CurDAG->getDataLayout()));
1436 MCRegister EHPhysReg =
TLI->getExceptionPointerRegister(PersonalityFn);
1437 assert(EHPhysReg &&
"target lacks exception pointer register");
1441 TII->get(TargetOpcode::COPY), VReg)
1452 const MCInstrDesc &
II =
TII->get(TargetOpcode::EH_LABEL);
1458 const TargetRegisterInfo &
TRI = *
MF->getSubtarget().getRegisterInfo();
1459 if (
auto *RegMask =
TRI.getCustomEHPadPreservedMask(*
MF))
1460 MF->getRegInfo().addPhysRegsUsedFromRegMask(RegMask);
1467 MF->setCallSiteLandingPad(Label,
SDB->LPadToCallSiteMap[
MBB]);
1469 if (MCRegister
Reg =
TLI->getExceptionPointerRegister(PersonalityFn))
1472 if (MCRegister
Reg =
TLI->getExceptionSelectorRegister(PersonalityFn))
1481 llvm::WinEHFuncInfo *EHInfo =
MF->getWinEHFuncInfo();
1484 for (MachineBasicBlock &
MBB : *
MF) {
1494 MachineInstr *MIb = &*MBBb;
1499 MCSymbol *BeginLabel =
MF->getContext().createTempSymbol();
1500 MCSymbol *EndLabel =
MF->getContext().createTempSymbol();
1503 TII->get(TargetOpcode::EH_LABEL))
1506 MachineInstr *MIe = &*(--MBBe);
1512 TII->get(TargetOpcode::EH_LABEL))
1523 return !
I->mayWriteToMemory() &&
1524 !
I->isTerminator() &&
1536 auto ArgIt = FuncInfo.
ValueMap.find(Arg);
1537 if (ArgIt == FuncInfo.
ValueMap.end())
1539 Register ArgVReg = ArgIt->getSecond();
1543 if (VirtReg == ArgVReg) {
1547 LLVM_DEBUG(
dbgs() <<
"processDbgDeclare: setVariableDbgInfo Var=" << *Var
1548 <<
", Expr=" << *Expr <<
", MCRegister=" << PhysReg
1549 <<
", DbgLoc=" << DbgLoc <<
"\n");
1560 <<
" (bad address)\n");
1567 if (!Address->getType()->isPointerTy())
1573 assert(Var &&
"Missing variable");
1574 assert(DbgLoc &&
"Missing location");
1578 APInt Offset(
DL.getIndexTypeSizeInBits(Address->getType()), 0);
1579 Address = Address->stripAndAccumulateInBoundsConstantOffsets(
DL,
Offset);
1584 int FI = std::numeric_limits<int>::max();
1592 if (FI == std::numeric_limits<int>::max())
1595 if (
Offset.getBoolValue())
1599 LLVM_DEBUG(
dbgs() <<
"processDbgDeclare: setVariableDbgInfo Var=" << *Var
1600 <<
", Expr=" << *Expr <<
", FI=" << FI
1601 <<
", DbgLoc=" << DbgLoc <<
"\n");
1613 DVR.getExpression(), DVR.getVariable(),
1628 assert(!It->Values.hasArgList() &&
"Single loc variadic ops not supported");
1634void SelectionDAGISel::SelectAllBasicBlocks(
const Function &Fn) {
1637 FastISel *FastIS =
nullptr;
1638 if (
TM.Options.EnableFastISel) {
1643 ReversePostOrderTraversal<const Function*> RPOT(&Fn);
1664 ++NumFastIselFailLowerArguments;
1666 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1669 R <<
"FastISel didn't lower all arguments: "
1677 CodeGenAndEmitDAG();
1691 if (FastIS && Inserted)
1696 "expected AssignmentTrackingAnalysis pass results");
1704 for (
const BasicBlock *LLVMBB : RPOT) {
1706 bool AllPredsVisited =
true;
1708 if (!
FuncInfo->VisitedBBs[Pred->getNumber()]) {
1709 AllPredsVisited =
false;
1714 if (AllPredsVisited) {
1715 for (
const PHINode &PN : LLVMBB->
phis())
1716 FuncInfo->ComputePHILiveOutRegInfo(&PN);
1718 for (
const PHINode &PN : LLVMBB->
phis())
1719 FuncInfo->InvalidatePHILiveOutRegInfo(&PN);
1730 const_cast<BasicBlock *
>(LLVMBB)->getFirstNonPHIIt();
1750 if (!PrepareEHLandingPad())
1756 if (NewRoot && NewRoot !=
CurDAG->getRoot())
1757 CurDAG->setRoot(NewRoot);
1766 unsigned NumFastIselRemaining = std::distance(Begin, End);
1772 for (; BI != Begin; --BI) {
1778 --NumFastIselRemaining;
1789 --NumFastIselRemaining;
1790 ++NumFastIselSuccess;
1797 while (BeforeInst != &*Begin) {
1807 <<
"FastISel folded load: " << *BeforeInst <<
"\n");
1810 --NumFastIselRemaining;
1811 ++NumFastIselSuccess;
1825 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1828 R <<
"FastISel missed call";
1831 std::string InstStrStorage;
1832 raw_string_ostream InstStr(InstStrStorage);
1835 R <<
": " << InstStrStorage;
1847 bool HadTailCall =
false;
1849 SelectBasicBlock(Inst->
getIterator(), BI, HadTailCall);
1861 unsigned RemainingNow = std::distance(Begin, BI);
1862 NumFastIselFailures += NumFastIselRemaining - RemainingNow;
1863 NumFastIselRemaining = RemainingNow;
1867 OptimizationRemarkMissed
R(
"sdagisel",
"FastISelFailure",
1873 R <<
"FastISel missed terminator";
1877 R <<
"FastISel missed";
1881 std::string InstStrStorage;
1882 raw_string_ostream InstStr(InstStrStorage);
1884 R <<
": " << InstStrStorage;
1889 NumFastIselFailures += NumFastIselRemaining;
1896 if (
SP->shouldEmitSDCheck(*LLVMBB)) {
1897 bool FunctionBasedInstrumentation =
1899 SDB->SPDescriptor.initialize(LLVMBB,
FuncInfo->getMBB(LLVMBB),
1900 FunctionBasedInstrumentation);
1906 ++NumFastIselBlocks;
1913 SelectBasicBlock(Begin, BI, HadTailCall);
1925 FuncInfo->PHINodesToUpdate.clear();
1931 reportIPToStateForBlocks(
MF);
1933 SP->copyToMachineFrameInfo(
MF->getFrameInfo());
1938 SDB->clearDanglingDebugInfo();
1939 SDB->SPDescriptor.resetPerFunctionState();
1943SelectionDAGISel::FinishBasicBlock() {
1945 <<
FuncInfo->PHINodesToUpdate.size() <<
"\n";
1946 for (
unsigned i = 0, e =
FuncInfo->PHINodesToUpdate.size(); i != e;
1948 <<
"Node " << i <<
" : (" <<
FuncInfo->PHINodesToUpdate[i].first
1954 for (
unsigned i = 0, e =
FuncInfo->PHINodesToUpdate.size(); i != e; ++i) {
1955 MachineInstrBuilder
PHI(*
MF,
FuncInfo->PHINodesToUpdate[i].first);
1957 "This is not a machine PHI node that we are updating!");
1958 if (!
FuncInfo->MBB->isSuccessor(
PHI->getParent()))
1964 if (
SDB->SPDescriptor.shouldEmitFunctionBasedCheckStackProtector()) {
1967 MachineBasicBlock *ParentMBB =
SDB->SPDescriptor.getParentMBB();
1972 SDB->visitSPDescriptorParent(
SDB->SPDescriptor, ParentMBB);
1975 CodeGenAndEmitDAG();
1978 SDB->SPDescriptor.resetPerBBState();
1979 }
else if (
SDB->SPDescriptor.shouldEmitStackProtector()) {
1980 MachineBasicBlock *ParentMBB =
SDB->SPDescriptor.getParentMBB();
1981 MachineBasicBlock *SuccessMBB =
SDB->SPDescriptor.getSuccessMBB();
1993 SuccessMBB->
splice(SuccessMBB->
end(), ParentMBB, SplitPoint,
1999 SDB->visitSPDescriptorParent(
SDB->SPDescriptor, ParentMBB);
2002 CodeGenAndEmitDAG();
2005 MachineBasicBlock *FailureMBB =
SDB->SPDescriptor.getFailureMBB();
2006 if (FailureMBB->
empty()) {
2009 SDB->visitSPDescriptorFailure(
SDB->SPDescriptor);
2012 CodeGenAndEmitDAG();
2016 SDB->SPDescriptor.resetPerBBState();
2020 for (
auto &BTB :
SDB->SL->BitTestCases) {
2030 CodeGenAndEmitDAG();
2033 BranchProbability UnhandledProb = BTB.Prob;
2034 for (
unsigned j = 0, ej = BTB.Cases.size(); j != ej; ++j) {
2035 UnhandledProb -= BTB.Cases[
j].ExtraProb;
2049 MachineBasicBlock *NextMBB;
2050 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2053 NextMBB = BTB.Cases[
j + 1].TargetBB;
2054 }
else if (j + 1 == ej) {
2056 NextMBB = BTB.Default;
2059 NextMBB = BTB.Cases[
j + 1].ThisBB;
2062 SDB->visitBitTestCase(BTB, NextMBB, UnhandledProb, BTB.Reg, BTB.Cases[j],
2067 CodeGenAndEmitDAG();
2069 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
2071 BTB.Cases.pop_back();
2077 for (
const std::pair<MachineInstr *, Register> &
P :
2079 MachineInstrBuilder
PHI(*
MF,
P.first);
2080 MachineBasicBlock *PHIBB =
PHI->getParent();
2082 "This is not a machine PHI node that we are updating!");
2085 if (PHIBB == BTB.Default) {
2086 PHI.addReg(
P.second).addMBB(BTB.Parent);
2087 if (!BTB.ContiguousRange) {
2088 PHI.addReg(
P.second).addMBB(BTB.Cases.back().ThisBB);
2092 for (
const SwitchCG::BitTestCase &
BT : BTB.Cases) {
2093 MachineBasicBlock* cBB =
BT.ThisBB;
2095 PHI.addReg(
P.second).addMBB(cBB);
2099 SDB->SL->BitTestCases.clear();
2104 for (
unsigned i = 0, e =
SDB->SL->JTCases.size(); i != e; ++i) {
2106 if (!
SDB->SL->JTCases[i].first.Emitted) {
2108 FuncInfo->MBB =
SDB->SL->JTCases[i].first.HeaderBB;
2111 SDB->visitJumpTableHeader(
SDB->SL->JTCases[i].second,
2115 CodeGenAndEmitDAG();
2122 SDB->visitJumpTable(
SDB->SL->JTCases[i].second);
2125 CodeGenAndEmitDAG();
2128 for (
unsigned pi = 0, pe =
FuncInfo->PHINodesToUpdate.size();
2130 MachineInstrBuilder
PHI(*
MF,
FuncInfo->PHINodesToUpdate[pi].first);
2133 "This is not a machine PHI node that we are updating!");
2135 if (PHIBB ==
SDB->SL->JTCases[i].second.Default)
2137 .addMBB(
SDB->SL->JTCases[i].first.HeaderBB);
2139 if (
FuncInfo->MBB->isSuccessor(PHIBB))
2143 SDB->SL->JTCases.clear();
2147 for (
unsigned i = 0, e =
SDB->SL->SwitchCases.size(); i != e; ++i) {
2155 if (
SDB->SL->SwitchCases[i].TrueBB !=
SDB->SL->SwitchCases[i].FalseBB)
2162 CodeGenAndEmitDAG();
2166 MachineBasicBlock *ThisBB =
FuncInfo->MBB;
2172 for (MachineBasicBlock *Succ : Succs) {
2183 for (
unsigned pn = 0; ; ++pn) {
2185 "Didn't find PHI entry!");
2186 if (
FuncInfo->PHINodesToUpdate[pn].first ==
PHI) {
2187 PHI.addReg(
FuncInfo->PHINodesToUpdate[pn].second).addMBB(ThisBB);
2195 SDB->SL->SwitchCases.clear();
2216 int64_t DesiredMaskS)
const {
2217 const APInt &ActualMask = RHS->getAPIntValue();
2220 const APInt &DesiredMask =
APInt(LHS.getValueSizeInBits(), DesiredMaskS,
2224 if (ActualMask == DesiredMask)
2233 APInt NeededMask = DesiredMask & ~ActualMask;
2234 if (
CurDAG->MaskedValueIsZero(LHS, NeededMask))
2248 int64_t DesiredMaskS)
const {
2249 const APInt &ActualMask = RHS->getAPIntValue();
2252 const APInt &DesiredMask =
APInt(LHS.getValueSizeInBits(), DesiredMaskS,
2256 if (ActualMask == DesiredMask)
2265 APInt NeededMask = DesiredMask & ~ActualMask;
2285 std::list<HandleSDNode> Handles;
2290 Handles.emplace_back(
2299 if (!Flags.isMemKind() && !Flags.isFuncKind()) {
2301 Handles.insert(Handles.end(),
Ops.begin() + i,
2302 Ops.begin() + i + Flags.getNumOperandRegisters() + 1);
2303 i += Flags.getNumOperandRegisters() + 1;
2305 assert(Flags.getNumOperandRegisters() == 1 &&
2306 "Memory operand with multiple values?");
2308 unsigned TiedToOperand;
2309 if (Flags.isUseOperandTiedToDef(TiedToOperand)) {
2313 for (; TiedToOperand; --TiedToOperand) {
2314 CurOp += Flags.getNumOperandRegisters() + 1;
2320 std::vector<SDValue> SelOps;
2322 Flags.getMemoryConstraintID();
2331 Flags.setMemConstraint(ConstraintID);
2332 Handles.emplace_back(
CurDAG->getTargetConstant(Flags,
DL, MVT::i32));
2339 if (e !=
Ops.size())
2340 Handles.emplace_back(
Ops.back());
2343 for (
auto &handle : Handles)
2344 Ops.push_back(handle.getValue());
2350 bool IgnoreChains) {
2359 Visited.
insert(ImmedUse);
2364 if ((
Op.getValueType() == MVT::Other && IgnoreChains) ||
N == Def)
2366 if (!Visited.
insert(
N).second)
2372 if (Root != ImmedUse) {
2376 if ((
Op.getValueType() == MVT::Other && IgnoreChains) ||
N == Def)
2378 if (!Visited.
insert(
N).second)
2393 return N.hasOneUse();
2400 bool IgnoreChains) {
2449 while (VT == MVT::Glue) {
2460 IgnoreChains =
false;
2466void SelectionDAGISel::Select_INLINEASM(
SDNode *
N) {
2469 std::vector<SDValue>
Ops(
N->op_begin(),
N->op_end());
2472 const EVT VTs[] = {MVT::Other, MVT::Glue};
2479void SelectionDAGISel::Select_READ_REGISTER(
SDNode *
Op) {
2484 EVT VT =
Op->getValueType(0);
2487 const MachineFunction &
MF =
CurDAG->getMachineFunction();
2495 "\" for llvm.read_register",
2496 Fn,
Op->getDebugLoc()));
2498 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, dl, VT), 0);
2502 CurDAG->getCopyFromReg(
Op->getOperand(0), dl,
Reg,
Op->getValueType(0));
2510void SelectionDAGISel::Select_WRITE_REGISTER(
SDNode *
Op) {
2515 EVT VT =
Op->getOperand(2).getValueType();
2518 const MachineFunction &
MF =
CurDAG->getMachineFunction();
2525 "\" for llvm.write_register",
2526 Fn,
Op->getDebugLoc()));
2530 CurDAG->getCopyToReg(
Op->getOperand(0), dl,
Reg,
Op->getOperand(2));
2538void SelectionDAGISel::Select_UNDEF(
SDNode *
N) {
2539 CurDAG->SelectNodeTo(
N, TargetOpcode::IMPLICIT_DEF,
N->getValueType(0));
2544void SelectionDAGISel::Select_FAKE_USE(
SDNode *
N) {
2545 CurDAG->SelectNodeTo(
N, TargetOpcode::FAKE_USE,
N->getValueType(0),
2546 N->getOperand(1),
N->getOperand(0));
2549void SelectionDAGISel::Select_RELOC_NONE(
SDNode *
N) {
2550 CurDAG->SelectNodeTo(
N, TargetOpcode::RELOC_NONE,
N->getValueType(0),
2551 N->getOperand(1),
N->getOperand(0));
2554void SelectionDAGISel::Select_FREEZE(
SDNode *
N) {
2558 CurDAG->SelectNodeTo(
N, TargetOpcode::COPY,
N->getValueType(0),
2562void SelectionDAGISel::Select_ARITH_FENCE(
SDNode *
N) {
2563 CurDAG->SelectNodeTo(
N, TargetOpcode::ARITH_FENCE,
N->getValueType(0),
2567void SelectionDAGISel::Select_MEMBARRIER(
SDNode *
N) {
2568 CurDAG->SelectNodeTo(
N, TargetOpcode::MEMBARRIER,
N->getValueType(0),
2572void SelectionDAGISel::Select_CONVERGENCECTRL_ANCHOR(
SDNode *
N) {
2573 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_ANCHOR,
2574 N->getValueType(0));
2577void SelectionDAGISel::Select_CONVERGENCECTRL_ENTRY(
SDNode *
N) {
2578 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_ENTRY,
2579 N->getValueType(0));
2582void SelectionDAGISel::Select_CONVERGENCECTRL_LOOP(
SDNode *
N) {
2583 CurDAG->SelectNodeTo(
N, TargetOpcode::CONVERGENCECTRL_LOOP,
2584 N->getValueType(0),
N->getOperand(0));
2589 SDNode *OpNode = OpVal.
getNode();
2597 CurDAG->getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
2601 Ops.push_back(OpVal);
2605void SelectionDAGISel::Select_STACKMAP(
SDNode *
N) {
2607 auto *It =
N->op_begin();
2616 assert(
ID.getValueType() == MVT::i64);
2622 Ops.push_back(Shad);
2625 for (; It !=
N->op_end(); It++)
2626 pushStackMapLiveVariable(
Ops, *It,
DL);
2628 Ops.push_back(Chain);
2629 Ops.push_back(InGlue);
2631 SDVTList NodeTys =
CurDAG->getVTList(MVT::Other, MVT::Glue);
2632 CurDAG->SelectNodeTo(
N, TargetOpcode::STACKMAP, NodeTys,
Ops);
2635void SelectionDAGISel::Select_PATCHPOINT(
SDNode *
N) {
2637 auto *It =
N->op_begin();
2642 std::optional<SDValue> Glue;
2643 if (It->getValueType() == MVT::Glue)
2649 assert(
ID.getValueType() == MVT::i64);
2655 Ops.push_back(Shad);
2658 Ops.push_back(*It++);
2663 Ops.push_back(NumArgs);
2666 Ops.push_back(*It++);
2670 Ops.push_back(*It++);
2673 for (; It !=
N->op_end(); It++)
2674 pushStackMapLiveVariable(
Ops, *It,
DL);
2677 Ops.push_back(RegMask);
2678 Ops.push_back(Chain);
2679 if (Glue.has_value())
2680 Ops.push_back(*Glue);
2682 SDVTList NodeTys =
N->getVTList();
2683 CurDAG->SelectNodeTo(
N, TargetOpcode::PATCHPOINT, NodeTys,
Ops);
2689 assert(Val >= 128 &&
"Not a VBR");
2695 NextBits = MatcherTable[Idx++];
2696 Val |= (NextBits&127) << Shift;
2698 }
while (NextBits & 128);
2706getSimpleVT(
const unsigned char *MatcherTable,
unsigned &MatcherIndex) {
2707 unsigned SimpleVT = MatcherTable[MatcherIndex++];
2709 SimpleVT =
GetVBR(SimpleVT, MatcherTable, MatcherIndex);
2714void SelectionDAGISel::Select_JUMP_TABLE_DEBUG_INFO(
SDNode *
N) {
2716 CurDAG->SelectNodeTo(
N, TargetOpcode::JUMP_TABLE_DEBUG_INFO, MVT::Glue,
2717 CurDAG->getTargetConstant(
N->getConstantOperandVal(1),
2718 dl, MVT::i64,
true));
2723void SelectionDAGISel::UpdateChains(
2730 if (!ChainNodesMatched.
empty()) {
2732 "Matched input chains but didn't produce a chain");
2735 for (
unsigned i = 0, e = ChainNodesMatched.
size(); i != e; ++i) {
2736 SDNode *ChainNode = ChainNodesMatched[i];
2743 "Deleted node left in chain");
2747 if (ChainNode == NodeToMatch && isMorphNodeTo)
2754 SelectionDAG::DAGNodeDeletedListener NDL(
2755 *
CurDAG, [&](SDNode *
N, SDNode *
E) {
2756 llvm::replace(ChainNodesMatched,
N,
static_cast<SDNode *
>(
nullptr));
2762 if (ChainNode != NodeToMatch && ChainNode->
use_empty() &&
2768 if (!NowDeadNodes.
empty())
2769 CurDAG->RemoveDeadNodes(NowDeadNodes);
2787 unsigned int Max = 8192;
2790 if (ChainNodesMatched.
size() == 1)
2791 return ChainNodesMatched[0]->getOperand(0);
2795 std::function<void(
const SDValue)> AddChains = [&](
const SDValue V) {
2796 if (V.getValueType() != MVT::Other)
2800 if (!Visited.
insert(V.getNode()).second)
2803 for (
const SDValue &
Op : V->op_values())
2809 for (
auto *
N : ChainNodesMatched) {
2814 while (!Worklist.
empty())
2818 if (InputChains.
size() == 0)
2825 for (
SDValue V : InputChains) {
2829 if (InputChains.
size() != 1 &&
2830 V->getValueType(V->getNumValues() - 1) == MVT::Glue &&
2831 InputGlue.
getNode() == V.getNode())
2836 for (
auto *
N : ChainNodesMatched)
2841 if (InputChains.
size() == 1)
2842 return InputChains[0];
2844 MVT::Other, InputChains);
2848SDNode *SelectionDAGISel::
2857 int OldGlueResultNo = -1, OldChainResultNo = -1;
2859 unsigned NTMNumResults =
Node->getNumValues();
2860 if (
Node->getValueType(NTMNumResults-1) == MVT::Glue) {
2861 OldGlueResultNo = NTMNumResults-1;
2862 if (NTMNumResults != 1 &&
2863 Node->getValueType(NTMNumResults-2) == MVT::Other)
2864 OldChainResultNo = NTMNumResults-2;
2865 }
else if (
Node->getValueType(NTMNumResults-1) == MVT::Other)
2866 OldChainResultNo = NTMNumResults-1;
2870 SDNode *Res =
CurDAG->MorphNodeTo(Node, ~TargetOpc, VTList,
Ops);
2884 static_cast<unsigned>(OldGlueResultNo) != ResNumResults - 1)
2886 SDValue(Res, ResNumResults - 1));
2892 if ((EmitNodeInfo &
OPFL_Chain) && OldChainResultNo != -1 &&
2893 static_cast<unsigned>(OldChainResultNo) != ResNumResults - 1)
2895 SDValue(Res, ResNumResults - 1));
2913 unsigned RecNo = MatcherTable[MatcherIndex++];
2914 assert(RecNo < RecordedNodes.size() &&
"Invalid CheckSame");
2915 return N == RecordedNodes[RecNo].first;
2920 const unsigned char *MatcherTable,
unsigned &MatcherIndex,
SDValue N,
2923 if (ChildNo >=
N.getNumOperands())
2925 return ::CheckSame(MatcherTable, MatcherIndex,
N.getOperand(ChildNo),
2933 bool TwoBytePredNo =
2937 ? MatcherTable[MatcherIndex++]
2940 PredNo |= MatcherTable[MatcherIndex++] << 8;
2950 ? MatcherTable[MatcherIndex++]
2959 Opc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
2960 return N->getOpcode() ==
Opc;
2967 if (
N.getValueType() == VT)
2977 if (ChildNo >=
N.getNumOperands())
2979 return ::CheckType(VT,
N.getOperand(ChildNo), TLI,
DL);
2992 if (2 >=
N.getNumOperands())
2994 return ::CheckCondCode(MatcherTable, MatcherIndex,
N.getOperand(2));
3022 int64_t Val = MatcherTable[MatcherIndex++];
3024 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3029 return C &&
C->getAPIntValue().trySExtValue() == Val;
3035 if (ChildNo >=
N.getNumOperands())
3037 return ::CheckInteger(MatcherTable, MatcherIndex,
N.getOperand(ChildNo));
3043 int64_t Val = MatcherTable[MatcherIndex++];
3045 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3047 if (
N->getOpcode() !=
ISD::AND)
return false;
3056 int64_t Val = MatcherTable[MatcherIndex++];
3058 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3060 if (
N->getOpcode() !=
ISD::OR)
return false;
3077 unsigned Opcode = Table[Index++];
3137 unsigned Res = Table[Index++];
3224 unsigned NumRecordedNodes;
3227 unsigned NumMatchedMemRefs;
3230 SDValue InputChain, InputGlue;
3233 bool HasChainNodesMatched;
3242 SDNode **NodeToMatch;
3243 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RecordedNodes;
3244 SmallVectorImpl<MatchScope> &MatchScopes;
3247 MatchStateUpdater(SelectionDAG &DAG, SDNode **NodeToMatch,
3248 SmallVectorImpl<std::pair<SDValue, SDNode *>> &RN,
3249 SmallVectorImpl<MatchScope> &MS)
3250 : SelectionDAG::DAGUpdateListener(DAG), NodeToMatch(NodeToMatch),
3251 RecordedNodes(
RN), MatchScopes(MS) {}
3253 void NodeDeleted(SDNode *
N, SDNode *
E)
override {
3259 if (!
E ||
E->isMachineOpcode())
3262 if (
N == *NodeToMatch)
3267 for (
auto &
I : RecordedNodes)
3268 if (
I.first.getNode() ==
N)
3271 for (
auto &
I : MatchScopes)
3272 for (
auto &J :
I.NodeStack)
3273 if (J.getNode() ==
N)
3281 const unsigned char *MatcherTable,
3282 unsigned TableSize) {
3291 case ISD::HANDLENODE:
3292 case ISD::MDNODE_SDNODE:
3307 case ISD::ANNOTATION_LABEL:
3308 case ISD::LIFETIME_START:
3309 case ISD::LIFETIME_END:
3310 case ISD::PSEUDO_PROBE:
3319 CurDAG->RemoveDeadNode(NodeToMatch);
3321 case ISD::INLINEASM:
3322 case ISD::INLINEASM_BR:
3323 Select_INLINEASM(NodeToMatch);
3326 Select_READ_REGISTER(NodeToMatch);
3329 Select_WRITE_REGISTER(NodeToMatch);
3333 Select_UNDEF(NodeToMatch);
3336 Select_FAKE_USE(NodeToMatch);
3338 case ISD::RELOC_NONE:
3339 Select_RELOC_NONE(NodeToMatch);
3342 Select_FREEZE(NodeToMatch);
3344 case ISD::ARITH_FENCE:
3345 Select_ARITH_FENCE(NodeToMatch);
3347 case ISD::MEMBARRIER:
3348 Select_MEMBARRIER(NodeToMatch);
3351 Select_STACKMAP(NodeToMatch);
3353 case ISD::PATCHPOINT:
3354 Select_PATCHPOINT(NodeToMatch);
3356 case ISD::JUMP_TABLE_DEBUG_INFO:
3357 Select_JUMP_TABLE_DEBUG_INFO(NodeToMatch);
3359 case ISD::CONVERGENCECTRL_ANCHOR:
3360 Select_CONVERGENCECTRL_ANCHOR(NodeToMatch);
3362 case ISD::CONVERGENCECTRL_ENTRY:
3363 Select_CONVERGENCECTRL_ENTRY(NodeToMatch);
3365 case ISD::CONVERGENCECTRL_LOOP:
3366 Select_CONVERGENCECTRL_LOOP(NodeToMatch);
3393 SDValue InputChain, InputGlue, DeactivationSymbol;
3407 unsigned MatcherIndex = 0;
3409 if (!OpcodeOffset.empty()) {
3411 if (
N.getOpcode() < OpcodeOffset.size())
3412 MatcherIndex = OpcodeOffset[
N.getOpcode()];
3413 LLVM_DEBUG(
dbgs() <<
" Initial Opcode index to " << MatcherIndex <<
"\n");
3422 unsigned CaseSize = MatcherTable[Idx++];
3424 CaseSize =
GetVBR(CaseSize, MatcherTable, Idx);
3425 if (CaseSize == 0)
break;
3429 Opc |=
static_cast<uint16_t>(MatcherTable[Idx++]) << 8;
3430 if (
Opc >= OpcodeOffset.size())
3431 OpcodeOffset.resize((
Opc+1)*2);
3432 OpcodeOffset[
Opc] = Idx;
3437 if (
N.getOpcode() < OpcodeOffset.size())
3438 MatcherIndex = OpcodeOffset[
N.getOpcode()];
3442 assert(MatcherIndex < TableSize &&
"Invalid index");
3444 unsigned CurrentOpcodeIndex = MatcherIndex;
3458 unsigned NumToSkip = MatcherTable[MatcherIndex++];
3459 if (NumToSkip & 128)
3460 NumToSkip =
GetVBR(NumToSkip, MatcherTable, MatcherIndex);
3462 if (NumToSkip == 0) {
3467 FailIndex = MatcherIndex+NumToSkip;
3469 unsigned MatcherIndexOfPredicate = MatcherIndex;
3470 (void)MatcherIndexOfPredicate;
3477 Result, *
this, RecordedNodes);
3482 dbgs() <<
" Skipped scope entry (due to false predicate) at "
3483 <<
"index " << MatcherIndexOfPredicate <<
", continuing at "
3484 << FailIndex <<
"\n");
3485 ++NumDAGIselRetries;
3489 MatcherIndex = FailIndex;
3493 if (FailIndex == 0)
break;
3497 MatchScope NewEntry;
3498 NewEntry.FailIndex = FailIndex;
3499 NewEntry.NodeStack.append(NodeStack.
begin(), NodeStack.
end());
3500 NewEntry.NumRecordedNodes = RecordedNodes.
size();
3501 NewEntry.NumMatchedMemRefs = MatchedMemRefs.
size();
3502 NewEntry.InputChain = InputChain;
3503 NewEntry.InputGlue = InputGlue;
3504 NewEntry.HasChainNodesMatched = !ChainNodesMatched.
empty();
3510 SDNode *Parent =
nullptr;
3511 if (NodeStack.
size() > 1)
3512 Parent = NodeStack[NodeStack.
size()-2].getNode();
3513 RecordedNodes.
push_back(std::make_pair(
N, Parent));
3522 if (ChildNo >=
N.getNumOperands())
3525 RecordedNodes.
push_back(std::make_pair(
N->getOperand(ChildNo),
3531 MatchedMemRefs.
push_back(MN->getMemOperand());
3541 if (
N->getNumOperands() != 0 &&
3542 N->getOperand(
N->getNumOperands()-1).getValueType() == MVT::Glue)
3543 InputGlue =
N->getOperand(
N->getNumOperands()-1);
3549 if (
N->getNumOperands() != 0 &&
3550 N->getOperand(
N->getNumOperands() - 1).getOpcode() ==
3552 DeactivationSymbol =
N->getOperand(
N->getNumOperands() - 1);
3556 unsigned ChildNo = MatcherTable[MatcherIndex++];
3557 if (ChildNo >=
N.getNumOperands())
3559 N =
N.getOperand(ChildNo);
3569 if (ChildNo >=
N.getNumOperands())
3571 N =
N.getOperand(ChildNo);
3587 assert(!NodeStack.
empty() &&
"Node stack imbalance!");
3588 N = NodeStack.
back();
3591 ? MatcherTable[MatcherIndex++]
3593 if (SiblingNo >=
N.getNumOperands())
3595 N =
N.getOperand(SiblingNo);
3602 assert(!NodeStack.
empty() &&
"Node stack imbalance!");
3603 N = NodeStack.
back();
3607 if (!
::CheckSame(MatcherTable, MatcherIndex,
N, RecordedNodes))
break;
3643 unsigned OpNum = MatcherTable[MatcherIndex++];
3646 for (
unsigned i = 0; i < OpNum; ++i)
3647 Operands.
push_back(RecordedNodes[MatcherTable[MatcherIndex++]].first);
3649 unsigned PredNo = MatcherTable[MatcherIndex++];
3664 ? MatcherTable[MatcherIndex++]
3666 unsigned RecNo = MatcherTable[MatcherIndex++];
3667 assert(RecNo < RecordedNodes.
size() &&
"Invalid CheckComplexPat");
3671 std::unique_ptr<MatchStateUpdater> MSU;
3673 MSU.reset(
new MatchStateUpdater(*
CurDAG, &NodeToMatch, RecordedNodes,
3677 RecordedNodes[RecNo].first, CPNum,
3683 if (!
::CheckOpcode(MatcherTable, MatcherIndex,
N.getNode()))
break;
3706 unsigned Res = MatcherTable[MatcherIndex++];
3714 unsigned CurNodeOpcode =
N.getOpcode();
3715 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3719 CaseSize = MatcherTable[MatcherIndex++];
3721 CaseSize =
GetVBR(CaseSize, MatcherTable, MatcherIndex);
3722 if (CaseSize == 0)
break;
3725 Opc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
3728 if (CurNodeOpcode ==
Opc)
3732 MatcherIndex += CaseSize;
3736 if (CaseSize == 0)
break;
3739 LLVM_DEBUG(
dbgs() <<
" OpcodeSwitch from " << SwitchStart <<
" to "
3740 << MatcherIndex <<
"\n");
3745 MVT CurNodeVT =
N.getSimpleValueType();
3746 unsigned SwitchStart = MatcherIndex-1; (void)SwitchStart;
3750 CaseSize = MatcherTable[MatcherIndex++];
3752 CaseSize =
GetVBR(CaseSize, MatcherTable, MatcherIndex);
3753 if (CaseSize == 0)
break;
3756 if (CaseVT == MVT::iPTR)
3757 CaseVT =
TLI->getPointerTy(
CurDAG->getDataLayout());
3760 if (CurNodeVT == CaseVT)
3764 MatcherIndex += CaseSize;
3768 if (CaseSize == 0)
break;
3772 <<
"] from " << SwitchStart <<
" to " << MatcherIndex
3826 CurDAG->getDataLayout()))
3842 if (!
::CheckOrImm(MatcherTable, MatcherIndex,
N, *
this))
break;
3854 assert(NodeStack.
size() != 1 &&
"No parent node");
3857 bool HasMultipleUses =
false;
3858 for (
unsigned i = 1, e = NodeStack.
size()-1; i != e; ++i) {
3859 unsigned NNonChainUses = 0;
3860 SDNode *NS = NodeStack[i].getNode();
3862 if (U.getValueType() != MVT::Other)
3863 if (++NNonChainUses > 1) {
3864 HasMultipleUses =
true;
3867 if (HasMultipleUses)
break;
3869 if (HasMultipleUses)
break;
3908 int64_t Val = MatcherTable[MatcherIndex++];
3910 Val =
GetVBR(Val, MatcherTable, MatcherIndex);
3913 RecordedNodes.
push_back(std::pair<SDValue, SDNode *>(
3914 CurDAG->getSignedConstant(Val,
SDLoc(NodeToMatch), VT,
3934 unsigned RegNo = MatcherTable[MatcherIndex++];
3935 RecordedNodes.
push_back(std::pair<SDValue, SDNode *>(
3936 CurDAG->getRegister(RegNo, VT),
nullptr));
3944 unsigned RegNo = MatcherTable[MatcherIndex++];
3945 RegNo |= MatcherTable[MatcherIndex++] << 8;
3946 RecordedNodes.
push_back(std::pair<SDValue, SDNode*>(
3947 CurDAG->getRegister(RegNo, VT),
nullptr));
3962 ? MatcherTable[MatcherIndex++]
3964 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitConvertToTarget");
3965 SDValue Imm = RecordedNodes[RecNo].first;
3969 Imm =
CurDAG->getTargetConstant(*Val,
SDLoc(NodeToMatch),
3970 Imm.getValueType());
3973 Imm =
CurDAG->getTargetConstantFP(*Val,
SDLoc(NodeToMatch),
3974 Imm.getValueType());
3977 RecordedNodes.
push_back(std::make_pair(Imm, RecordedNodes[RecNo].second));
3986 "EmitMergeInputChains should be the first chain producing node");
3988 "Should only have one EmitMergeInputChains per match");
3992 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitMergeInputChains");
3993 ChainNodesMatched.
push_back(RecordedNodes[RecNo].first.getNode());
3999 if (ChainNodesMatched.
back() != NodeToMatch &&
4000 !RecordedNodes[RecNo].first.hasOneUse()) {
4001 ChainNodesMatched.
clear();
4015 "EmitMergeInputChains should be the first chain producing node");
4022 unsigned NumChains = MatcherTable[MatcherIndex++];
4023 assert(NumChains != 0 &&
"Can't TF zero chains");
4026 "Should only have one EmitMergeInputChains per match");
4029 for (
unsigned i = 0; i != NumChains; ++i) {
4030 unsigned RecNo = MatcherTable[MatcherIndex++];
4031 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitMergeInputChains");
4032 ChainNodesMatched.
push_back(RecordedNodes[RecNo].first.getNode());
4038 if (ChainNodesMatched.
back() != NodeToMatch &&
4039 !RecordedNodes[RecNo].first.hasOneUse()) {
4040 ChainNodesMatched.
clear();
4046 if (ChainNodesMatched.
empty())
4071 : MatcherTable[MatcherIndex++];
4072 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitCopyToReg");
4073 unsigned DestPhysReg = MatcherTable[MatcherIndex++];
4075 DestPhysReg |= MatcherTable[MatcherIndex++] << 8;
4078 InputChain =
CurDAG->getEntryNode();
4080 InputChain =
CurDAG->getCopyToReg(InputChain,
SDLoc(NodeToMatch),
4081 DestPhysReg, RecordedNodes[RecNo].first,
4084 InputGlue = InputChain.
getValue(1);
4089 unsigned XFormNo = MatcherTable[MatcherIndex++];
4090 unsigned RecNo = MatcherTable[MatcherIndex++];
4091 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitNodeXForm");
4093 RecordedNodes.
push_back(std::pair<SDValue,SDNode*>(Res,
nullptr));
4099 unsigned index = MatcherTable[MatcherIndex++];
4100 index |= (MatcherTable[MatcherIndex++] << 8);
4101 index |= (MatcherTable[MatcherIndex++] << 16);
4102 index |= (MatcherTable[MatcherIndex++] << 24);
4134 uint16_t TargetOpc = MatcherTable[MatcherIndex++];
4135 TargetOpc |=
static_cast<uint16_t>(MatcherTable[MatcherIndex++]) << 8;
4136 unsigned EmitNodeInfo;
4155 EmitNodeInfo = MatcherTable[MatcherIndex++];
4180 NumVTs = MatcherTable[MatcherIndex++];
4182 for (
unsigned i = 0; i != NumVTs; ++i) {
4184 if (VT == MVT::iPTR)
4185 VT =
TLI->getPointerTy(
CurDAG->getDataLayout()).SimpleTy;
4197 if (VTs.
size() == 1)
4198 VTList =
CurDAG->getVTList(VTs[0]);
4199 else if (VTs.
size() == 2)
4200 VTList =
CurDAG->getVTList(VTs[0], VTs[1]);
4202 VTList =
CurDAG->getVTList(VTs);
4205 unsigned NumOps = MatcherTable[MatcherIndex++];
4207 for (
unsigned i = 0; i !=
NumOps; ++i) {
4208 unsigned RecNo = MatcherTable[MatcherIndex++];
4210 RecNo =
GetVBR(RecNo, MatcherTable, MatcherIndex);
4212 assert(RecNo < RecordedNodes.
size() &&
"Invalid EmitNode");
4213 Ops.push_back(RecordedNodes[RecNo].first);
4220 FirstOpToCopy += (EmitNodeInfo &
OPFL_Chain) ? 1 : 0;
4222 "Invalid variadic node");
4225 for (
unsigned i = FirstOpToCopy, e = NodeToMatch->
getNumOperands();
4228 if (V.getValueType() == MVT::Glue)
break;
4235 Ops.push_back(InputChain);
4236 if (DeactivationSymbol.
getNode() !=
nullptr)
4237 Ops.push_back(DeactivationSymbol);
4239 Ops.push_back(InputGlue);
4245 bool MayRaiseFPException =
4252 bool IsMorphNodeTo =
4255 if (!IsMorphNodeTo) {
4258 Res =
CurDAG->getMachineNode(TargetOpc,
SDLoc(NodeToMatch),
4262 for (
unsigned i = 0, e = VTs.
size(); i != e; ++i) {
4263 if (VTs[i] == MVT::Other || VTs[i] == MVT::Glue)
break;
4269 "NodeToMatch was removed partway through selection");
4273 auto &Chain = ChainNodesMatched;
4275 "Chain node replaced during MorphNode");
4279 Ops, EmitNodeInfo));
4306 bool mayLoad =
MCID.mayLoad();
4307 bool mayStore =
MCID.mayStore();
4313 if (MMO->isLoad()) {
4316 }
else if (MMO->isStore()) {
4324 CurDAG->setNodeMemRefs(Res, FilteredMemRefs);
4328 if (!MatchedMemRefs.
empty() && Res->memoperands_empty())
4329 dbgs() <<
" Dropping mem operands\n";
4330 dbgs() <<
" " << (IsMorphNodeTo ?
"Morphed" :
"Created") <<
" node: ";
4335 if (IsMorphNodeTo) {
4337 UpdateChains(Res, InputChain, ChainNodesMatched,
true);
4347 unsigned NumResults = MatcherTable[MatcherIndex++];
4349 for (
unsigned i = 0; i != NumResults; ++i) {
4350 unsigned ResSlot = MatcherTable[MatcherIndex++];
4352 ResSlot =
GetVBR(ResSlot, MatcherTable, MatcherIndex);
4354 assert(ResSlot < RecordedNodes.
size() &&
"Invalid CompleteMatch");
4355 SDValue Res = RecordedNodes[ResSlot].first;
4357 assert(i < NodeToMatch->getNumValues() &&
4360 "Invalid number of results to complete!");
4366 "invalid replacement");
4371 UpdateChains(NodeToMatch, InputChain, ChainNodesMatched,
false);
4384 "Didn't replace all uses of the node?");
4385 CurDAG->RemoveDeadNode(NodeToMatch);
4394 LLVM_DEBUG(
dbgs() <<
" Match failed at index " << CurrentOpcodeIndex
4396 ++NumDAGIselRetries;
4398 if (MatchScopes.
empty()) {
4399 CannotYetSelect(NodeToMatch);
4405 MatchScope &LastScope = MatchScopes.
back();
4406 RecordedNodes.
resize(LastScope.NumRecordedNodes);
4408 NodeStack.
append(LastScope.NodeStack.begin(), LastScope.NodeStack.end());
4409 N = NodeStack.
back();
4411 if (LastScope.NumMatchedMemRefs != MatchedMemRefs.
size())
4412 MatchedMemRefs.
resize(LastScope.NumMatchedMemRefs);
4413 MatcherIndex = LastScope.FailIndex;
4417 InputChain = LastScope.InputChain;
4418 InputGlue = LastScope.InputGlue;
4419 if (!LastScope.HasChainNodesMatched)
4420 ChainNodesMatched.
clear();
4425 unsigned NumToSkip = MatcherTable[MatcherIndex++];
4426 if (NumToSkip & 128)
4427 NumToSkip =
GetVBR(NumToSkip, MatcherTable, MatcherIndex);
4431 if (NumToSkip != 0) {
4432 LastScope.FailIndex = MatcherIndex+NumToSkip;
4446 if (
N->isMachineOpcode()) {
4448 return MCID.mayRaiseFPException();
4453 if (
N->isTargetOpcode()) {
4457 return N->isStrictFPOpcode();
4470 int32_t Off =
C->getSExtValue();
4473 return (Off >= 0) && (((
A.value() - 1) & Off) ==
unsigned(Off));
4478void SelectionDAGISel::CannotYetSelect(
SDNode *
N) {
4481 Msg <<
"Cannot select: ";
4483 Msg.enable_colors(
errs().has_colors());
4489 Msg <<
"\nIn function: " <<
MF->
getName();
4491 bool HasInputChain =
N->getOperand(0).getValueType() == MVT::Other;
4492 unsigned iid =
N->getConstantOperandVal(HasInputChain);
4493 if (iid < Intrinsic::num_intrinsics)
4496 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[]
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 cl::opt< bool > DumpSortedDAG("dump-sorted-dags", cl::Hidden, cl::desc("Print DAGs with sorted nodes in debug dump"), cl::init(false))
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 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 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 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 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 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.
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 & 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)
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_CheckChild2CondCode
@ OPC_CheckPatternPredicateTwoByte
@ OPC_CheckPatternPredicate1
@ OPC_MorphNodeTo1GlueOutput
@ OPC_CaptureDeactivationSymbol
@ 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.
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.
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.
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