forked from OSchip/llvm-project
MI Sched: record local vreg uses.
This will be used to compute the cyclic critical path and to update precomputed per-node pressure differences. In the longer term, it could also be used to speed up LiveInterval update by avoiding visiting all global vreg users. llvm-svn: 189118
This commit is contained in:
parent
cfb42ce923
commit
8dd26f002f
|
@ -56,7 +56,8 @@ namespace llvm {
|
|||
/// Use a SparseMultiSet to track physical registers. Storage is only
|
||||
/// allocated once for the pass. It can be cleared in constant time and reused
|
||||
/// without any frees.
|
||||
typedef SparseMultiSet<PhysRegSUOper, llvm::identity<unsigned>, uint16_t> Reg2SUnitsMap;
|
||||
typedef SparseMultiSet<PhysRegSUOper, llvm::identity<unsigned>, uint16_t>
|
||||
Reg2SUnitsMap;
|
||||
|
||||
/// Use SparseSet as a SparseMap by relying on the fact that it never
|
||||
/// compares ValueT's, only unsigned keys. This allows the set to be cleared
|
||||
|
@ -64,6 +65,11 @@ namespace llvm {
|
|||
/// require a destructor.
|
||||
typedef SparseSet<VReg2SUnit, VirtReg2IndexFunctor> VReg2SUnitMap;
|
||||
|
||||
/// Track local uses of virtual registers. These uses are gathered by the DAG
|
||||
/// builder and may be consulted by the scheduler to avoid iterating an entire
|
||||
/// vreg use list.
|
||||
typedef SparseMultiSet<VReg2SUnit, VirtReg2IndexFunctor> VReg2UseMap;
|
||||
|
||||
/// ScheduleDAGInstrs - A ScheduleDAG subclass for scheduling lists of
|
||||
/// MachineInstrs.
|
||||
class ScheduleDAGInstrs : public ScheduleDAG {
|
||||
|
@ -107,6 +113,11 @@ namespace llvm {
|
|||
/// scheduling region is mapped to an SUnit.
|
||||
DenseMap<MachineInstr*, SUnit*> MISUnitMap;
|
||||
|
||||
/// After calling BuildSchedGraph, each vreg used in the scheduling region
|
||||
/// is mapped to a set of SUnits. These include all local vreg uses, not
|
||||
/// just the uses for a singly defined vreg.
|
||||
VReg2UseMap VRegUses;
|
||||
|
||||
/// State internal to DAG building.
|
||||
/// -------------------------------
|
||||
|
||||
|
|
|
@ -405,6 +405,9 @@ void ScheduleDAGInstrs::addVRegUseDeps(SUnit *SU, unsigned OperIdx) {
|
|||
MachineInstr *MI = SU->getInstr();
|
||||
unsigned Reg = MI->getOperand(OperIdx).getReg();
|
||||
|
||||
// Record this local VReg use.
|
||||
VRegUses.insert(VReg2SUnit(Reg, SU));
|
||||
|
||||
// Lookup this operand's reaching definition.
|
||||
assert(LIS && "vreg dependencies requires LiveIntervals");
|
||||
LiveRangeQuery LRQ(LIS->getInterval(Reg), LIS->getInstructionIndex(MI));
|
||||
|
@ -715,10 +718,9 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
|||
Uses.setUniverse(TRI->getNumRegs());
|
||||
|
||||
assert(VRegDefs.empty() && "Only BuildSchedGraph may access VRegDefs");
|
||||
// FIXME: Allow SparseSet to reserve space for the creation of virtual
|
||||
// registers during scheduling. Don't artificially inflate the Universe
|
||||
// because we want to assert that vregs are not created during DAG building.
|
||||
VRegUses.clear();
|
||||
VRegDefs.setUniverse(MRI.getNumVirtRegs());
|
||||
VRegUses.setUniverse(MRI.getNumVirtRegs());
|
||||
|
||||
// Model data dependencies between instructions being scheduled and the
|
||||
// ExitSU.
|
||||
|
|
Loading…
Reference in New Issue