After splitting, compute connected components of all new registers, not just for

the remainder register.

Example:

bb0:
  x = 1
bb1:
  use(x)
  ...
  x = 2
  jump bb1

When x is isolated in bb1, the inner part breaks into two components, x1 and x2:

bb0:
  x0 = 1
bb1:
  x1 = x0
  use(x1)
  ...
  x2 = 2
  x0 = x2
  jump bb1

llvm-svn: 117408
This commit is contained in:
Jakob Stoklund Olesen 2010-10-26 22:36:09 +00:00
parent 260fa289df
commit e4f3317cda
2 changed files with 20 additions and 17 deletions

View File

@ -77,6 +77,8 @@ public:
typedef SmallVectorImpl<LiveInterval*>::const_iterator iterator;
iterator begin() const { return newRegs_.begin()+firstNew_; }
iterator end() const { return newRegs_.end(); }
unsigned size() const { return newRegs_.size()-firstNew_; }
LiveInterval *get(unsigned idx) const { return newRegs_[idx-firstNew_]; }
/// assignStackSlot - Ensure a stack slot is assigned to parent.
/// @return the assigned stack slot number.

View File

@ -842,26 +842,27 @@ void SplitEditor::finish() {
for (LiveRangeEdit::iterator I = edit_.begin(), E = edit_.end(); I != E; ++I)
(*I)->RenumberValues(lis_);
// Now check if dupli was separated into multiple connected components.
ConnectedVNInfoEqClasses ConEQ(lis_);
if (unsigned NumComp = ConEQ.Classify(dupli_.getLI())) {
DEBUG(dbgs() << " Remainder has " << NumComp << " connected components: "
<< *dupli_.getLI() << '\n');
// Did the remainder break up? Create intervals for all the components.
if (NumComp > 1) {
SmallVector<LiveInterval*, 8> dups;
dups.push_back(dupli_.getLI());
for (unsigned i = 1; i != NumComp; ++i)
dups.push_back(&edit_.create(mri_, lis_, vrm_));
ConEQ.Distribute(&dups[0]);
// Rewrite uses to the new regs.
rewrite(dupli_.getLI()->reg);
}
}
// Rewrite instructions.
rewrite(edit_.getReg());
// Now check if any registers were separated into multiple components.
ConnectedVNInfoEqClasses ConEQ(lis_);
for (unsigned i = 0, e = edit_.size(); i != e; ++i) {
// Don't use iterators, they are invalidated by create() below.
LiveInterval *li = edit_.get(i);
unsigned NumComp = ConEQ.Classify(li);
if (NumComp <= 1)
continue;
DEBUG(dbgs() << " " << NumComp << " components: " << *li << '\n');
SmallVector<LiveInterval*, 8> dups;
dups.push_back(li);
for (unsigned i = 1; i != NumComp; ++i)
dups.push_back(&edit_.create(mri_, lis_, vrm_));
ConEQ.Distribute(&dups[0]);
// Rewrite uses to the new regs.
rewrite(li->reg);
}
// Calculate spill weight and allocation hints for new intervals.
VirtRegAuxInfo vrai(vrm_.getMachineFunction(), lis_, sa_.loops_);
for (LiveRangeEdit::iterator I = edit_.begin(), E = edit_.end(); I != E; ++I){