1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[MachineSink] Address post-commit review comments

The successors cache is now a local variable, making it more visible that it
is only valid for the MBB being processed.

llvm-svn: 239807
This commit is contained in:
Arnaud A. de Grandmaison 2015-06-16 08:57:21 +00:00
parent 9879449284
commit 661e791e77

View File

@ -73,10 +73,8 @@ namespace {
SparseBitVector<> RegsToClearKillFlags; SparseBitVector<> RegsToClearKillFlags;
// Cache all successors to a MachineBasicBlock, sorted by frequency info and typedef std::map<MachineBasicBlock *, SmallVector<MachineBasicBlock *, 4>>
// loop depth. AllSuccessors is lazily populated. AllSuccsCache;
std::map<MachineBasicBlock *, SmallVector<MachineBasicBlock *, 4>>
AllSuccessors;
public: public:
static char ID; // Pass identification static char ID; // Pass identification
@ -125,21 +123,24 @@ namespace {
MachineBasicBlock *From, MachineBasicBlock *From,
MachineBasicBlock *To, MachineBasicBlock *To,
bool BreakPHIEdge); bool BreakPHIEdge);
bool SinkInstruction(MachineInstr *MI, bool &SawStore); bool SinkInstruction(MachineInstr *MI, bool &SawStore,
AllSuccsCache &AllSuccessors);
bool AllUsesDominatedByBlock(unsigned Reg, MachineBasicBlock *MBB, bool AllUsesDominatedByBlock(unsigned Reg, MachineBasicBlock *MBB,
MachineBasicBlock *DefMBB, MachineBasicBlock *DefMBB,
bool &BreakPHIEdge, bool &LocalUse) const; bool &BreakPHIEdge, bool &LocalUse) const;
MachineBasicBlock *FindSuccToSinkTo(MachineInstr *MI, MachineBasicBlock *MBB, MachineBasicBlock *FindSuccToSinkTo(MachineInstr *MI, MachineBasicBlock *MBB,
bool &BreakPHIEdge); bool &BreakPHIEdge, AllSuccsCache &AllSuccessors);
bool isProfitableToSinkTo(unsigned Reg, MachineInstr *MI, bool isProfitableToSinkTo(unsigned Reg, MachineInstr *MI,
MachineBasicBlock *MBB, MachineBasicBlock *MBB,
MachineBasicBlock *SuccToSinkTo); MachineBasicBlock *SuccToSinkTo,
AllSuccsCache &AllSuccessors);
bool PerformTrivialForwardCoalescing(MachineInstr *MI, bool PerformTrivialForwardCoalescing(MachineInstr *MI,
MachineBasicBlock *MBB); MachineBasicBlock *MBB);
SmallVector<MachineBasicBlock *, 4> & SmallVector<MachineBasicBlock *, 4> &
GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB); GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB,
AllSuccsCache &AllSuccessors) const;
}; };
} // end anonymous namespace } // end anonymous namespace
@ -317,8 +318,8 @@ bool MachineSinking::ProcessBlock(MachineBasicBlock &MBB) {
bool MadeChange = false; bool MadeChange = false;
// MBB changed, reset all cached information. // Cache all successors, sorted by frequency info and loop depth.
AllSuccessors.clear(); AllSuccsCache AllSuccessors;
// Walk the basic block bottom-up. Remember if we saw a store. // Walk the basic block bottom-up. Remember if we saw a store.
MachineBasicBlock::iterator I = MBB.end(); MachineBasicBlock::iterator I = MBB.end();
@ -342,7 +343,7 @@ bool MachineSinking::ProcessBlock(MachineBasicBlock &MBB) {
continue; continue;
} }
if (SinkInstruction(MI, SawStore)) if (SinkInstruction(MI, SawStore, AllSuccessors))
++NumSunk, MadeChange = true; ++NumSunk, MadeChange = true;
// If we just processed the first instruction in the block, we're done. // If we just processed the first instruction in the block, we're done.
@ -494,7 +495,8 @@ static void collectDebugValues(MachineInstr *MI,
/// isProfitableToSinkTo - Return true if it is profitable to sink MI. /// isProfitableToSinkTo - Return true if it is profitable to sink MI.
bool MachineSinking::isProfitableToSinkTo(unsigned Reg, MachineInstr *MI, bool MachineSinking::isProfitableToSinkTo(unsigned Reg, MachineInstr *MI,
MachineBasicBlock *MBB, MachineBasicBlock *MBB,
MachineBasicBlock *SuccToSinkTo) { MachineBasicBlock *SuccToSinkTo,
AllSuccsCache &AllSuccessors) {
assert (MI && "Invalid MachineInstr!"); assert (MI && "Invalid MachineInstr!");
assert (SuccToSinkTo && "Invalid SinkTo Candidate BB"); assert (SuccToSinkTo && "Invalid SinkTo Candidate BB");
@ -524,8 +526,9 @@ bool MachineSinking::isProfitableToSinkTo(unsigned Reg, MachineInstr *MI,
// can further profitably sinked into another block in next round. // can further profitably sinked into another block in next round.
bool BreakPHIEdge = false; bool BreakPHIEdge = false;
// FIXME - If finding successor is compile time expensive then cache results. // FIXME - If finding successor is compile time expensive then cache results.
if (MachineBasicBlock *MBB2 = FindSuccToSinkTo(MI, SuccToSinkTo, BreakPHIEdge)) if (MachineBasicBlock *MBB2 =
return isProfitableToSinkTo(Reg, MI, SuccToSinkTo, MBB2); FindSuccToSinkTo(MI, SuccToSinkTo, BreakPHIEdge, AllSuccessors))
return isProfitableToSinkTo(Reg, MI, SuccToSinkTo, MBB2, AllSuccessors);
// If SuccToSinkTo is final destination and it is a post dominator of current // If SuccToSinkTo is final destination and it is a post dominator of current
// block then it is not profitable to sink MI into SuccToSinkTo block. // block then it is not profitable to sink MI into SuccToSinkTo block.
@ -535,7 +538,8 @@ bool MachineSinking::isProfitableToSinkTo(unsigned Reg, MachineInstr *MI,
/// Get the sorted sequence of successors for this MachineBasicBlock, possibly /// Get the sorted sequence of successors for this MachineBasicBlock, possibly
/// computing it if it was not already cached. /// computing it if it was not already cached.
SmallVector<MachineBasicBlock *, 4> & SmallVector<MachineBasicBlock *, 4> &
MachineSinking::GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB) { MachineSinking::GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB,
AllSuccsCache &AllSuccessors) const {
// Do we have the sorted successors in cache ? // Do we have the sorted successors in cache ?
auto Succs = AllSuccessors.find(MBB); auto Succs = AllSuccessors.find(MBB);
@ -580,7 +584,8 @@ MachineSinking::GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB)
/// FindSuccToSinkTo - Find a successor to sink this instruction to. /// FindSuccToSinkTo - Find a successor to sink this instruction to.
MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr *MI, MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr *MI,
MachineBasicBlock *MBB, MachineBasicBlock *MBB,
bool &BreakPHIEdge) { bool &BreakPHIEdge,
AllSuccsCache &AllSuccessors) {
assert (MI && "Invalid MachineInstr!"); assert (MI && "Invalid MachineInstr!");
assert (MBB && "Invalid MachineBasicBlock!"); assert (MBB && "Invalid MachineBasicBlock!");
@ -634,7 +639,8 @@ MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr *MI,
// we should sink to. If we have reliable block frequency information // we should sink to. If we have reliable block frequency information
// (frequency != 0) available, give successors with smaller frequencies // (frequency != 0) available, give successors with smaller frequencies
// higher priority, otherwise prioritize smaller loop depths. // higher priority, otherwise prioritize smaller loop depths.
for (MachineBasicBlock *SuccBlock : GetAllSortedSuccessors(MI, MBB)) { for (MachineBasicBlock *SuccBlock :
GetAllSortedSuccessors(MI, MBB, AllSuccessors)) {
bool LocalUse = false; bool LocalUse = false;
if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB, if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB,
BreakPHIEdge, LocalUse)) { BreakPHIEdge, LocalUse)) {
@ -649,7 +655,7 @@ MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr *MI,
// If we couldn't find a block to sink to, ignore this instruction. // If we couldn't find a block to sink to, ignore this instruction.
if (!SuccToSinkTo) if (!SuccToSinkTo)
return nullptr; return nullptr;
if (!isProfitableToSinkTo(Reg, MI, MBB, SuccToSinkTo)) if (!isProfitableToSinkTo(Reg, MI, MBB, SuccToSinkTo, AllSuccessors))
return nullptr; return nullptr;
} }
} }
@ -669,7 +675,8 @@ MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr *MI,
/// SinkInstruction - Determine whether it is safe to sink the specified machine /// SinkInstruction - Determine whether it is safe to sink the specified machine
/// instruction out of its current block into a successor. /// instruction out of its current block into a successor.
bool MachineSinking::SinkInstruction(MachineInstr *MI, bool &SawStore) { bool MachineSinking::SinkInstruction(MachineInstr *MI, bool &SawStore,
AllSuccsCache &AllSuccessors) {
// Don't sink insert_subreg, subreg_to_reg, reg_sequence. These are meant to // Don't sink insert_subreg, subreg_to_reg, reg_sequence. These are meant to
// be close to the source to make it easier to coalesce. // be close to the source to make it easier to coalesce.
if (AvoidsSinking(MI, MRI)) if (AvoidsSinking(MI, MRI))
@ -693,8 +700,8 @@ bool MachineSinking::SinkInstruction(MachineInstr *MI, bool &SawStore) {
bool BreakPHIEdge = false; bool BreakPHIEdge = false;
MachineBasicBlock *ParentBlock = MI->getParent(); MachineBasicBlock *ParentBlock = MI->getParent();
MachineBasicBlock *SuccToSinkTo = FindSuccToSinkTo(MI, ParentBlock, MachineBasicBlock *SuccToSinkTo =
BreakPHIEdge); FindSuccToSinkTo(MI, ParentBlock, BreakPHIEdge, AllSuccessors);
// If there are no outputs, it must have side-effects. // If there are no outputs, it must have side-effects.
if (!SuccToSinkTo) if (!SuccToSinkTo)