Make the hasPHIKills flag a computed property.
The VNInfo::HAS_PHI_KILL is only half supported. We precompute it in LiveIntervalAnalysis, but it isn't properly updated by live range splitting and functions like shrinkToUses(). It is only used in one place: RegisterCoalescer::removeCopyByCommutingDef(). This patch changes that function to use a new LiveIntervals::hasPHIKill() function that computes the flag for a given value number. llvm-svn: 161254
This commit is contained in:
@@ -780,6 +780,25 @@ LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const {
|
||||
return MBB1 == MBB2 ? MBB1 : NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const {
|
||||
for (LiveInterval::const_vni_iterator I = LI.vni_begin(), E = LI.vni_end();
|
||||
I != E; ++I) {
|
||||
const VNInfo *PHI = *I;
|
||||
if (PHI->isUnused() || !PHI->isPHIDef())
|
||||
continue;
|
||||
const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def);
|
||||
// Conservatively return true instead of scanning huge predecessor lists.
|
||||
if (PHIMBB->pred_size() > 100)
|
||||
return true;
|
||||
for (MachineBasicBlock::const_pred_iterator
|
||||
PI = PHIMBB->pred_begin(), PE = PHIMBB->pred_end(); PI != PE; ++PI)
|
||||
if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(*PI)))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
float
|
||||
LiveIntervals::getSpillWeight(bool isDef, bool isUse, unsigned loopDepth) {
|
||||
// Limit the loop depth ridiculousness.
|
||||
|
||||
Reference in New Issue
Block a user