diff options
Diffstat (limited to 'llvm/lib/CodeGen/BranchRelaxation.cpp')
-rw-r--r-- | llvm/lib/CodeGen/BranchRelaxation.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/BranchRelaxation.cpp b/llvm/lib/CodeGen/BranchRelaxation.cpp index a36906540a2..ddf8797d479 100644 --- a/llvm/lib/CodeGen/BranchRelaxation.cpp +++ b/llvm/lib/CodeGen/BranchRelaxation.cpp @@ -404,6 +404,28 @@ bool BranchRelaxation::relaxBranchInstructions() { 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::relaxBranchInstructions() { 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; - } } } |