diff options
author | Geoff Berry <gberry@codeaurora.org> | 2018-05-14 17:31:18 +0000 |
---|---|---|
committer | Geoff Berry <gberry@codeaurora.org> | 2018-05-14 17:31:18 +0000 |
commit | 64a2ea41eaca32a6ba66db6b699ca33b2eee095b (patch) | |
tree | f2ea82ffd78bf8ded706e71f90883b1b255eaa0e /llvm/lib/CodeGen/BranchFolding.cpp | |
parent | 4135de2e93e19879492cd8a79a0c5371e1979cd6 (diff) | |
download | llvm-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.cpp | 6 |
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. |