After splitting, compute connected components of all new registers, not just for
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 26 Oct 2010 22:36:09 +0000 (22:36 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 26 Oct 2010 22:36:09 +0000 (22:36 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117408 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveRangeEdit.h
lib/CodeGen/SplitKit.cpp

index d6ba256aee4f152716b3418a10c6131e5e3c8084..3230a2e9fcd41c0d861b6d17ef19f5a20821b792 100644 (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.
index 446475e6d1dd4a78573ae4bcb28bb9189914e7a8..9307286a610f4f7b5d3a95f04087ab1742865ff0 100644 (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){