Remove use of reverse iterators in repairIntervalsInRange(). While they were
authorCameron Zwarich <zwarich@apple.com>
Sun, 17 Feb 2013 11:09:00 +0000 (11:09 +0000)
committerCameron Zwarich <zwarich@apple.com>
Sun, 17 Feb 2013 11:09:00 +0000 (11:09 +0000)
arguably better than forward iterators for this use case, they are confusing and
there are some implementation problems with reverse iterators and MI bundles.

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

include/llvm/CodeGen/LiveIntervalAnalysis.h
lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/MachineBasicBlock.cpp

index 46dfd92801ae588093c025337e54f4b7a3583c5c..c0de49e52ab78638cfa75135ce56d4afd39768ec 100644 (file)
@@ -282,9 +282,9 @@ namespace llvm {
                               bool UpdateFlags = false);
 
     /// repairIntervalsInRange - Update live intervals for instructions in a
-    /// small range of reverse iterators. It is intended for use after target
-    /// hooks that may insert or remove instructions, and is only efficient for
-    /// a small number of instructions.
+    /// range of iterators. It is intended for use after target hooks that may
+    /// insert or remove instructions, and is only efficient for a small number
+    /// of instructions.
     ///
     /// OrigRegs is a vector of registers that were originally used by the
     /// instructions in the range between the two iterators.
@@ -292,8 +292,8 @@ namespace llvm {
     /// Currently, the only only changes that are supported are simple removal
     /// and addition of uses.
     void repairIntervalsInRange(MachineBasicBlock *MBB,
-                                MachineBasicBlock::reverse_iterator RBegin,
-                                MachineBasicBlock::reverse_iterator REnd,
+                                MachineBasicBlock::iterator Begin,
+                                MachineBasicBlock::iterator End,
                                 ArrayRef<unsigned> OrigRegs);
 
     // Register mask functions.
index e09ac4bfbd8295a9fad5390d308a17463bbd13b6..0978d7342ecb7dc0afab6fcd6b8d05d72adda787 100644 (file)
@@ -1035,19 +1035,24 @@ void LiveIntervals::handleMoveIntoBundle(MachineInstr* MI,
 
 void
 LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
-                                     MachineBasicBlock::reverse_iterator RBegin,
-                                     MachineBasicBlock::reverse_iterator REnd,
+                                      MachineBasicBlock::iterator Begin,
+                                      MachineBasicBlock::iterator End,
                                       ArrayRef<unsigned> OrigRegs) {
+  SlotIndex startIdx;
+  if (Begin == MBB->begin())
+    startIdx = getMBBStartIdx(MBB);
+  else
+    startIdx = getInstructionIndex(prior(Begin)).getRegSlot();
+
   for (unsigned i = 0, e = OrigRegs.size(); i != e; ++i) {
     unsigned Reg = OrigRegs[i];
     if (!TargetRegisterInfo::isVirtualRegister(Reg))
       continue;
 
     LiveInterval &LI = getInterval(Reg);
-    SlotIndex startIdx = (REnd == MBB->rend()) ? getMBBStartIdx(MBB)
-                                               : getInstructionIndex(&*REnd);
-    for (MachineBasicBlock::reverse_iterator I = RBegin; I != REnd; ++I) {
-      MachineInstr *MI = &*I;
+    for (MachineBasicBlock::iterator I = End; I != Begin;) {
+      --I;
+      MachineInstr *MI = I;
       SlotIndex instrIdx = getInstructionIndex(MI);
 
       for (MachineInstr::mop_iterator OI = MI->operands_begin(),
@@ -1059,7 +1064,7 @@ LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
         assert(MO.isUse() && "Register defs are not yet supported.");
 
         if (!LI.liveAt(instrIdx)) {
-          LiveRange *LR = LI.getLiveRangeContaining(startIdx.getRegSlot());
+          LiveRange *LR = LI.getLiveRangeContaining(startIdx);
           assert(LR && "Used registers must be live-in.");
           LR->end = instrIdx.getRegSlot();
           break;
index f22a70716ebf6ccb4637052a1cec35117d758827..898e165feeab6b163bc56b6b9f00f5a02796d50a 100644 (file)
@@ -851,15 +851,7 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
 
     // Update all intervals for registers whose uses may have been modified by
     // updateTerminator().
-    iterator FirstTerminator = getFirstTerminator();
-    reverse_iterator PreTerminators;
-    if (FirstTerminator == begin())
-      PreTerminators = rend();
-    else if (FirstTerminator == end())
-      PreTerminators = rbegin();
-    else
-      PreTerminators = reverse_iterator(FirstTerminator);
-    LIS->repairIntervalsInRange(this, rbegin(), PreTerminators, UsedRegs);
+    LIS->repairIntervalsInRange(this, getFirstTerminator(), end(), UsedRegs);
   }
 
   if (MachineDominatorTree *MDT =