diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/TailDuplication.cpp')
-rw-r--r-- | contrib/llvm/lib/CodeGen/TailDuplication.cpp | 59 |
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); -} |