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:
parent
9879449284
commit
661e791e77
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user