41 #include "llvm/Config/llvm-config.h" 67 #define DEBUG_TYPE "machine-scheduler" 71 cl::desc(
"Enable use of AA during MI DAG construction"));
84 "prior to scheduling, at which point a trade-off " 85 "is made to avoid excessive compile time."));
89 cl::desc(
"A huge scheduling region will have maps reduced by this many " 90 "nodes at a time. Defaults to HugeRegion / 2."));
101 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 103 for (
const SUnit *su : L) {
104 dbgs() <<
"SU(" << su->NodeNum <<
")";
114 bool RemoveKillFlags)
115 :
ScheduleDAG(mf), MLI(mli), MFI(mf.getFrameInfo()),
116 RemoveKillFlags(RemoveKillFlags),
133 auto allMMOsOkay = [&]() {
135 if (MMO->isVolatile())
150 if (PSV->isAliased(&MFI))
153 bool MayAlias = PSV->mayAlias(&MFI);
155 }
else if (
const Value *V = MMO->getValue()) {
160 for (
Value *V : Objs) {
170 if (!allMMOsOkay()) {
190 unsigned regioninstrs) {
191 assert(bb ==
BB &&
"startBlock should set BB");
207 if (!MO.isReg() || MO.isDef())
continue;
208 unsigned Reg = MO.getReg();
220 for (
const auto &LI : Succ->liveins()) {
240 bool ImplicitPseudoDef = (OperIdx >= DefMIDesc->
getNumOperands() &&
253 int UseOp =
I->OpIdx;
267 bool ImplicitPseudoUse =
270 if (!ImplicitPseudoDef && !ImplicitPseudoUse) {
273 ST.adjustSchedDependency(SU, UseSU, Dep);
313 SDep Dep(SU, Kind, *Alias);
349 for (
bool isBegin = I == B; !isBegin; ) {
350 isBegin = (--
I) == B;
406 "Dead defs should have no uses");
414 if ((LaneMask & KillLaneMask).none()) {
419 if ((LaneMask & DefLaneMask).any()) {
429 LaneMask &= ~KillLaneMask;
431 if (LaneMask.
any()) {
432 I->LaneMask = LaneMask;
454 if ((V2SU.LaneMask & LaneMask).none())
457 SUnit *DefSU = V2SU.SU;
473 LaneBitmask OverlapMask = V2SU.LaneMask & LaneMask;
474 LaneBitmask NonOverlapMask = V2SU.LaneMask & ~LaneMask;
476 V2SU.LaneMask = OverlapMask;
477 if (NonOverlapMask.
any())
506 if ((PrevDefLaneMask & LaneMask).none())
549 if (
MI.isDebugInstr())
591 unsigned NumNodes = 0;
594 unsigned TrueMemOrderLatency;
615 assert(NumNodes >= Itr->second.size());
616 NumNodes -= Itr->second.size();
628 unsigned inline size()
const {
return NumNodes; }
633 for (
auto &
I : *
this)
634 NumNodes +=
I.second.size();
638 return TrueMemOrderLatency;
646 for (
auto &
I : Val2SUsMap)
648 Val2SUsMap.getTrueMemOrderLatency());
655 if (Itr != Val2SUsMap.
end())
663 for (
auto &
I : map) {
677 SUList &sus = CurrItr->second;
678 SUList::iterator SUItr = sus.begin(), SUEE = sus.end();
679 for (; SUItr != SUEE; ++SUItr) {
692 if (SUItr != sus.begin())
693 sus.erase(sus.begin(), SUItr);
697 map.
remove_if([&](std::pair<ValueType, SUList> &mapEntry) {
698 return (mapEntry.second.empty()); });
752 "Only BuildGraph should update Defs/Uses");
772 DbgValues.push_back(std::make_pair(DbgMI, &MI));
784 assert(SU &&
"No SUnit mapped to this MI");
789 if (TrackLaneMasks) {
793 if (PDiffs !=
nullptr)
798 assert(&*RPTracker->
getPos() == &MI &&
"RPTracker in sync");
799 RPTracker->
recede(RegOpers);
804 "Cannot schedule terminators or labels!");
811 bool HasVRegDef =
false;
865 LLVM_DEBUG(
dbgs() <<
"Global memory object and new barrier chain: SU(" 908 bool ThisMayAlias = UnderlObj.mayAlias();
918 bool ThisMayAlias = UnderlObj.mayAlias();
921 (ThisMayAlias ? Stores : NonAliasStores).insert(SU, V);
938 bool ThisMayAlias = UnderlObj.mayAlias();
945 (ThisMayAlias ? Loads : NonAliasLoads).insert(SU, V);
959 dbgs() <<
"Reducing NonAliasStores and NonAliasLoads maps.\n";);
974 PSV->printCustom(OS);
979 for (
auto &Itr : *
this) {
980 if (Itr.first.is<
const Value*>()) {
981 const Value *V = Itr.first.get<
const Value*>();
982 if (isa<UndefValue>(V))
1000 dbgs() <<
"Loading SUnits:\n"; loads.
dump());
1003 std::vector<unsigned> NodeNums;
1004 NodeNums.reserve(stores.
size() + loads.
size());
1005 for (
auto &
I : stores)
1006 for (
auto *SU :
I.second)
1007 NodeNums.push_back(SU->NodeNum);
1008 for (
auto &
I : loads)
1009 for (
auto *SU :
I.second)
1010 NodeNums.push_back(SU->NodeNum);
1016 assert(N <= NodeNums.size());
1017 SUnit *newBarrierChain = &
SUnits[*(NodeNums.end() -
N)];
1039 LLVM_DEBUG(
dbgs() <<
"After reduction:\nStoring SUnits:\n"; stores.dump();
1040 dbgs() <<
"Loading SUnits:\n"; loads.dump());
1046 if (!MO.isReg() || !MO.readsReg())
1048 unsigned Reg = MO.getReg();
1053 bool IsKill = LiveRegs.
available(MRI, Reg);
1054 MO.setIsKill(IsKill);
1068 if (
MI.isDebugInstr())
1089 if (!
MI.isBundled()) {
1093 if (
MI.isBundle()) {
1101 while (I->isBundledWithSucc())
1104 if (!I->isDebugInstr())
1107 }
while(I != First);
1113 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1121 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1162 std::vector<std::pair<const SUnit *, const SUnit*>> ConnectionPairs;
1166 unsigned ParentNodeID;
1167 unsigned SubInstrCount = 0;
1170 RootData(
unsigned id): NodeID(
id),
1171 ParentNodeID(SchedDFSResult::InvalidSubtreeID) {}
1173 unsigned getSparseSetIndex()
const {
return NodeID; }
1188 return R.DFSNodeData[SU->
NodeNum].SubtreeID
1189 != SchedDFSResult::InvalidSubtreeID;
1195 R.DFSNodeData[SU->
NodeNum].InstrCount =
1219 if ((InstrCount - R.DFSNodeData[PredNum].InstrCount) < R.SubtreeLimit)
1220 joinPredSubtree(PredDep, SU,
false);
1223 if (R.DFSNodeData[PredNum].SubtreeID == PredNum) {
1226 if (RootSet[PredNum].ParentNodeID == SchedDFSResult::InvalidSubtreeID)
1227 RootSet[PredNum].ParentNodeID = SU->
NodeNum;
1229 else if (RootSet.
count(PredNum)) {
1234 RData.SubInstrCount += RootSet[PredNum].SubInstrCount;
1235 RootSet.
erase(PredNum);
1245 R.DFSNodeData[Succ->
NodeNum].InstrCount
1247 joinPredSubtree(PredDep, Succ);
1252 ConnectionPairs.push_back(std::make_pair(PredDep.
getSUnit(), Succ));
1261 &&
"number of roots should match trees");
1262 for (
const RootData &Root : RootSet) {
1263 unsigned TreeID = SubtreeClasses[Root.NodeID];
1264 if (Root.ParentNodeID != SchedDFSResult::InvalidSubtreeID)
1265 R.DFSTreeData[TreeID].ParentTreeID = SubtreeClasses[Root.ParentNodeID];
1266 R.DFSTreeData[TreeID].SubInstrCount = Root.SubInstrCount;
1272 R.SubtreeConnections.resize(SubtreeClasses.
getNumClasses());
1273 R.SubtreeConnectLevels.resize(SubtreeClasses.
getNumClasses());
1275 for (
unsigned Idx = 0, End = R.DFSNodeData.size(); Idx != End; ++Idx) {
1276 R.DFSNodeData[Idx].SubtreeID = SubtreeClasses[Idx];
1278 << R.DFSNodeData[Idx].SubtreeID <<
'\n');
1280 for (
const std::pair<const SUnit*, const SUnit*> &
P : ConnectionPairs) {
1281 unsigned PredTree = SubtreeClasses[
P.first->NodeNum];
1282 unsigned SuccTree = SubtreeClasses[
P.second->NodeNum];
1283 if (PredTree == SuccTree)
1285 unsigned Depth =
P.first->getDepth();
1286 addConnection(PredTree, SuccTree, Depth);
1287 addConnection(SuccTree, PredTree, Depth);
1295 bool CheckLimit =
true) {
1300 unsigned PredNum = PredSU->
NodeNum;
1301 if (R.DFSNodeData[PredNum].SubtreeID != PredNum)
1306 unsigned NumDataSucs = 0;
1307 for (
const SDep &SuccDep : PredSU->Succs) {
1309 if (++NumDataSucs >= 4)
1313 if (CheckLimit && R.DFSNodeData[PredNum].InstrCount > R.SubtreeLimit)
1315 R.DFSNodeData[PredNum].SubtreeID = Succ->
NodeNum;
1327 R.SubtreeConnections[FromTree];
1328 for (SchedDFSResult::Connection &
C : Connections) {
1329 if (
C.TreeID == ToTree) {
1334 Connections.push_back(SchedDFSResult::Connection(ToTree, Depth));
1335 FromTree = R.DFSTreeData[FromTree].ParentTreeID;
1336 }
while (FromTree != SchedDFSResult::InvalidSubtreeID);
1345 class SchedDAGReverseDFS {
1346 std::vector<std::pair<const SUnit *, SUnit::const_pred_iterator>> DFSStack;
1349 bool isComplete()
const {
return DFSStack.
empty(); }
1351 void follow(
const SUnit *SU) {
1352 DFSStack.push_back(std::make_pair(SU, SU->
Preds.begin()));
1354 void advance() { ++DFSStack.back().second; }
1356 const SDep *backtrack() {
1357 DFSStack.pop_back();
1358 return DFSStack.empty() ? nullptr : std::prev(DFSStack.back().second);
1361 const SUnit *getCurr()
const {
return DFSStack.back().first; }
1366 return getCurr()->
Preds.end();
1388 for (
const SUnit &SU : SUnits) {
1392 SchedDAGReverseDFS
DFS;
1397 while (DFS.getPred() != DFS.getPredEnd()) {
1398 const SDep &PredDep = *DFS.getPred();
1414 const SUnit *Child = DFS.getCurr();
1415 const SDep *PredDep = DFS.backtrack();
1419 if (DFS.isComplete())
1430 for (
const Connection &
C : SubtreeConnections[SubtreeID]) {
1431 SubtreeConnectLevels[
C.TreeID] =
1432 std::max(SubtreeConnectLevels[
C.TreeID],
C.Level);
1434 << SubtreeConnectLevels[
C.TreeID] <<
'\n');
1438 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1440 OS <<
InstrCount <<
" / " << Length <<
" = ";
1448 dbgs() << *
this <<
'\n';
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...
iterator end()
Returns an iterator past this container.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
void addInstruction(unsigned Idx, const RegisterOperands &RegOpers, const MachineRegisterInfo &MRI)
Record pressure difference induced by the given operand list to node with index Idx.
A parsed version of the target data layout string in and methods for querying it. ...
virtual void finishBlock()
Cleans up after scheduling in the given block.
bool joinPredSubtree(const SDep &PredDep, const SUnit *Succ, bool CheckLimit=true)
Joins the predecessor subtree with the successor that is its DFS parent.
bool isDebugLabel() const
A common definition of LaneBitmask for use in TableGen and CodeGen.
ValueType & operator[](const SUList &Key)
To keep NumNodes up to date, insert() is used instead of this operator w/ push_back().
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
bool isCall(QueryType Type=AnyInBundle) const
iterator_base< SparseMultiSet *> iterator
ProcResIter getWriteProcResBegin(const MCSchedClassDesc *SC) const
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
iterator insert(const ValueT &Val)
Insert a new element at the tail of the subset list.
void dump() const override
void insert(SUnit *SU, ValueType V)
Adds SU to the SUList of V.
This class represents lattice values for constants.
void init(unsigned N)
Initialize an array of N PressureDiffs.
Record a physical register access.
bool contains(const KeyT &Key) const
Returns true if this set contains an element identified by Key.
void addVRegDefDeps(SUnit *SU, unsigned OperIdx)
Adds register output and data dependencies from this SUnit to instructions that occur later in the sa...
static cl::opt< unsigned > HugeRegion("dag-maps-huge-region", cl::Hidden, cl::init(1000), 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."))
LivePhysRegs LiveRegs
Set of live physical registers for updating kill flags.
bool TrackLaneMasks
Whether lane masks should get tracked.
const MCSchedClassDesc * getSchedClass(SUnit *SU) const
Resolves and cache a resolved scheduling class for an SUnit.
void push_back(const T &Elt)
This provides a very simple, boring adaptor for a begin and end iterator into a range type...
Describe properties that are true of each instruction in the target description file.
unsigned getReg() const
getReg - Returns the register number.
unsigned getOperandNo(const_mop_iterator I) const
Returns the number of the operand iterator I points to.
void setIsUndef(bool Val=true)
Represent the ILP of the subDAG rooted at a DAG node.
static bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
static cl::opt< unsigned > ReductionSize("dag-maps-reduction-size", cl::Hidden, cl::desc("A huge scheduling region will have maps reduced by this many " "nodes at a time. Defaults to HugeRegion / 2."))
TargetSchedModel SchedModel
TargetSchedModel provides an interface to the machine model.
void fixupKills(MachineBasicBlock &MBB)
Fixes register kill flags that scheduling has made invalid.
unsigned getSubReg() const
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
void compress()
compress - Compress equivalence classes by numbering them 0 .
bool CanHandleTerminators
The standard DAG builder does not normally include terminators as DAG nodes because it does not creat...
unsigned computeOperandLatency(const MachineInstr *DefMI, unsigned DefOperIdx, const MachineInstr *UseMI, unsigned UseOperIdx) const
Compute operand latency based on the available machine model.
ProcResIter getWriteProcResEnd(const MCSchedClassDesc *SC) const
bool isTransient() const
Return true if this is a transient instruction that is either very likely to be eliminated during reg...
This class implements a map that also provides access to all stored values in a deterministic order...
bool hasOneDef(unsigned RegNo) const
Return true if there is exactly one operand defining the specified register.
static cl::opt< bool > EnableAASchedMI("enable-aa-sched-mi", cl::Hidden, cl::ZeroOrMore, cl::init(false), cl::desc("Enable use of AA during MI DAG construction"))
static unsigned InstrCount
Kind
These are the different kinds of scheduling dependencies.
iterator_range< mop_iterator > operands()
unsigned NumRegionInstrs
Instructions in this region (distance(RegionBegin, RegionEnd)).
void addPhysRegDataDeps(SUnit *SU, unsigned OperIdx)
MO is an operand of SU's instruction that defines a physical register.
RangePair equal_range(const KeyT &K)
The bounds of the range of items sharing Key K.
SmallVector< SDep, 4 > Preds
All sunit predecessors.
virtual void startBlock(MachineBasicBlock *BB)
Prepares to perform scheduling in the given block.
virtual void adjustSchedDependency(SUnit *def, SUnit *use, SDep &dep) const
void clearList(ValueType V)
Clears the list of SUs mapped to V.
iterator_range< succ_iterator > successors()
A register anti-dependence (aka WAR).
void insertBarrierChain(Value2SUsMap &map)
Inserts a barrier chain in a huge region, far below current SU.
void recede(SmallVectorImpl< RegisterMaskPair > *LiveUses=nullptr)
Recede across the previous instruction.
MachineFunction & MF
Machine function.
void buildSchedGraph(AliasAnalysis *AA, RegPressureTracker *RPTracker=nullptr, PressureDiffs *PDiffs=nullptr, LiveIntervals *LIS=nullptr, bool TrackLaneMasks=false)
Builds SUnits for the current region.
A description of a memory reference used in the backend.
unsigned NumSuccs
of SDep::Data sucss.
MachineBasicBlock::iterator RegionEnd
The end of the range to be scheduled.
DenseMap< MachineInstr *, SUnit * > MISUnitMap
After calling BuildSchedGraph, each machine instruction in the current scheduling region is mapped to...
void addSchedBarrierDeps()
Adds dependencies from instructions in the current list of instructions being scheduled to scheduling...
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
'undef' values are things that do not have specified contents.
An individual mapping from virtual register number to SUnit.
unsigned getNumOperands() const
Retuns the total number of operands.
void setInstr(MachineInstr *MI)
Assigns the instruction for the SUnit.
A Use represents the edge between a Value definition and its users.
SmallVectorImpl< SDep >::const_iterator const_pred_iterator
size_type count(const KeyT &Key) const
count - Returns 1 if this set contains an element identified by Key, 0 otherwise. ...
static bool hasDataSucc(const SUnit *SU)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Regular data dependence (aka true-dependence).
bool hasPhysRegUses
Has physreg uses.
static constexpr LaneBitmask getAll()
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
ValueT & operator[](const KeyT &Key)
bool hasPhysRegDefs
Has physreg defs that are being used.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
DbgValueVector DbgValues
Remember instruction that precedes DBG_VALUE.
bool hasInstrSchedModel() const
Return true if this machine model includes an instruction-level scheduling model. ...
MachineBasicBlock::const_iterator getPos() const
Get the MI position corresponding to this register pressure.
bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
Compute the values of each DAG node for various metrics during DFS.
Value2SUsMap(unsigned lat=0)
A register output-dependence (aka WAW).
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register. ...
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
bool hasReservedResource
Uses a reserved resource.
MachineBasicBlock::iterator RegionBegin
The beginning of the range to be scheduled.
void addVRegUseDeps(SUnit *SU, unsigned OperIdx)
Adds a register data dependency if the instruction that defines the virtual register used at OperIdx ...
void print(raw_ostream &OS) const
size_type size() const
size - Returns the number of elements in the set.
SUnit * BarrierChain
Remember a generic side-effecting instruction as we proceed.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
MachineBasicBlock::iterator begin() const
Returns an iterator to the top of the current scheduling region.
static void toggleKills(const MachineRegisterInfo &MRI, LivePhysRegs &LiveRegs, MachineInstr &MI, bool addToLiveRegs)
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...
List of registers defined and used by a machine instruction.
LaneBitmask getLaneMask() const
Returns the combination of all lane masks of register in this class.
static Function * getFunction(Constant *C)
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 visitPostorderNode(const SUnit *SU)
Called once for each node after all predecessors are visited.
iterator find(const KeyT &Key)
unsigned getTrueMemOrderLatency() const
void visitPreorder(const SUnit *SU)
Initializes this node's instruction count.
bool mayAlias(AliasAnalysis *AA, MachineInstr &Other, bool UseTBAA)
Returns true if this instruction's memory access aliases the memory access of Other.
std::list< SUnit * > SUList
A list of SUnits, used in Value2SUsMap, during DAG construction.
bool isDereferenceableInvariantLoad(AliasAnalysis *AA) const
Return true if this load instruction never traps and points to a memory location whose value doesn't ...
reverse_iterator rbegin()
bool isBoundaryNode() const
Boundary nodes are placeholders for the boundary of the scheduling region.
unsigned getNumSubtrees() const
The number of subtrees detected in this DAG.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
iterator erase(iterator I)
erase - Erases an existing element identified by a valid iterator.
void dumpNodeAll(const SUnit &SU) const
void recedeSkipDebugValues()
Recede until we find an instruction which is not a DebugValue.
bool isUnbuffered
Uses an unbuffered resource.
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
void remove_if(Predicate Pred)
Remove the elements that match the predicate.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
initializer< Ty > init(const Ty &Val)
bool isCall
Is a function call.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
MachineInstr * getInstr() const
Returns the representative MachineInstr for this SUnit.
void clearDAG()
Clears the DAG state (between regions).
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
The instances of the Type class are immutable: once they are created, they are never changed...
static unsigned getReductionSize()
unsigned short Latency
Node latency.
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
bool registerDefIsDead(unsigned Reg, const TargetRegisterInfo *TRI=nullptr) const
Returns true if the register is dead in this machine instruction.
bool RemoveKillFlags
True if the DAG builder should remove kill flags (in preparation for rescheduling).
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
void visitCrossEdge(const SDep &PredDep, const SUnit *Succ)
Adds a connection for cross edges.
Internal state used to compute SchedDFSResult.
void addLiveOuts(const MachineBasicBlock &MBB)
Adds all live-out registers of basic block MBB.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
void reComputeSize()
Counts the number of SUs in this map after a reduction.
Summarize the scheduling resources required for an instruction of a particular scheduling class...
unsigned getNumClasses() const
getNumClasses - Return the number of equivalence classes after compress() was called.
void addConnection(unsigned FromTree, unsigned ToTree, unsigned Depth)
Called by finalize() to record a connection between trees.
bool getUnderlyingObjectsForCodeGen(const Value *V, SmallVectorImpl< Value *> &Objects, const DataLayout &DL)
This is a wrapper around GetUnderlyingObjects and adds support for basic ptrtoint+arithmetic+inttoptr...
void init(const TargetRegisterInfo &TRI)
(re-)initializes and clears the set.
void setUniverse(unsigned U)
Set the universe size which determines the largest key the set can hold.
MCRegAliasIterator enumerates all registers aliasing Reg.
Track the current register pressure at some position in the instruction stream, and remember the high...
virtual void exitRegion()
Called when the scheduler has finished scheduling the current region.
void setUniverse(unsigned U)
setUniverse - Set the universe size which determines the largest key the set can hold.
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.
const MachineFrameInfo & MFI
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
void init(const TargetSubtargetInfo *TSInfo)
Initialize the machine model for instruction scheduling.
void clear()
Clears the set.
void dumpNodeName(const SUnit &SU) const
LaneBitmask getLaneMaskForMO(const MachineOperand &MO) const
Returns a mask for which lanes get read/written by the given (register) machine operand.
bool isVisited(const SUnit *SU) const
Returns true if this node been visited by the DFS traversal.
MCSubRegIterator enumerates all sub-registers of Reg.
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
auto find(R &&Range, const T &Val) -> decltype(adl_begin(Range))
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly...
void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
std::string & str()
Flushes the stream contents to the target string and returns the string's reference.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::string getDAGName() const override
Returns a label for the region of code covered by the DAG.
bool isConstantPhysReg(unsigned PhysReg) const
Returns true if PhysReg is unallocatable and constant throughout the function.
void setIsKill(bool Val=true)
iterator find(const KeyT &Key)
Find an element by its key.
void sort(IteratorTy Start, IteratorTy End)
const bool HasDisjunctSubRegs
Whether the class supports two (or more) disjunct subregister indices.
The two locations may or may not alias. This is the least precise result.
void addPhysRegDeps(SUnit *SU, unsigned OperIdx)
Adds register dependencies (data, anti, and output) from this SUnit to following instructions in the ...
unsigned join(unsigned a, unsigned b)
Join the equivalence classes of a and b.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
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 Regi...
std::string getGraphNodeLabel(const SUnit *SU) const override
Returns a label for a DAG node that points to an instruction.
void reduceHugeMemNodeMaps(Value2SUsMap &stores, Value2SUsMap &loads, unsigned N)
Reduces maps in FIFO order, by N SUs.
bool isCommutable
Is a commutable instruction.
Iterator for intrusive lists based on ilist_node.
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
auto size(R &&Range, typename std::enable_if< std::is_same< typename std::iterator_traits< decltype(Range.begin())>::iterator_category, std::random_access_iterator_tag >::value, void >::type *=nullptr) -> decltype(std::distance(Range.begin(), Range.end()))
Get the size of a range.
void compute(ArrayRef< SUnit > SUnits)
Compute various metrics for the DAG with given roots.
UndefValue * UnknownValue
For an unanalyzable memory access, this Value is used in maps.
bool available(const MachineRegisterInfo &MRI, MCPhysReg Reg) const
Returns true if register Reg and no aliasing register is in the set.
bool isDebugValue() const
MachineOperand class - Representation of each machine instruction operand.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Reg2SUnitsMap Defs
Defs, Uses - Remember where defs and uses of each register are as we iterate upward through the instr...
void eraseAll(const KeyT &K)
Erase all elements with the given key.
CHAIN = SC CHAIN, Imm128 - System call.
bool hasOrderedMemoryRef() const
Return true if this instruction may have an ordered or volatile memory reference, or if the informati...
LaneBitmask getSubRegIndexLaneMask(unsigned SubIdx) const
Return a bitmask representing the parts of a register that are covered by SubIdx. ...
Nonvolatile load/Store instructions that may alias.
typename std::vector< std::pair< ValueType, SUList >> ::iterator iterator
bool addPredBarrier(SUnit *SU)
Adds a barrier edge to SU by calling addPred(), with latency 0 generally or latency 1 for a store fol...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
VReg2SUnitOperIdxMultiMap CurrentVRegUses
Tracks the last instructions in this region using each virtual register.
Special value supplied for machine level alias analysis.
unsigned computeOutputLatency(const MachineInstr *DefMI, unsigned DefOperIdx, const MachineInstr *DepMI) const
Output dependency latency of a pair of defs of the same register.
void dumpNode(const SUnit &SU) const override
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
void visitPostorderEdge(const SDep &PredDep, const SUnit *Succ)
Called once for each tree edge after calling visitPostOrderNode on the predecessor.
void setLatency(unsigned Lat)
Sets the latency for this edge.
**iterator erase(iterator I)
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
TargetSubtargetInfo - Generic base class for all target subtargets.
SUnit EntrySU
Special node for the region entry.
Representation of each machine instruction.
SUnit ExitSU
Special node for the region exit.
void finalize()
Sets each node's subtree ID to the representative ID and record connections between trees...
static bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
const TargetRegisterInfo * TRI
Target processor register info.
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"))
A set of physical registers with utility functions to track liveness when walking backward/forward th...
LLVM_NODISCARD bool empty() const
std::pair< iterator, iterator > RangePair
void addChainDependencies(SUnit *SU, SUList &SUs, unsigned Latency)
Adds dependencies as needed from all SUs in list to SU.
constexpr bool any() const
bool empty() const
Returns true if the set is empty.
Mapping from virtual register to SUnit including an operand index.
void addChainDependency(SUnit *SUa, SUnit *SUb, unsigned Latency=0)
Adds a chain edge between SUa and SUb, but only if both AliasAnalysis and Target fail to deny the dep...
Kind getKind() const
Returns an enum value representing the kind of the dependence.
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
ScheduleDAGInstrs(MachineFunction &mf, const MachineLoopInfo *mli, bool RemoveKillFlags=false)
unsigned NodeNum
Entry # of node in the node vector.
MachineBasicBlock::iterator end() const
Returns an iterator to the bottom of the current scheduling region.
SUnit * newSUnit(MachineInstr *MI)
Creates a new SUnit and return a ptr to it.
void addBarrierChain(Value2SUsMap &map)
Adds barrier chain edges from all SUs in map, and then clear the map.
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const MCProcResourceDesc * getProcResource(unsigned PIdx) const
Get a processor resource by ID for convenience.
bool addPred(const SDep &D, bool Required=true)
Adds the specified edge as a pred of the current node if not already.
bool hasImplicitUseOfPhysReg(unsigned Reg) const
Return true if this instruction implicitly uses the specified physical register.
A raw_ostream that writes to an std::string.
std::string getFullName() const
Return a formatted string to identify this block and its parent function.
LLVM Value Representation.
void removeRegsInMask(const MachineOperand &MO, SmallVectorImpl< std::pair< MCPhysReg, const MachineOperand *>> *Clobbers=nullptr)
Removes physical registers clobbered by the regmask operand MO.
void clear()
Clears map from all contents.
void initSUnits()
Creates an SUnit for each real instruction, numbered in top-down topological order.
SmallVector< SDep, 4 > Succs
All sunit successors.
void addReg(MCPhysReg Reg)
Adds a physical register and all its sub-registers to the set.
Arbitrary strong DAG edge (no real dependence).
void scheduleTree(unsigned SubtreeID)
Scheduler callback to update SubtreeConnectLevels when a tree is initially scheduled.
This class implements an extremely fast bulk output stream that can only output to a stream...
MachineInstr * FirstDbgValue
static bool isGlobalMemoryObject(AliasAnalysis *AA, MachineInstr *MI)
Returns true if MI is an instruction we are unable to reason about (like a call or something with unm...
bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore...
MachineBasicBlock * BB
The block in which to insert instructions.
virtual bool useAA() const
Enable use of alias analysis during code generation (during MI scheduling, DAGCombine, etc.).
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
void removeReg(MCPhysReg Reg)
Removes a physical register, all its sub-registers, and all its super-registers from the set...
static void dumpSUList(ScheduleDAGInstrs::SUList &L)
MachineRegisterInfo & MRI
Virtual/real register map.
std::vector< SUnit > SUnits
The scheduling units.
SchedDFSImpl(SchedDFSResult &r)
bool hasImplicitDefOfPhysReg(unsigned Reg, const MCRegisterInfo *MRI=nullptr) const
Return true if this instruction implicitly defines the specified physical register.
const MachineOperand & getOperand(unsigned i) const
SlotIndex - An opaque wrapper around machine indexes.
VReg2SUnitMultiMap CurrentVRegDefs
Tracks the last instruction(s) in this region defining each virtual register.
bool hasTailCall() const
Returns true if the function contains a tail call.
Scheduling unit. This is a node in the scheduling DAG.
A discriminated union of two pointer types, with the discriminator in the low bit of the pointer...