aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineBlockPlacement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/MachineBlockPlacement.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineBlockPlacement.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp
index e4ddb04..ae0f5bd 100644
--- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp
+++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp
@@ -68,6 +68,13 @@ ExitBlockBias("block-placement-exit-block-bias",
"over the original exit to be considered the new exit."),
cl::init(0), cl::Hidden);
+static cl::opt<bool> PlaceLastSuccessor(
+ "place-last-successor",
+ cl::desc("When selecting a non-successor block, choose the last block to "
+ "have been a successor. This represents the block whose "
+ "predecessor was most recently placed."),
+ cl::init(false), cl::Hidden);
+
static cl::opt<bool> OutlineOptionalBranches(
"outline-optional-branches",
cl::desc("Put completely optional branches, i.e. branches with a common "
@@ -443,6 +450,25 @@ MachineBasicBlock *MachineBlockPlacement::selectBestSuccessor(
MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
const BlockFilterSet *BlockFilter) {
+ if (PlaceLastSuccessor) {
+ // If we're just placing the last successor as the best candidate, the
+ // logic is super simple. We skip the already placed entries on the
+ // worklist and return the most recently added entry that isn't placed.
+ while (!WorkList.empty()) {
+ MachineBasicBlock *SuccBB = WorkList.pop_back_val();
+ BlockChain &SuccChain = *BlockToChain.lookup(SuccBB);
+ if (&SuccChain == &Chain) {
+ DEBUG(dbgs() << " " << getBlockName(SuccBB)
+ << " -> Already merged!\n");
+ continue;
+ }
+ assert(SuccChain.LoopPredecessors == 0 && "Found CFG-violating block");
+ return SuccBB;
+ }
+
+ return nullptr;
+ }
+
// Once we need to walk the worklist looking for a candidate, cleanup the
// worklist of already placed entries.
// FIXME: If this shows up on profiles, it could be folded (at the cost of