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

Optimize LiveIntervals::intervalIsInOneMBB().

No looping and binary searches necessary.

Return a pointer to the containing block instead of just a bool.

llvm-svn: 150218
This commit is contained in:
Jakob Stoklund Olesen 2012-02-10 01:23:55 +00:00
parent 1c602707dd
commit ac14d7774a
2 changed files with 23 additions and 17 deletions

View File

@ -255,9 +255,10 @@ namespace llvm {
const SmallVectorImpl<LiveInterval*> *SpillIs,
bool &isLoad);
/// intervalIsInOneMBB - Returns true if the specified interval is entirely
/// within a single basic block.
bool intervalIsInOneMBB(const LiveInterval &li) const;
/// intervalIsInOneMBB - If LI is confined to a single basic block, return
/// a pointer to that block. If LI is live in to or out of any block,
/// return NULL.
MachineBasicBlock *intervalIsInOneMBB(const LiveInterval &LI) const;
/// addKillFlags - Add kill flags to any instruction that kills a virtual
/// register.

View File

@ -1086,23 +1086,28 @@ LiveIntervals::isReMaterializable(const LiveInterval &li,
return true;
}
bool LiveIntervals::intervalIsInOneMBB(const LiveInterval &li) const {
LiveInterval::Ranges::const_iterator itr = li.ranges.begin();
MachineBasicBlock*
LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const {
// A local live range must be fully contained inside the block, meaning it is
// defined and killed at instructions, not at block boundaries. It is not
// live in or or out of any block.
//
// It is technically possible to have a PHI-defined live range identical to a
// single block, but we are going to return false in that case.
MachineBasicBlock *mbb = indexes_->getMBBCoveringRange(itr->start, itr->end);
SlotIndex Start = LI.beginIndex();
if (Start.isBlock())
return NULL;
if (mbb == 0)
return false;
SlotIndex Stop = LI.endIndex();
if (Stop.isBlock())
return NULL;
for (++itr; itr != li.ranges.end(); ++itr) {
MachineBasicBlock *mbb2 =
indexes_->getMBBCoveringRange(itr->start, itr->end);
if (mbb2 != mbb)
return false;
}
return true;
// getMBBFromIndex doesn't need to search the MBB table when both indexes
// belong to proper instructions.
MachineBasicBlock *MBB1 = indexes_->getMBBFromIndex(Start);
MachineBasicBlock *MBB2 = indexes_->getMBBFromIndex(Stop);
return MBB1 == MBB2 ? MBB1 : NULL;
}
float