LLVM 20.0.0git
|
ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs. More...
#include "CodeGen/SelectionDAG/ScheduleDAGSDNodes.h"
Classes | |
class | RegDefIter |
RegDefIter - In place iteration over the values defined by an SUnit. More... | |
Public Member Functions | |
ScheduleDAGSDNodes (MachineFunction &mf) | |
~ScheduleDAGSDNodes () override=default | |
void | Run (SelectionDAG *dag, MachineBasicBlock *bb) |
Run - perform scheduling. | |
SUnit * | newSUnit (SDNode *N) |
NewSUnit - Creates a new SUnit and return a ptr to it. | |
SUnit * | Clone (SUnit *Old) |
Clone - Creates a clone of the specified SUnit. | |
void | BuildSchedGraph (AAResults *AA) |
BuildSchedGraph - Build the SUnit graph from the selection dag that we are input. | |
void | InitNumRegDefsLeft (SUnit *SU) |
InitNumRegDefsLeft - Determine the # of regs defined by this node. | |
virtual void | computeLatency (SUnit *SU) |
computeLatency - Compute node latency. | |
virtual void | computeOperandLatency (SDNode *Def, SDNode *Use, unsigned OpIdx, SDep &dep) const |
virtual void | Schedule ()=0 |
Schedule - Order nodes according to selected style, filling in the Sequence member. | |
void | VerifyScheduledSequence (bool isBottomUp) |
VerifyScheduledSequence - Verify that all SUnits are scheduled and consistent with the Sequence of scheduled instructions. | |
virtual MachineBasicBlock * | EmitSchedule (MachineBasicBlock::iterator &InsertPos) |
EmitSchedule - Insert MachineInstrs into the MachineBasicBlock according to the order specified in Sequence. | |
void | dumpNode (const SUnit &SU) const override |
void | dump () const override |
void | dumpSchedule () const |
std::string | getGraphNodeLabel (const SUnit *SU) const override |
Returns a label for an SUnit node in a visualization of the ScheduleDAG. | |
std::string | getDAGName () const override |
Return the basic block label. | |
virtual void | getCustomGraphFeatures (GraphWriter< ScheduleDAG * > &GW) const |
Public Member Functions inherited from llvm::ScheduleDAG | |
ScheduleDAG (const ScheduleDAG &)=delete | |
ScheduleDAG & | operator= (const ScheduleDAG &)=delete |
ScheduleDAG (MachineFunction &mf) | |
virtual | ~ScheduleDAG () |
void | clearDAG () |
Clears the DAG state (between regions). | |
const MCInstrDesc * | getInstrDesc (const SUnit *SU) const |
Returns the MCInstrDesc of this SUnit. | |
virtual void | viewGraph (const Twine &Name, const Twine &Title) |
Pops up a GraphViz/gv window with the ScheduleDAG rendered using 'dot'. | |
virtual void | viewGraph () |
Out-of-line implementation with no arguments is handy for gdb. | |
virtual void | dumpNode (const SUnit &SU) const =0 |
virtual void | dump () const =0 |
void | dumpNodeName (const SUnit &SU) const |
virtual std::string | getGraphNodeLabel (const SUnit *SU) const =0 |
Returns a label for an SUnit node in a visualization of the ScheduleDAG. | |
virtual std::string | getDAGName () const =0 |
Returns a label for the region of code covered by the DAG. | |
virtual void | addCustomGraphFeatures (GraphWriter< ScheduleDAG * > &) const |
Adds custom features for a visualization of the ScheduleDAG. | |
unsigned | VerifyScheduledDAG (bool isBottomUp) |
Verifies that all SUnits were scheduled and that their state is consistent. | |
Static Public Member Functions | |
static bool | isPassiveNode (SDNode *Node) |
isPassiveNode - Return true if the node is a non-scheduled leaf. | |
Public Attributes | |
MachineBasicBlock * | BB = nullptr |
SelectionDAG * | DAG = nullptr |
const InstrItineraryData * | InstrItins |
std::vector< SUnit * > | Sequence |
The schedule. Null SUnit*'s represent noop instructions. | |
Public Attributes inherited from llvm::ScheduleDAG | |
const TargetMachine & | TM |
Target processor. | |
const TargetInstrInfo * | TII |
Target instruction information. | |
const TargetRegisterInfo * | TRI |
Target processor register info. | |
MachineFunction & | MF |
Machine function. | |
MachineRegisterInfo & | MRI |
Virtual/real register map. | |
std::vector< SUnit > | SUnits |
The scheduling units. | |
SUnit | EntrySU |
Special node for the region entry. | |
SUnit | ExitSU |
Special node for the region exit. | |
bool | StressSched |
Protected Member Functions | |
virtual bool | forceUnitLatencies () const |
ForceUnitLatencies - Return true if all scheduling edges should be given a latency value of one. | |
Protected Member Functions inherited from llvm::ScheduleDAG | |
void | dumpNodeAll (const SUnit &SU) const |
ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
Edges between SUnits are initially based on edges in the SelectionDAG, and additional edges can be added by the schedulers as heuristics. SDNodes such as Constants, Registers, and a few others that are not interesting to schedulers are not allocated SUnits.
SDNodes with MVT::Glue operands are grouped along with the flagged nodes into a single SUnit so that they are scheduled together.
SDNode-based scheduling graphs do not use SDep::Anti or SDep::Output edges. Physical register dependence information is not carried in the DAG and must be handled explicitly by schedulers.
Definition at line 46 of file ScheduleDAGSDNodes.h.
|
explicit |
Definition at line 50 of file ScheduleDAGSDNodes.cpp.
|
overridedefault |
References Run().
void ScheduleDAGSDNodes::BuildSchedGraph | ( | AAResults * | AA | ) |
BuildSchedGraph - Build the SUnit graph from the selection dag that we are input.
This SUnit graph is similar to the SelectionDAG, but excludes nodes that aren't interesting to scheduling, and represents flagged together nodes with a single SUnit.
This SUnit graph is similar to the SelectionDAG, but excludes nodes that aren't interesting to scheduling, and represents glued together nodes with a single SUnit.
Definition at line 539 of file ScheduleDAGSDNodes.cpp.
Clone - Creates a clone of the specified SUnit.
It does not copy the predecessors / successors info nor the temporary scheduling states.
Definition at line 90 of file ScheduleDAGSDNodes.cpp.
References llvm::SUnit::getNode(), llvm::SUnit::hasPhysRegClobbers, llvm::SUnit::hasPhysRegDefs, llvm::SUnit::isCall, llvm::SUnit::isCallOp, llvm::SUnit::isCloned, llvm::SUnit::isCommutable, llvm::SUnit::isScheduleHigh, llvm::SUnit::isScheduleLow, llvm::SUnit::isTwoAddress, llvm::SUnit::isVRegCycle, llvm::SUnit::Latency, newSUnit(), llvm::SUnit::OrigNode, and llvm::SUnit::SchedulingPref.
|
virtual |
computeLatency - Compute node latency.
Definition at line 616 of file ScheduleDAGSDNodes.cpp.
References forceUnitLatencies(), llvm::TargetInstrInfo::getInstrLatency(), llvm::SUnit::getNode(), HighLatencyCycles, InstrItins, llvm::InstrItineraryData::isEmpty(), llvm::TargetInstrInfo::isHighLatencyDef(), llvm::SUnit::Latency, N, llvm::ScheduleDAG::TII, and llvm::ISD::TokenFactor.
|
virtual |
Definition at line 650 of file ScheduleDAGSDNodes.cpp.
References BB, llvm::ISD::CopyToReg, llvm::SDep::Data, forceUnitLatencies(), llvm::MCInstrInfo::get(), llvm::SDep::getKind(), llvm::MCInstrDesc::getNumDefs(), llvm::TargetInstrInfo::getOperandLatency(), InstrItins, llvm::Register::isVirtualRegister(), llvm::Latency, llvm::SDep::setLatency(), llvm::MachineBasicBlock::succ_empty(), and llvm::ScheduleDAG::TII.
|
overridevirtual |
Implements llvm::ScheduleDAG.
Definition at line 702 of file ScheduleDAGSDNodes.cpp.
References llvm::ScheduleDAG::dumpNodeAll(), llvm::ScheduleDAG::EntrySU, llvm::ScheduleDAG::ExitSU, llvm::SUnit::getNode(), and llvm::ScheduleDAG::SUnits.
Implements llvm::ScheduleDAG.
Definition at line 678 of file ScheduleDAGSDNodes.cpp.
References llvm::SmallVectorTemplateCommon< T, typename >::back(), DAG, llvm::dbgs(), llvm::SDNode::dump(), llvm::ScheduleDAG::dumpNodeName(), llvm::SmallVectorBase< Size_T >::empty(), llvm::SDNode::getGluedNode(), llvm::SUnit::getNode(), N, llvm::SmallVectorTemplateBase< T, bool >::pop_back(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by dumpSchedule().
void ScheduleDAGSDNodes::dumpSchedule | ( | ) | const |
Definition at line 714 of file ScheduleDAGSDNodes.cpp.
References llvm::dbgs(), dumpNode(), and Sequence.
|
virtual |
EmitSchedule - Insert MachineInstrs into the MachineBasicBlock according to the order specified in Sequence.
EmitSchedule - Emit the machine code in scheduled order.
Return the new InsertPos and MachineBasicBlock that contains this insertion point. ScheduleDAGSDNodes holds a BB pointer for convenience, but this does not necessarily refer to returned BB. The emitter may split blocks.
Definition at line 851 of file ScheduleDAGSDNodes.cpp.
References llvm::MachineFunction::addCallSiteInfo(), After, assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), BB, Before, llvm::SmallVectorTemplateCommon< T, typename >::begin(), llvm::MachineBasicBlock::begin(), llvm::MachineFunction::begin(), llvm::SelectionDAG::ByvalParmDbgBegin(), llvm::SelectionDAG::ByvalParmDbgEnd(), DAG, llvm::SelectionDAG::DbgBegin(), llvm::SelectionDAG::DbgEnd(), llvm::SelectionDAG::DbgLabelBegin(), llvm::SelectionDAG::DbgLabelEnd(), llvm::TargetOptions::EmitCallSiteInfo, Emitter, llvm::SmallVectorBase< Size_T >::empty(), llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::MachineBasicBlock::end(), End, llvm::SelectionDAG::getCallSiteInfo(), llvm::MachineBasicBlock::getFirstNonPHI(), llvm::MachineBasicBlock::getFirstTerminator(), llvm::SDNode::getGluedNode(), llvm::SelectionDAG::getHeapAllocSite(), llvm::SelectionDAG::getMMRAMetadata(), llvm::SUnit::getNode(), llvm::SelectionDAG::getNoMergeSiteInfo(), llvm::MachineBasicBlock::getParent(), llvm::SelectionDAG::getPCSections(), llvm::SelectionDAG::getTarget(), llvm::SelectionDAG::hasDebugValues(), I, llvm::MachineBasicBlock::insert(), llvm::TargetInstrInfo::insertNoop(), llvm::SUnit::isCloned, LHS, llvm::make_early_inc_range(), llvm::make_range(), llvm::ScheduleDAG::MF, MI, N, llvm::MachineInstr::NoMerge, llvm::TargetMachine::Options, llvm::SUnit::OrigNode, llvm::SmallVectorTemplateBase< T, bool >::pop_back(), ProcessSourceNode(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), RHS, Sequence, llvm::SmallVectorBase< Size_T >::size(), llvm::stable_sort(), and llvm::ScheduleDAG::TII.
|
inlineprotectedvirtual |
ForceUnitLatencies - Return true if all scheduling edges should be given a latency value of one.
The default is to return false; schedulers may override this as needed.
Definition at line 173 of file ScheduleDAGSDNodes.h.
Referenced by computeLatency(), and computeOperandLatency().
|
virtual |
Definition at line 305 of file SelectionDAGPrinter.cpp.
References DAG, llvm::GraphWriter< GraphType >::emitEdge(), llvm::GraphWriter< GraphType >::emitSimpleNode(), llvm::SDValue::getNode(), llvm::SelectionDAG::getRoot(), N, and llvm::ScheduleDAG::SUnits.
|
overridevirtual |
Return the basic block label.
Implements llvm::ScheduleDAG.
Definition at line 1095 of file ScheduleDAGSDNodes.cpp.
References BB, and llvm::MachineBasicBlock::getFullName().
Returns a label for an SUnit node in a visualization of the ScheduleDAG.
Implements llvm::ScheduleDAG.
Definition at line 284 of file SelectionDAGPrinter.cpp.
References llvm::SmallVectorTemplateCommon< T, typename >::back(), DAG, llvm::SmallVectorBase< Size_T >::empty(), llvm::SUnit::getNode(), N, llvm::SUnit::NodeNum, llvm::SmallVectorTemplateBase< T, bool >::pop_back(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
void ScheduleDAGSDNodes::InitNumRegDefsLeft | ( | SUnit * | SU | ) |
InitNumRegDefsLeft - Determine the # of regs defined by this node.
Definition at line 608 of file ScheduleDAGSDNodes.cpp.
References assert(), I, and llvm::SUnit::NumRegDefsLeft.
isPassiveNode - Return true if the node is a non-scheduled leaf.
Definition at line 65 of file ScheduleDAGSDNodes.h.
References llvm::ISD::EntryToken.
NewSUnit - Creates a new SUnit and return a ptr to it.
Definition at line 69 of file ScheduleDAGSDNodes.cpp.
References Addr, assert(), DAG, llvm::TargetLoweringBase::getSchedulingPreference(), llvm::SelectionDAG::getTargetLoweringInfo(), N, llvm::Sched::None, llvm::SUnit::SchedulingPref, and llvm::ScheduleDAG::SUnits.
Referenced by Clone().
void ScheduleDAGSDNodes::Run | ( | SelectionDAG * | dag, |
MachineBasicBlock * | bb | ||
) |
Run - perform scheduling.
Definition at line 55 of file ScheduleDAGSDNodes.cpp.
References BB, llvm::ScheduleDAG::clearDAG(), DAG, Schedule(), and Sequence.
Referenced by ~ScheduleDAGSDNodes().
|
pure virtual |
Schedule - Order nodes according to selected style, filling in the Sequence member.
Referenced by Run().
void ScheduleDAGSDNodes::VerifyScheduledSequence | ( | bool | isBottomUp | ) |
VerifyScheduledSequence - Verify that all SUnits are scheduled and consistent with the Sequence of scheduled instructions.
VerifyScheduledSequence - Verify that all SUnits were scheduled and that their state is consistent with the nodes listed in Sequence.
Definition at line 728 of file ScheduleDAGSDNodes.cpp.
References assert(), llvm::count(), Sequence, and llvm::ScheduleDAG::VerifyScheduledDAG().
MachineBasicBlock* llvm::ScheduleDAGSDNodes::BB = nullptr |
Definition at line 48 of file ScheduleDAGSDNodes.h.
Referenced by computeOperandLatency(), EmitSchedule(), getDAGName(), ProcessSDDbgValues(), and Run().
SelectionDAG* llvm::ScheduleDAGSDNodes::DAG = nullptr |
Definition at line 49 of file ScheduleDAGSDNodes.h.
Referenced by dumpNode(), EmitSchedule(), getCustomGraphFeatures(), getGraphNodeLabel(), newSUnit(), ProcessSDDbgValues(), ProcessSourceNode(), and Run().
const InstrItineraryData* llvm::ScheduleDAGSDNodes::InstrItins |
Definition at line 50 of file ScheduleDAGSDNodes.h.
Referenced by computeLatency(), and computeOperandLatency().
std::vector<SUnit*> llvm::ScheduleDAGSDNodes::Sequence |
The schedule. Null SUnit*'s represent noop instructions.
Definition at line 53 of file ScheduleDAGSDNodes.h.
Referenced by dumpSchedule(), EmitSchedule(), Run(), and VerifyScheduledSequence().