Turns out AnalyzeBranch can modify the mbb being analyzed. This is a nasty
[oota-llvm.git] / lib / CodeGen / LoopAligner.cpp
index 60e3f1943055cc7695fa982c223bccb9cf3d738c..b67f5c3bf9192e0a9a444a813a4331d26a316102 100644 (file)
@@ -59,13 +59,19 @@ bool LoopAligner::runOnMachineFunction(MachineFunction &MF) {
     return false;  // Don't care about loop alignment.
 
   const Function *F = MF.getFunction();
-  if (!F->isDeclaration() && F->hasFnAttr(Attribute::OptimizeForSize))
+  if (F->hasFnAttr(Attribute::OptimizeForSize))
     return false;
 
   for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
     MachineBasicBlock *MBB = I;
-    if (MLI->isLoopHeader(MBB))
+    if (MLI->isLoopHeader(MBB)) {
+      MachineBasicBlock *PredBB = prior(I);
+      if (MLI->getLoopFor(MBB) == MLI->getLoopFor(PredBB))
+        // If previously BB is in the same loop, don't align this BB. We want
+        // to prevent adding noop's inside a loop.
+        continue;
       MBB->setAlignment(Align);
+    }
   }
 
   return true;