41#include "llvm/Config/llvm-config.h"
63#define DEBUG_TYPE "machine-scheduler"
67 cl::desc(
"Enable use of AA during MI DAG construction"));
74 cl::desc(
"Use TargetSchedModel for latency lookup"));
78 cl::desc(
"Use InstrItineraryData for latency lookup"));
88 cl::desc(
"The limit to use while constructing the DAG "
89 "prior to scheduling, at which point a trade-off "
90 "is made to avoid excessive compile time."));
92#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
95 cl::desc(
"Report top/bottom cycles when dumping SUnit instances"));
99#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
101 for (
const SUnit *SU : L) {
102 dbgs() <<
"SU(" << SU->NodeNum <<
")";
131 auto AllMMOsOkay = [&]() {
134 if (MMO->isVolatile() || MMO->isAtomic())
149 if (PSV->isAliased(&MFI))
152 bool MayAlias = PSV->mayAlias(&MFI);
154 }
else if (
const Value *V = MMO->getValue()) {
159 for (
Value *V : Objs) {
169 if (!AllMMOsOkay()) {
189 unsigned regioninstrs) {
190 assert(bb ==
BB &&
"startBlock should set BB");
210 unsigned OpIdx = MO.getOperandNo();
212 if (Reg.isPhysical()) {
223 for (MCRegUnit Unit :
TRI->regunits(Reg))
225 }
else if (Reg.isVirtual() && MO.readsReg()) {
234 for (
const auto &LI : Succ->liveins()) {
236 auto [Unit, Mask] = *U;
237 if ((Mask & LI.LaneMask).any() && !
Uses.contains(Unit))
258 bool ImplicitPseudoDef = (OperIdx >= DefMIDesc.
getNumOperands() &&
260 for (MCRegUnit Unit :
TRI->regunits(Reg)) {
270 int UseOpIdx =
I->OpIdx;
271 bool ImplicitPseudoUse =
false;
283 ImplicitPseudoUse = UseOpIdx >= ((int)UseMIDesc.
getNumOperands()) &&
288 if (!ImplicitPseudoDef && !ImplicitPseudoUse) {
290 UseInstr, UseOpIdx));
294 ST.adjustSchedDependency(SU, OperIdx, UseSU, UseOpIdx, Dep, &
SchedModel);
308 if (
MRI.isConstantPhysReg(Reg))
320 for (MCRegUnit Unit :
TRI->regunits(Reg)) {
333 SchedModel.computeOutputLatency(
MI, OperIdx, DefInstr));
335 ST.adjustSchedDependency(SU, OperIdx, DefSU,
I->OpIdx, Dep,
347 for (MCRegUnit Unit :
TRI->regunits(Reg))
355 for (MCRegUnit Unit :
TRI->regunits(Reg)) {
367 for (MCRegUnit Unit :
TRI->regunits(Reg)) {
371 for (
bool isBegin =
I ==
B; !isBegin; ) {
372 isBegin = (--
I) ==
B;
381 for (MCRegUnit Unit :
TRI->regunits(Reg))
397 return TRI->getSubRegIndexLaneMask(SubReg);
434 if (OtherMO.isReg() && OtherMO.isDef() && OtherMO.getReg() == Reg)
455 if ((LaneMask & KillLaneMask).
none()) {
460 if ((LaneMask & DefLaneMask).any()) {
466 ST.adjustSchedDependency(SU, OperIdx, UseSU,
I->OperandIndex, Dep,
471 LaneMask &= ~KillLaneMask;
473 if (LaneMask.
any()) {
474 I->LaneMask = LaneMask;
482 if (
MRI.hasOneDef(Reg))
496 if ((V2SU.LaneMask & LaneMask).none())
499 SUnit *DefSU = V2SU.SU;
515 LaneBitmask OverlapMask = V2SU.LaneMask & LaneMask;
516 LaneBitmask NonOverlapMask = V2SU.LaneMask & ~LaneMask;
518 V2SU.LaneMask = OverlapMask;
519 if (NonOverlapMask.
any())
535 assert(!
MI->isDebugOrPseudoInstr());
550 if ((PrevDefLaneMask & LaneMask).
none())
587 if (
MI.isDebugOrPseudoInstr())
612 switch (
SchedModel.getResourceBufferSize(PRE.ProcResourceIdx)) {
630 unsigned NumNodes = 0;
633 unsigned TrueMemOrderLatency;
654 assert(NumNodes >= Itr->second.size());
655 NumNodes -= Itr->second.size();
667 unsigned inline size()
const {
return NumNodes; }
672 for (
auto &
I : *
this)
673 NumNodes +=
I.second.size();
677 return TrueMemOrderLatency;
685 for (
auto &
I : Val2SUsMap)
694 if (Itr != Val2SUsMap.
end())
702 for (
auto &[V, SUs] : map) {
768 "Only BuildGraph should update Defs/Uses");
769 Defs.setUniverse(
TRI->getNumRegs());
770 Uses.setUniverse(
TRI->getNumRegs());
774 unsigned NumVirtRegs =
MRI.getNumVirtRegs();
792 if (
MI.isDebugValue() ||
MI.isDebugPHI()) {
797 if (
MI.isDebugLabel() ||
MI.isDebugRef() ||
MI.isPseudoProbe())
801 assert(SU &&
"No SUnit mapped to this MI");
810 if (PDiffs !=
nullptr)
816 RPTracker->
recede(RegOpers);
821 "Cannot schedule terminators or labels!");
828 bool HasVRegDef =
false;
829 for (
unsigned j = 0, n =
MI.getNumOperands(); j != n; ++j) {
834 if (Reg.isPhysical()) {
836 }
else if (Reg.isVirtual()) {
842 for (
unsigned j = 0, n =
MI.getNumOperands(); j != n; ++j) {
851 if (Reg.isPhysical()) {
853 }
else if (Reg.isVirtual() && MO.
readsReg()) {
876 if (
TII->isGlobalMemoryObject(&
MI)) {
883 LLVM_DEBUG(
dbgs() <<
"Global memory object and new barrier chain: SU("
898 if (
MI.mayRaiseFPException()) {
905 <<
"Creating barrier chain and clearing FPExceptions map.\n");
914 if (!
MI.mayStore() &&
915 !(
MI.mayLoad() && !
MI.isDereferenceableInvariantLoad()))
926 LLVM_DEBUG(
dbgs() <<
"Creating barrier chain and clearing maps.\n");
961 bool ThisMayAlias = UnderlObj.mayAlias();
971 bool ThisMayAlias = UnderlObj.mayAlias();
974 (ThisMayAlias ? Stores : NonAliasStores).insert(SU, V);
991 bool ThisMayAlias = UnderlObj.mayAlias();
998 (ThisMayAlias ? Loads : NonAliasLoads).insert(SU, V);
1018 PSV->printCustom(OS);
1023 for (
const auto &[ValType, SUs] : *
this) {
1027 dbgs() <<
"Unknown";
1029 V->printAsOperand(
dbgs());
1043 if (!MO.isReg() || !MO.readsReg())
1067 if (
MI.isDebugOrPseudoInstr())
1088 if (!
MI.isBundled()) {
1099 while (
I->isBundledWithSucc())
1102 if (!
I->isDebugOrPseudoInstr())
1105 }
while (
I != Bundle);
1111#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1122#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1123 if (
EntrySU.getInstr() !=
nullptr)
1127 if (
ExitSU.getInstr() !=
nullptr)
1147 return "dag." +
BB->getFullName();
1151 return SuccSU == &
ExitSU || !
Topo.IsReachable(PredSU, SuccSU);
1180 std::vector<std::pair<const SUnit *, const SUnit*>> ConnectionPairs;
1184 unsigned ParentNodeID;
1185 unsigned SubInstrCount = 0;
1188 RootData(
unsigned id): NodeID(
id),
1189 ParentNodeID(SchedDFSResult::InvalidSubtreeID) {}
1191 unsigned getSparseSetIndex()
const {
return NodeID; }
1198 RootSet.setUniverse(R.DFSNodeData.size());
1206 return R.DFSNodeData[SU->
NodeNum].SubtreeID
1207 != SchedDFSResult::InvalidSubtreeID;
1213 R.DFSNodeData[SU->
NodeNum].InstrCount =
1237 if ((
InstrCount - R.DFSNodeData[PredNum].InstrCount) < R.SubtreeLimit)
1241 if (R.DFSNodeData[PredNum].SubtreeID == PredNum) {
1244 if (RootSet[PredNum].ParentNodeID == SchedDFSResult::InvalidSubtreeID)
1245 RootSet[PredNum].ParentNodeID = SU->
NodeNum;
1247 else if (RootSet.count(PredNum)) {
1252 RData.SubInstrCount += RootSet[PredNum].SubInstrCount;
1253 RootSet.erase(PredNum);
1263 R.DFSNodeData[Succ->
NodeNum].InstrCount
1270 ConnectionPairs.emplace_back(PredDep.
getSUnit(), Succ);
1276 SubtreeClasses.compress();
1277 R.DFSTreeData.resize(SubtreeClasses.getNumClasses());
1278 assert(SubtreeClasses.getNumClasses() == RootSet.size()
1279 &&
"number of roots should match trees");
1280 for (
const RootData &Root : RootSet) {
1281 unsigned TreeID = SubtreeClasses[Root.NodeID];
1282 if (Root.ParentNodeID != SchedDFSResult::InvalidSubtreeID)
1283 R.DFSTreeData[TreeID].ParentTreeID = SubtreeClasses[Root.ParentNodeID];
1284 R.DFSTreeData[TreeID].SubInstrCount = Root.SubInstrCount;
1290 R.SubtreeConnections.resize(SubtreeClasses.getNumClasses());
1291 R.SubtreeConnectLevels.resize(SubtreeClasses.getNumClasses());
1293 for (
unsigned Idx = 0, End = R.DFSNodeData.size(); Idx != End; ++Idx) {
1294 R.DFSNodeData[Idx].SubtreeID = SubtreeClasses[Idx];
1296 << R.DFSNodeData[Idx].SubtreeID <<
'\n');
1298 for (
const auto &[Pred, Succ] : ConnectionPairs) {
1299 unsigned PredTree = SubtreeClasses[Pred->NodeNum];
1300 unsigned SuccTree = SubtreeClasses[Succ->NodeNum];
1301 if (PredTree == SuccTree)
1303 unsigned Depth = Pred->getDepth();
1313 bool CheckLimit =
true) {
1318 unsigned PredNum = PredSU->
NodeNum;
1319 if (R.DFSNodeData[PredNum].SubtreeID != PredNum)
1324 unsigned NumDataSucs = 0;
1325 for (
const SDep &SuccDep : PredSU->
Succs) {
1327 if (++NumDataSucs >= 4)
1331 if (CheckLimit && R.DFSNodeData[PredNum].InstrCount > R.SubtreeLimit)
1333 R.DFSNodeData[PredNum].SubtreeID = Succ->
NodeNum;
1334 SubtreeClasses.join(Succ->
NodeNum, PredNum);
1345 R.SubtreeConnections[FromTree];
1346 for (SchedDFSResult::Connection &
C : Connections) {
1347 if (
C.TreeID == ToTree) {
1348 C.Level = std::max(
C.Level,
Depth);
1352 Connections.
push_back(SchedDFSResult::Connection(ToTree,
Depth));
1353 FromTree = R.DFSTreeData[FromTree].ParentTreeID;
1354 }
while (FromTree != SchedDFSResult::InvalidSubtreeID);
1363class SchedDAGReverseDFS {
1364 std::vector<std::pair<const SUnit *, SUnit::const_pred_iterator>> DFSStack;
1367 bool isComplete()
const {
return DFSStack.empty(); }
1369 void follow(
const SUnit *SU) {
1370 DFSStack.emplace_back(SU, SU->
Preds.begin());
1372 void advance() { ++DFSStack.back().second; }
1374 const SDep *backtrack() {
1375 DFSStack.pop_back();
1376 return DFSStack.empty() ? nullptr : std::prev(DFSStack.back().second);
1379 const SUnit *getCurr()
const {
return DFSStack.back().first; }
1384 return getCurr()->Preds.
end();
1410 SchedDAGReverseDFS DFS;
1411 Impl.visitPreorder(&SU);
1415 while (DFS.getPred() != DFS.getPredEnd()) {
1416 const SDep &PredDep = *DFS.getPred();
1424 if (Impl.isVisited(PredDep.
getSUnit())) {
1425 Impl.visitCrossEdge(PredDep, DFS.getCurr());
1428 Impl.visitPreorder(PredDep.
getSUnit());
1432 const SUnit *Child = DFS.getCurr();
1433 const SDep *PredDep = DFS.backtrack();
1434 Impl.visitPostorderNode(Child);
1436 Impl.visitPostorderEdge(*PredDep, DFS.getCurr());
1437 if (DFS.isComplete())
1448 for (
const Connection &
C : SubtreeConnections[SubtreeID]) {
1449 SubtreeConnectLevels[
C.TreeID] =
1450 std::max(SubtreeConnectLevels[
C.TreeID],
C.Level);
1452 << SubtreeConnectLevels[
C.TreeID] <<
'\n');
1456#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1466 dbgs() << *
this <<
'\n';
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static cl::opt< bool > UseAA("aarch64-use-aa", cl::init(true), cl::desc("Enable the use of AA during codegen."))
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static unsigned InstrCount
static Register UseReg(const MachineOperand &MO)
Equivalence classes for small integers.
A common definition of LaneBitmask for use in TableGen and CodeGen.
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
This file implements a map that provides insertion order iteration.
MachineInstr unsigned OpIdx
static void toggleKills(const MachineRegisterInfo &MRI, LiveRegUnits &LiveRegs, MachineInstr &MI, bool addToLiveRegs)
static bool getUnderlyingObjectsForInstr(const MachineInstr *MI, const MachineFrameInfo &MFI, UnderlyingObjectsVector &Objects, const DataLayout &DL)
If this machine instr has memory reference information and it can be tracked to a normal reference to...
static bool hasDataSucc(const SUnit *SU)
static cl::opt< bool > EnableSchedModel("schedmodel", cl::Hidden, cl::init(true), cl::desc("Use TargetSchedModel for latency lookup"))
static cl::opt< bool > EnableAASchedMI("enable-aa-sched-mi", cl::Hidden, cl::desc("Enable use of AA during MI DAG construction"))
static void dumpSUList(const ScheduleDAGInstrs::SUList &L)
static cl::opt< bool > UseTBAA("use-tbaa-in-sched-mi", cl::Hidden, cl::init(true), cl::desc("Enable use of TBAA during MI DAG construction"))
static cl::opt< unsigned > HugeRegion("dag-maps-huge-region", cl::Hidden, cl::init(500), cl::desc("The limit to use while constructing the DAG " "prior to scheduling, at which point a trade-off " "is made to avoid excessive compile time."))
static cl::opt< bool > EnableSchedItins("scheditins", cl::Hidden, cl::init(true), cl::desc("Use InstrItineraryData for latency lookup"))
static cl::opt< bool > SchedPrintCycles("sched-print-cycles", cl::Hidden, cl::init(false), cl::desc("Report top/bottom cycles when dumping SUnit instances"))
This file defines the SmallVector class.
This file defines the SparseSet class derived from the version described in Briggs,...
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
void reComputeSize()
Counts the number of SUs in this map after a reduction.
void insert(SUnit *SU, ValueType V)
Adds SU to the SUList of V.
void clear()
Clears map from all contents.
Value2SUsMap(unsigned lat=0)
void clearList(ValueType V)
Clears the list of SUs mapped to V.
ValueType & operator[](const SUList &Key)
To keep NumNodes up to date, insert() is used instead of this operator w/ push_back().
unsigned getTrueMemOrderLatency() const
Represent a constant reference to an array (0 or more elements consecutively in memory),...
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
A parsed version of the target data layout string in and methods for querying it.
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
A set of register units used to track register liveness.
Describe properties that are true of each instruction in the target description file.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
bool hasImplicitUseOfPhysReg(MCRegister Reg) const
Return true if this instruction implicitly uses the specified physical register.
LLVM_ABI bool hasImplicitDefOfPhysReg(MCRegister Reg, const MCRegisterInfo *MRI=nullptr) const
Return true if this instruction implicitly defines the specified physical register.
MCRegUnitMaskIterator enumerates a list of register units and their associated lane masks for Reg.
bool isValid() const
Returns true if this iterator is not yet at the end.
Instructions::iterator instr_iterator
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasTailCall() const
Returns true if the function contains a tail call.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Representation of each machine instruction.
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
bool isCall(QueryType Type=AnyInBundle) const
LLVM_ABI bool mayAlias(BatchAAResults *AA, const MachineInstr &Other, bool UseTBAA) const
Returns true if this instruction's memory access aliases the memory access of Other.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
LLVM_ABI void print(raw_ostream &OS, bool IsStandalone=true, bool SkipOpers=false, bool SkipDebugLoc=false, bool AddNewLine=true, const TargetInstrInfo *TII=nullptr) const
Print this MI to OS.
filtered_mop_range all_uses()
Returns an iterator range over all operands that are (explicit or implicit) register uses.
bool isTransient() const
Return true if this is a transient instruction that is either very likely to be eliminated during reg...
LLVM_ABI void dump() const
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
void setIsKill(bool Val=true)
void setIsUndef(bool Val=true)
Register getReg() const
getReg - Returns the register number.
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
iterator find(const ValueType &Key)
typename SmallVector< std::pair< ValueType, SUList >, N >::iterator iterator
ValueT & operator[](const KeyT &Key)
LLVM_ABI void addInstruction(unsigned Idx, const RegisterOperands &RegOpers, const MachineRegisterInfo &MRI)
Record pressure difference induced by the given operand list to node with index Idx.
LLVM_ABI void init(unsigned N)
Initialize an array of N PressureDiffs.
Special value supplied for machine level alias analysis.
Track the current register pressure at some position in the instruction stream, and remember the high...
LLVM_ABI void recede(SmallVectorImpl< VRegMaskOrUnit > *LiveUses=nullptr)
Recede across the previous instruction.
LLVM_ABI void recedeSkipDebugValues()
Recede until we find an instruction which is not a DebugValue.
MachineBasicBlock::const_iterator getPos() const
Get the MI position corresponding to this register pressure.
List of registers defined and used by a machine instruction.
LLVM_ABI void collect(const MachineInstr &MI, const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, bool TrackLaneMasks, bool IgnoreDead)
Analyze the given instruction MI and fill in the Uses, Defs and DeadDefs list based on the MachineOpe...
LLVM_ABI void adjustLaneLiveness(const LiveIntervals &LIS, const MachineRegisterInfo &MRI, SlotIndex Pos, MachineInstr *AddFlagsMI=nullptr)
Use liveness information to find out which uses/defs are partially undefined/dead and adjust the VReg...
Wrapper class representing virtual and physical registers.
Kind getKind() const
Returns an enum value representing the kind of the dependence.
Kind
These are the different kinds of scheduling dependencies.
@ Output
A register output-dependence (aka WAW).
@ Anti
A register anti-dependence (aka WAR).
@ Data
Regular data dependence (aka true-dependence).
void setLatency(unsigned Lat)
Sets the latency for this edge.
@ Artificial
Arbitrary strong DAG edge (no real dependence).
@ MayAliasMem
Nonvolatile load/Store instructions that may alias.
bool isArtificial() const
Tests if this is an Order dependence that is marked as "artificial", meaning it isn't necessary for c...
Scheduling unit. This is a node in the scheduling DAG.
bool isCall
Is a function call.
unsigned TopReadyCycle
Cycle relative to start when node is ready.
unsigned NodeNum
Entry # of node in the node vector.
bool isUnbuffered
Uses an unbuffered resource.
SmallVectorImpl< SDep >::const_iterator const_pred_iterator
unsigned short Latency
Node latency.
bool isBoundaryNode() const
Boundary nodes are placeholders for the boundary of the scheduling region.
bool hasPhysRegDefs
Has physreg defs that are being used.
unsigned BotReadyCycle
Cycle relative to end when node is ready.
SmallVector< SDep, 4 > Succs
All sunit successors.
bool hasReservedResource
Uses a reserved resource.
bool isCommutable
Is a commutable instruction.
bool hasPhysRegUses
Has physreg uses.
SmallVector< SDep, 4 > Preds
All sunit predecessors.
LLVM_ABI bool addPred(const SDep &D, bool Required=true)
Adds the specified edge as a pred of the current node if not already.
MachineInstr * getInstr() const
Returns the representative MachineInstr for this SUnit.
void visitPostorderNode(const SUnit *SU)
Called once for each node after all predecessors are visited.
bool joinPredSubtree(const SDep &PredDep, const SUnit *Succ, bool CheckLimit=true)
Joins the predecessor subtree with the successor that is its DFS parent.
void addConnection(unsigned FromTree, unsigned ToTree, unsigned Depth)
Called by finalize() to record a connection between trees.
void finalize()
Sets each node's subtree ID to the representative ID and record connections between trees.
void visitCrossEdge(const SDep &PredDep, const SUnit *Succ)
Adds a connection for cross edges.
void visitPostorderEdge(const SDep &PredDep, const SUnit *Succ)
Called once for each tree edge after calling visitPostOrderNode on the predecessor.
void visitPreorder(const SUnit *SU)
Initializes this node's instruction count.
bool isVisited(const SUnit *SU) const
Returns true if this node been visited by the DFS traversal.
SchedDFSImpl(SchedDFSResult &r)
Compute the values of each DAG node for various metrics during DFS.
friend class SchedDFSImpl
LLVM_ABI void compute(ArrayRef< SUnit > SUnits)
Compute various metrics for the DAG with given roots.
LLVM_ABI void scheduleTree(unsigned SubtreeID)
Scheduler callback to update SubtreeConnectLevels when a tree is initially scheduled.
LiveRegUnits LiveRegs
Set of live physical registers for updating kill flags.
DenseMap< MachineInstr *, SUnit * > MISUnitMap
After calling BuildSchedGraph, each machine instruction in the current scheduling region is mapped to...
void addVRegUseDeps(SUnit *SU, unsigned OperIdx)
Adds a register data dependency if the instruction that defines the virtual register used at OperIdx ...
void addVRegDefDeps(SUnit *SU, unsigned OperIdx)
Adds register output and data dependencies from this SUnit to instructions that occur later in the sa...
virtual void finishBlock()
Cleans up after scheduling in the given block.
MachineBasicBlock::iterator end() const
Returns an iterator to the bottom of the current scheduling region.
std::string getDAGName() const override
Returns a label for the region of code covered by the DAG.
MachineBasicBlock * BB
The block in which to insert instructions.
MachineInstr * FirstDbgValue
virtual void startBlock(MachineBasicBlock *BB)
Prepares to perform scheduling in the given block.
bool CanHandleTerminators
The standard DAG builder does not normally include terminators as DAG nodes because it does not creat...
void addBarrierChain(Value2SUsMap &map)
Adds barrier chain edges from all SUs in map, and then clear the map.
void addPhysRegDeps(SUnit *SU, unsigned OperIdx)
Adds register dependencies (data, anti, and output) from this SUnit to following instructions in the ...
MachineBasicBlock::iterator RegionEnd
The end of the range to be scheduled.
VReg2SUnitOperIdxMultiMap CurrentVRegUses
Tracks the last instructions in this region using each virtual register.
void addChainDependencies(SUnit *SU, SUList &SUs, unsigned Latency)
Adds dependencies as needed from all SUs in list to SU.
const MCSchedClassDesc * getSchedClass(SUnit *SU) const
Resolves and cache a resolved scheduling class for an SUnit.
void fixupKills(MachineBasicBlock &MBB)
Fixes register kill flags that scheduling has made invalid.
void addPhysRegDataDeps(SUnit *SU, unsigned OperIdx)
MO is an operand of SU's instruction that defines a physical register.
ScheduleDAGInstrs(MachineFunction &mf, const MachineLoopInfo *mli, bool RemoveKillFlags=false)
LaneBitmask getLaneMaskForMO(const MachineOperand &MO) const
Returns a mask for which lanes get read/written by the given (register) machine operand.
DbgValueVector DbgValues
Remember instruction that precedes DBG_VALUE.
SUnit * newSUnit(MachineInstr *MI)
Creates a new SUnit and return a ptr to it.
void initSUnits()
Creates an SUnit for each real instruction, numbered in top-down topological order.
bool addEdge(SUnit *SuccSU, const SDep &PredDep)
Add a DAG edge to the given SU with the given predecessor dependence data.
ScheduleDAGTopologicalSort Topo
Topo - A topological ordering for SUnits which permits fast IsReachable and similar queries.
std::list< SUnit * > SUList
A list of SUnits, used in Value2SUsMap, during DAG construction.
SUnit * BarrierChain
Remember a generic side-effecting instruction as we proceed.
BatchAAResults * getAAForDep() const
Returns a (possibly null) pointer to the current BatchAAResults.
bool TrackLaneMasks
Whether lane masks should get tracked.
void dumpNode(const SUnit &SU) const override
RegUnit2SUnitsMap Defs
Defs, Uses - Remember where defs and uses of each register are as we iterate upward through the instr...
UndefValue * UnknownValue
For an unanalyzable memory access, this Value is used in maps.
VReg2SUnitMultiMap CurrentVRegDefs
Tracks the last instruction(s) in this region defining each virtual register.
MachineBasicBlock::iterator begin() const
Returns an iterator to the top of the current scheduling region.
void buildSchedGraph(AAResults *AA, RegPressureTracker *RPTracker=nullptr, PressureDiffs *PDiffs=nullptr, LiveIntervals *LIS=nullptr, bool TrackLaneMasks=false)
Builds SUnits for the current region.
TargetSchedModel SchedModel
TargetSchedModel provides an interface to the machine model.
virtual void exitRegion()
Called when the scheduler has finished scheduling the current region.
bool canAddEdge(SUnit *SuccSU, SUnit *PredSU)
True if an edge can be added from PredSU to SuccSU without creating a cycle.
const MachineLoopInfo * MLI
bool RemoveKillFlags
True if the DAG builder should remove kill flags (in preparation for rescheduling).
std::optional< BatchAAResults > AAForDep
MachineBasicBlock::iterator RegionBegin
The beginning of the range to be scheduled.
void addSchedBarrierDeps()
Adds dependencies from instructions in the current list of instructions being scheduled to scheduling...
virtual void enterRegion(MachineBasicBlock *bb, MachineBasicBlock::iterator begin, MachineBasicBlock::iterator end, unsigned regioninstrs)
Initialize the DAG and common scheduler state for a new scheduling region.
void dump() const override
void addChainDependency(SUnit *SUa, SUnit *SUb, unsigned Latency=0)
Adds a chain edge between SUa and SUb, but only if both AAResults and Target fail to deny the depende...
unsigned NumRegionInstrs
Instructions in this region (distance(RegionBegin, RegionEnd)).
const MachineFrameInfo & MFI
bool deadDefHasNoUse(const MachineOperand &MO)
Returns true if the def register in MO has no uses.
std::string getGraphNodeLabel(const SUnit *SU) const override
Returns a label for a DAG node that points to an instruction.
MachineRegisterInfo & MRI
Virtual/real register map.
void clearDAG()
Clears the DAG state (between regions).
const TargetInstrInfo * TII
Target instruction information.
std::vector< SUnit > SUnits
The scheduling units.
const TargetRegisterInfo * TRI
Target processor register info.
SUnit EntrySU
Special node for the region entry.
MachineFunction & MF
Machine function.
ScheduleDAG(const ScheduleDAG &)=delete
void dumpNodeAll(const SUnit &SU) const
void dumpNodeName(const SUnit &SU) const
SUnit ExitSU
Special node for the region exit.
SlotIndex - An opaque wrapper around machine indexes.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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.
std::pair< iterator, iterator > RangePair
iterator_base< SparseMultiSet * > iterator
SparseSet - Fast set implementation for objects that can be identified by small unsigned keys.
TargetInstrInfo - Interface to description of machine instruction set.
const bool HasDisjunctSubRegs
Whether the class supports two (or more) disjunct subregister indices.
LaneBitmask getLaneMask() const
Returns the combination of all lane masks of register in this class.
TargetSubtargetInfo - Generic base class for all target subtargets.
The instances of the Type class are immutable: once they are created, they are never changed.
'undef' values are things that do not have specified contents.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI bool getUnderlyingObjectsForCodeGen(const Value *V, SmallVectorImpl< Value * > &Objects)
This is a wrapper around getUnderlyingObjects and adds support for basic ptrtoint+arithmetic+inttoptr...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
auto reverse(ContainerTy &&C)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
IterT skipDebugInstructionsBackward(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It until it points to a non-debug instruction or to Begin and return the resulting iterator...
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...
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
SmallVector< UnderlyingObject, 4 > UnderlyingObjectsVector
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
Represent the ILP of the subDAG rooted at a DAG node.
unsigned Length
Length may either correspond to depth or height, depending on direction, and cycles or nodes dependin...
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &OS) const
static constexpr LaneBitmask getAll()
constexpr bool any() const
Summarize the scheduling resources required for an instruction of a particular scheduling class.
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
Record a physical register access.
A MapVector that performs no allocations if smaller than a certain size.
Mapping from virtual register to SUnit including an operand index.
An individual mapping from virtual register number to SUnit.