Skip to content

Commit

Permalink
RegisterPressure: Move LiveInRegs/LiveOutRegs from RegisterPressure t…
Browse files Browse the repository at this point in the history
…o PressureTracker

Differential Revision: http://reviews.llvm.org/D12814

llvm-svn: 247943
  • Loading branch information
MatzeB committed Sep 17, 2015
1 parent d78ee54 commit 70eff25
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 40 deletions.
10 changes: 6 additions & 4 deletions llvm/include/llvm/CodeGen/RegisterPressure.h
Expand Up @@ -31,10 +31,6 @@ struct RegisterPressure {
/// Map of max reg pressure indexed by pressure set ID, not class ID.
std::vector<unsigned> MaxSetPressure;

/// List of live in virtual registers or physical register units.
SmallVector<unsigned,8> LiveInRegs;
SmallVector<unsigned,8> LiveOutRegs;

void dump(const TargetRegisterInfo *TRI) const;
};

Expand Down Expand Up @@ -267,6 +263,10 @@ class RegPressureTracker {

/// Set of vreg defs that start a live range.
SparseSet<unsigned, VirtReg2IndexFunctor> UntiedDefs;
/// List of live in virtual registers or physical register units.
SmallVector<unsigned,8> LiveInRegs;
/// List of live out virtual registers or physical register units.
SmallVector<unsigned,8> LiveOutRegs;
/// Live-through pressure.
std::vector<unsigned> LiveThruPressure;

Expand Down Expand Up @@ -323,6 +323,8 @@ class RegPressureTracker {
LiveThruPressure.assign(PressureSet.begin(), PressureSet.end());
}

ArrayRef<unsigned> getLiveIn() const { return LiveInRegs; }
ArrayRef<unsigned> getLiveOut() const { return LiveOutRegs; }
ArrayRef<unsigned> getLiveThru() const { return LiveThruPressure; }

/// Get the resulting register pressure over the traversed region.
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/CodeGen/MachineScheduler.cpp
Expand Up @@ -878,8 +878,8 @@ void ScheduleDAGMILive::initRegPressure() {
DEBUG(RPTracker.dump());

// Initialize the live ins and live outs.
TopRPTracker.addLiveRegs(RPTracker.getPressure().LiveInRegs);
BotRPTracker.addLiveRegs(RPTracker.getPressure().LiveOutRegs);
TopRPTracker.addLiveRegs(RPTracker.getLiveIn());
BotRPTracker.addLiveRegs(RPTracker.getLiveOut());

// Close one end of the tracker so we can call
// getMaxUpward/DownwardPressureDelta before advancing across any
Expand All @@ -896,7 +896,7 @@ void ScheduleDAGMILive::initRegPressure() {

// For each live out vreg reduce the pressure change associated with other
// uses of the same vreg below the live-out reaching def.
updatePressureDiffs(RPTracker.getPressure().LiveOutRegs);
updatePressureDiffs(RPTracker.getLiveOut());

// Account for liveness generated by the region boundary.
if (LiveRegionEnd != RegionEnd) {
Expand Down Expand Up @@ -1135,7 +1135,7 @@ unsigned ScheduleDAGMILive::computeCyclicCriticalPath() {

unsigned MaxCyclicLatency = 0;
// Visit each live out vreg def to find def/use pairs that cross iterations.
ArrayRef<unsigned> LiveOuts = RPTracker.getPressure().LiveOutRegs;
ArrayRef<unsigned> LiveOuts = RPTracker.getLiveOut();
for (ArrayRef<unsigned>::iterator RI = LiveOuts.begin(), RE = LiveOuts.end();
RI != RE; ++RI) {
unsigned Reg = *RI;
Expand Down
62 changes: 30 additions & 32 deletions llvm/lib/CodeGen/RegisterPressure.cpp
Expand Up @@ -58,14 +58,6 @@ LLVM_DUMP_METHOD
void RegisterPressure::dump(const TargetRegisterInfo *TRI) const {
dbgs() << "Max Pressure: ";
dumpRegSetPressure(MaxSetPressure, TRI);
dbgs() << "Live In: ";
for (unsigned i = 0, e = LiveInRegs.size(); i < e; ++i)
dbgs() << PrintVRegOrUnit(LiveInRegs[i], TRI) << " ";
dbgs() << '\n';
dbgs() << "Live Out: ";
for (unsigned i = 0, e = LiveOutRegs.size(); i < e; ++i)
dbgs() << PrintVRegOrUnit(LiveOutRegs[i], TRI) << " ";
dbgs() << '\n';
}

LLVM_DUMP_METHOD
Expand All @@ -75,6 +67,14 @@ void RegPressureTracker::dump() const {
dumpRegSetPressure(CurrSetPressure, TRI);
}
P.dump(TRI);
dbgs() << "Live In: ";
for (unsigned i = 0, e = LiveInRegs.size(); i < e; ++i)
dbgs() << PrintVRegOrUnit(LiveInRegs[i], TRI) << " ";
dbgs() << '\n';
dbgs() << "Live Out: ";
for (unsigned i = 0, e = LiveOutRegs.size(); i < e; ++i)
dbgs() << PrintVRegOrUnit(LiveOutRegs[i], TRI) << " ";
dbgs() << '\n';
}

void PressureDiff::dump(const TargetRegisterInfo &TRI) const {
Expand Down Expand Up @@ -112,16 +112,12 @@ void RegPressureTracker::decreaseRegPressure(ArrayRef<unsigned> RegUnits) {
void IntervalPressure::reset() {
TopIdx = BottomIdx = SlotIndex();
MaxSetPressure.clear();
LiveInRegs.clear();
LiveOutRegs.clear();
}

/// Clear the result so it can be used for another round of pressure tracking.
void RegionPressure::reset() {
TopPos = BottomPos = MachineBasicBlock::const_iterator();
MaxSetPressure.clear();
LiveInRegs.clear();
LiveOutRegs.clear();
}

/// If the current top is not less than or equal to the next index, open it.
Expand All @@ -130,31 +126,27 @@ void IntervalPressure::openTop(SlotIndex NextTop) {
if (TopIdx <= NextTop)
return;
TopIdx = SlotIndex();
LiveInRegs.clear();
}

/// If the current top is the previous instruction (before receding), open it.
void RegionPressure::openTop(MachineBasicBlock::const_iterator PrevTop) {
if (TopPos != PrevTop)
return;
TopPos = MachineBasicBlock::const_iterator();
LiveInRegs.clear();
}

/// If the current bottom is not greater than the previous index, open it.
void IntervalPressure::openBottom(SlotIndex PrevBottom) {
if (BottomIdx > PrevBottom)
return;
BottomIdx = SlotIndex();
LiveInRegs.clear();
}

/// If the current bottom is the previous instr (before advancing), open it.
void RegionPressure::openBottom(MachineBasicBlock::const_iterator PrevBottom) {
if (BottomPos != PrevBottom)
return;
BottomPos = MachineBasicBlock::const_iterator();
LiveInRegs.clear();
}

const LiveRange *RegPressureTracker::getLiveRange(unsigned Reg) const {
Expand All @@ -175,6 +167,8 @@ void RegPressureTracker::reset() {
static_cast<IntervalPressure&>(P).reset();
else
static_cast<RegionPressure&>(P).reset();
LiveInRegs.clear();
LiveOutRegs.clear();

LiveRegs.PhysRegs.clear();
LiveRegs.VirtRegs.clear();
Expand Down Expand Up @@ -249,10 +243,10 @@ void RegPressureTracker::closeTop() {
else
static_cast<RegionPressure&>(P).TopPos = CurrPos;

assert(P.LiveInRegs.empty() && "inconsistent max pressure result");
P.LiveInRegs.reserve(LiveRegs.PhysRegs.size() + LiveRegs.VirtRegs.size());
P.LiveInRegs.append(LiveRegs.PhysRegs.begin(), LiveRegs.PhysRegs.end());
P.LiveInRegs.append(LiveRegs.VirtRegs.begin(), LiveRegs.VirtRegs.end());
assert(LiveInRegs.empty() && "inconsistent max pressure result");
LiveInRegs.reserve(LiveRegs.PhysRegs.size() + LiveRegs.VirtRegs.size());
LiveInRegs.append(LiveRegs.PhysRegs.begin(), LiveRegs.PhysRegs.end());
LiveInRegs.append(LiveRegs.VirtRegs.begin(), LiveRegs.VirtRegs.end());
}

/// Set the boundary for the bottom of the region and summarize live outs.
Expand All @@ -262,10 +256,10 @@ void RegPressureTracker::closeBottom() {
else
static_cast<RegionPressure&>(P).BottomPos = CurrPos;

assert(P.LiveOutRegs.empty() && "inconsistent max pressure result");
P.LiveOutRegs.reserve(LiveRegs.PhysRegs.size() + LiveRegs.VirtRegs.size());
P.LiveOutRegs.append(LiveRegs.PhysRegs.begin(), LiveRegs.PhysRegs.end());
P.LiveOutRegs.append(LiveRegs.VirtRegs.begin(), LiveRegs.VirtRegs.end());
assert(LiveOutRegs.empty() && "inconsistent max pressure result");
LiveOutRegs.reserve(LiveRegs.PhysRegs.size() + LiveRegs.VirtRegs.size());
LiveOutRegs.append(LiveRegs.PhysRegs.begin(), LiveRegs.PhysRegs.end());
LiveOutRegs.append(LiveRegs.VirtRegs.begin(), LiveRegs.VirtRegs.end());
}

/// Finalize the region boundaries and record live ins and live outs.
Expand All @@ -289,8 +283,8 @@ void RegPressureTracker::closeRegion() {
void RegPressureTracker::initLiveThru(const RegPressureTracker &RPTracker) {
LiveThruPressure.assign(TRI->getNumRegPressureSets(), 0);
assert(isBottomClosed() && "need bottom-up tracking to intialize.");
for (unsigned i = 0, e = P.LiveOutRegs.size(); i < e; ++i) {
unsigned Reg = P.LiveOutRegs[i];
for (unsigned i = 0, e = LiveOutRegs.size(); i < e; ++i) {
unsigned Reg = LiveOutRegs[i];
if (TargetRegisterInfo::isVirtualRegister(Reg)
&& !RPTracker.hasUntiedDef(Reg)) {
increaseSetPressure(LiveThruPressure, MRI->getPressureSets(Reg));
Expand Down Expand Up @@ -431,22 +425,22 @@ void RegPressureTracker::addLiveRegs(ArrayRef<unsigned> Regs) {
/// Add Reg to the live in set and increase max pressure.
void RegPressureTracker::discoverLiveIn(unsigned Reg) {
assert(!LiveRegs.contains(Reg) && "avoid bumping max pressure twice");
if (containsReg(P.LiveInRegs, Reg))
if (containsReg(LiveInRegs, Reg))
return;

// At live in discovery, unconditionally increase the high water mark.
P.LiveInRegs.push_back(Reg);
LiveInRegs.push_back(Reg);
increaseSetPressure(P.MaxSetPressure, MRI->getPressureSets(Reg));
}

/// Add Reg to the live out set and increase max pressure.
void RegPressureTracker::discoverLiveOut(unsigned Reg) {
assert(!LiveRegs.contains(Reg) && "avoid bumping max pressure twice");
if (containsReg(P.LiveOutRegs, Reg))
if (containsReg(LiveOutRegs, Reg))
return;

// At live out discovery, unconditionally increase the high water mark.
P.LiveOutRegs.push_back(Reg);
LiveOutRegs.push_back(Reg);
increaseSetPressure(P.MaxSetPressure, MRI->getPressureSets(Reg));
}

Expand Down Expand Up @@ -483,8 +477,11 @@ bool RegPressureTracker::recede(SmallVectorImpl<unsigned> *LiveUses,
SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot();

// Open the top of the region using slot indexes.
if (RequireIntervals && isTopClosed())
static_cast<IntervalPressure&>(P).openTop(SlotIdx);
if (isTopClosed()) {
if (RequireIntervals)
static_cast<IntervalPressure&>(P).openTop(SlotIdx);
LiveInRegs.clear();
}

RegisterOperands RegOpers(TRI, MRI);
collectOperands(CurrPos, RegOpers);
Expand Down Expand Up @@ -573,6 +570,7 @@ bool RegPressureTracker::advance() {
static_cast<IntervalPressure&>(P).openBottom(SlotIdx);
else
static_cast<RegionPressure&>(P).openBottom(CurrPos);
LiveOutRegs.clear();
}

RegisterOperands RegOpers(TRI, MRI);
Expand Down

0 comments on commit 70eff25

Please sign in to comment.