diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-10-26 22:36:09 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-10-26 22:36:09 +0000 |
commit | e4f3317cdaacdf5dadbcf0afb4940af311588e19 (patch) | |
tree | 2597bbff96de0edc9e312fa906477136fb0cdc3d | |
parent | 260fa289df07bed3b8531f20919596248b66d45f (diff) | |
download | bcm5719-llvm-e4f3317cdaacdf5dadbcf0afb4940af311588e19.tar.gz bcm5719-llvm-e4f3317cdaacdf5dadbcf0afb4940af311588e19.zip |
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
-rw-r--r-- | llvm/lib/CodeGen/LiveRangeEdit.h | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.cpp | 35 |
2 files changed, 20 insertions, 17 deletions
diff --git a/llvm/lib/CodeGen/LiveRangeEdit.h b/llvm/lib/CodeGen/LiveRangeEdit.h index d6ba256aee4..3230a2e9fcd 100644 --- a/llvm/lib/CodeGen/LiveRangeEdit.h +++ b/llvm/lib/CodeGen/LiveRangeEdit.h @@ -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. diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp index 446475e6d1d..9307286a610 100644 --- a/llvm/lib/CodeGen/SplitKit.cpp +++ b/llvm/lib/CodeGen/SplitKit.cpp @@ -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){ |