aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm/lib/CodeGen/TailDuplication.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/CodeGen/TailDuplication.cpp')
-rw-r--r--contrib/llvm/lib/CodeGen/TailDuplication.cpp59
1 files changed, 36 insertions, 23 deletions
diff --git a/contrib/llvm/lib/CodeGen/TailDuplication.cpp b/contrib/llvm/lib/CodeGen/TailDuplication.cpp
index df1eebf43b2b..25cd7802264e 100644
--- a/contrib/llvm/lib/CodeGen/TailDuplication.cpp
+++ b/contrib/llvm/lib/CodeGen/TailDuplication.cpp
@@ -7,8 +7,9 @@
//
//===----------------------------------------------------------------------===//
//
-// This pass duplicates basic blocks ending in unconditional branches into
-// the tails of their predecessors, using the TailDuplicator utility class.
+/// \file This pass duplicates basic blocks ending in unconditional branches
+/// into the tails of their predecessors, using the TailDuplicator utility
+/// class.
//
//===----------------------------------------------------------------------===//
@@ -26,38 +27,55 @@ using namespace llvm;
namespace {
-/// Perform tail duplication. Delegates to TailDuplicator
-class TailDuplicatePass : public MachineFunctionPass {
+class TailDuplicateBase : public MachineFunctionPass {
TailDuplicator Duplicator;
-
+ bool PreRegAlloc;
public:
- static char ID;
-
- explicit TailDuplicatePass() : MachineFunctionPass(ID) {}
+ TailDuplicateBase(char &PassID, bool PreRegAlloc)
+ : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
bool runOnMachineFunction(MachineFunction &MF) override;
- void getAnalysisUsage(AnalysisUsage &AU) const override;
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.addRequired<MachineBranchProbabilityInfo>();
+ MachineFunctionPass::getAnalysisUsage(AU);
+ }
+};
+
+class TailDuplicate : public TailDuplicateBase {
+public:
+ static char ID;
+ TailDuplicate() : TailDuplicateBase(ID, false) {
+ initializeTailDuplicatePass(*PassRegistry::getPassRegistry());
+ }
+};
+
+class EarlyTailDuplicate : public TailDuplicateBase {
+public:
+ static char ID;
+ EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
+ initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry());
+ }
};
} // end anonymous namespace
-char TailDuplicatePass::ID = 0;
+char TailDuplicate::ID;
+char EarlyTailDuplicate::ID;
-char &llvm::TailDuplicateID = TailDuplicatePass::ID;
+char &llvm::TailDuplicateID = TailDuplicate::ID;
+char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID;
-INITIALIZE_PASS(TailDuplicatePass, DEBUG_TYPE, "Tail Duplication", false, false)
+INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
+INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
+ "Early Tail Duplication", false, false)
-bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
+bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
if (skipFunction(MF.getFunction()))
return false;
auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
-
- // TODO: Querying isSSA() to determine pre-/post-regalloc is fragile, better
- // split this into two passes instead.
- bool PreRegAlloc = MF.getRegInfo().isSSA();
- Duplicator.initMF(MF, PreRegAlloc, MBPI, /* LayoutMode */ false);
+ Duplicator.initMF(MF, PreRegAlloc, MBPI, /*LayoutMode=*/false);
bool MadeChange = false;
while (Duplicator.tailDuplicateBlocks())
@@ -65,8 +83,3 @@ bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
return MadeChange;
}
-
-void TailDuplicatePass::getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<MachineBranchProbabilityInfo>();
- MachineFunctionPass::getAnalysisUsage(AU);
-}