Cleanup the main RegisterCoalescer loop.
authorAndrew Trick <atrick@apple.com>
Tue, 13 Nov 2012 00:34:44 +0000 (00:34 +0000)
committerAndrew Trick <atrick@apple.com>
Tue, 13 Nov 2012 00:34:44 +0000 (00:34 +0000)
Block priorities still apply outside loops.

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

lib/CodeGen/RegisterCoalescer.cpp
test/CodeGen/ARM/coalesce-subregs.ll

index 7d69176729dca32f07530420a91385860810f831..57aa6f95ad330dda012f53465d98709daf7ea81f 100644 (file)
@@ -2001,30 +2001,17 @@ void RegisterCoalescer::joinAllIntervals() {
   DEBUG(dbgs() << "********** JOINING INTERVALS ***********\n");
   assert(WorkList.empty() && "Old data still around.");
 
-  if (Loops->empty()) {
-    // If there are no loops in the function, join intervals in function order.
-    for (MachineFunction::iterator I = MF->begin(), E = MF->end();
-         I != E; ++I)
-      copyCoalesceInMBB(I);
-  } else {
-    // Otherwise, join intervals in inner loops before other intervals.
-    // Unfortunately we can't just iterate over loop hierarchy here because
-    // there may be more MBB's than BB's.  Collect MBB's for sorting.
-
-    // Join intervals in the function prolog first. We want to join physical
-    // registers with virtual registers before the intervals got too long.
-    std::vector<MBBPriorityInfo> MBBs;
-    for (MachineFunction::iterator I = MF->begin(), E = MF->end();I != E;++I){
-      MachineBasicBlock *MBB = I;
-      MBBs.push_back(MBBPriorityInfo(MBB, Loops->getLoopDepth(MBB),
-                                     isSplitEdge(MBB)));
-    }
-    std::sort(MBBs.begin(), MBBs.end(), MBBPriorityCompare());
-
-    // Finally, join intervals in loop nest order.
-    for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
-      copyCoalesceInMBB(MBBs[i].MBB);
+  std::vector<MBBPriorityInfo> MBBs;
+  for (MachineFunction::iterator I = MF->begin(), E = MF->end();I != E;++I){
+    MachineBasicBlock *MBB = I;
+    MBBs.push_back(MBBPriorityInfo(MBB, Loops->getLoopDepth(MBB),
+                                   isSplitEdge(MBB)));
   }
+  std::sort(MBBs.begin(), MBBs.end(), MBBPriorityCompare());
+
+  // Coalesce intervals in MBB priority order.
+  for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
+    copyCoalesceInMBB(MBBs[i].MBB);
 
   // Joining intervals can allow other intervals to be joined.  Iteratively join
   // until we make no progress.
index 14511ad5ce42d7072b47136a01362c2138e580a0..5bdad1d838245c32d8dfe4770886c981c0af15ca 100644 (file)
@@ -147,7 +147,7 @@ if.end:                                           ; preds = %entry, %if.then
 ; CHECK: vmov.f32 {{.*}}, #1.0
 ; CHECK-NOT: vmov
 ; CHECK-NOT: vorr
-; CHECK: %if.end
+; CHECK: bx
 ; We may leave the last insertelement in the if.end block.
 ; It is inserting the %add value into a dead lane, but %add causes interference
 ; in the entry block, and we don't do dead lane checks across basic blocks.