aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/BranchFolding.cpp
diff options
context:
space:
mode:
authorGeoff Berry <gberry@codeaurora.org>2018-05-14 17:31:18 +0000
committerGeoff Berry <gberry@codeaurora.org>2018-05-14 17:31:18 +0000
commit64a2ea41eaca32a6ba66db6b699ca33b2eee095b (patch)
treef2ea82ffd78bf8ded706e71f90883b1b255eaa0e /llvm/lib/CodeGen/BranchFolding.cpp
parent4135de2e93e19879492cd8a79a0c5371e1979cd6 (diff)
downloadllvm-64a2ea41eaca32a6ba66db6b699ca33b2eee095b.zip
llvm-64a2ea41eaca32a6ba66db6b699ca33b2eee095b.tar.gz
llvm-64a2ea41eaca32a6ba66db6b699ca33b2eee095b.tar.bz2
[BranchFolding] Allow hoisting to block with a single conditional branch.
Summary: The BranchFolding pass is currently missing opportunities to hoist common code if the hoisted-to block contains a single conditional branch that has register uses. This occurs somewhat frequently on AArch64 with CBZ/TBZ opcodes. This change also eliminates some code differences when debug info is present since the presence of e.g. DBG_VALUE instructions in the hoisted-to block can enable hoisting that wouldn't have occurred without them. Reviewers: MatzeB, rnk, kparzysz, twoh, aprantl, javed.absar Subscribers: kristof.beyls, JDevlieghere, mcrosier, llvm-commits Differential Revision: https://reviews.llvm.org/D46324 llvm-svn: 332265
Diffstat (limited to 'llvm/lib/CodeGen/BranchFolding.cpp')
-rw-r--r--llvm/lib/CodeGen/BranchFolding.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp
index 190dfc0..ef9b65d 100644
--- a/llvm/lib/CodeGen/BranchFolding.cpp
+++ b/llvm/lib/CodeGen/BranchFolding.cpp
@@ -1915,8 +1915,12 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
if (Uses.empty())
return Loc;
+ // If the terminator is the only instruction in the block and Uses is not
+ // empty (or we would have returned above), we can still safely hoist
+ // instructions just before the terminator as long as the Defs/Uses are not
+ // violated (which is checked in HoistCommonCodeInSuccs).
if (Loc == MBB->begin())
- return MBB->end();
+ return Loc;
// The terminator is probably a conditional branch, try not to separate the
// branch from condition setting instruction.