[llvm] r285722 - BranchRelaxation: Expand unconditional branches first

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 1 11:34:01 PDT 2016


Author: arsenm
Date: Tue Nov  1 13:34:00 2016
New Revision: 285722

URL: http://llvm.org/viewvc/llvm-project?rev=285722&view=rev
Log:
BranchRelaxation: Expand unconditional branches first

It's likely if a conditional branch needs to be expanded, the following
unconditional branch will also need expansion. By expanding the
unconditional branch first, the conditional branch can be simply
inverted to jump over the inserted indirect branch block. If the
conditional branch is expanded first, it results in an additional
branch.

This avoids test regressions in future commits.

Modified:
    llvm/trunk/lib/CodeGen/BranchRelaxation.cpp

Modified: llvm/trunk/lib/CodeGen/BranchRelaxation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchRelaxation.cpp?rev=285722&r1=285721&r2=285722&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/BranchRelaxation.cpp (original)
+++ llvm/trunk/lib/CodeGen/BranchRelaxation.cpp Tue Nov  1 13:34:00 2016
@@ -404,6 +404,28 @@ bool BranchRelaxation::relaxBranchInstru
   for (MachineFunction::iterator I = MF->begin(); I != MF->end(); ++I) {
     MachineBasicBlock &MBB = *I;
 
+    auto Last = MBB.rbegin();
+    if (Last == MBB.rend()) // Empty block.
+      continue;
+
+    // Expand the unconditional branch first if necessary. If there is a
+    // conditional branch, this will end up changing the branch destination of
+    // it to be over the newly inserted indirect branch block, which may avoid
+    // the need to try expanding the conditional branch first, saving an extra
+    // jump.
+    if (Last->isUnconditionalBranch()) {
+      // Unconditional branch destination might be unanalyzable, assume these
+      // are OK.
+      if (MachineBasicBlock *DestBB = TII->getBranchDestBlock(*Last)) {
+        if (!isBlockInRange(*Last, *DestBB)) {
+          fixupUnconditionalBranch(*Last);
+          ++NumUnconditionalRelaxed;
+          Changed = true;
+        }
+      }
+    }
+
+    // Loop over the conditional branches.
     MachineBasicBlock::iterator Next;
     for (MachineBasicBlock::iterator J = MBB.getFirstTerminator();
          J != MBB.end(); J = Next) {
@@ -437,21 +459,6 @@ bool BranchRelaxation::relaxBranchInstru
           Next = MBB.getFirstTerminator();
         }
       }
-
-      if (MI.isUnconditionalBranch()) {
-        // Unconditional branch destination might be unanalyzable, assume these
-        // are OK.
-        if (MachineBasicBlock *DestBB = TII->getBranchDestBlock(MI)) {
-          if (!isBlockInRange(MI, *DestBB)) {
-            fixupUnconditionalBranch(MI);
-            ++NumUnconditionalRelaxed;
-            Changed = true;
-          }
-        }
-
-        // Unconditional branch is the last terminator.
-        break;
-      }
     }
   }
 




More information about the llvm-commits mailing list