| //===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| /// \file This pass duplicates basic blocks ending in unconditional branches | |
| /// into the tails of their predecessors, using the TailDuplicator utility | |
| /// class. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" | |
| #include "llvm/CodeGen/MachineFunction.h" | |
| #include "llvm/CodeGen/MachineFunctionPass.h" | |
| #include "llvm/CodeGen/MachineRegisterInfo.h" | |
| #include "llvm/CodeGen/Passes.h" | |
| #include "llvm/CodeGen/TailDuplicator.h" | |
| #include "llvm/Pass.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "tailduplication" | |
| namespace { | |
| class TailDuplicateBase : public MachineFunctionPass { | |
| TailDuplicator Duplicator; | |
| bool PreRegAlloc; | |
| public: | |
| TailDuplicateBase(char &PassID, bool PreRegAlloc) | |
| : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {} | |
| bool runOnMachineFunction(MachineFunction &MF) 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 TailDuplicate::ID; | |
| char EarlyTailDuplicate::ID; | |
| char &llvm::TailDuplicateID = TailDuplicate::ID; | |
| char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID; | |
| INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false) | |
| INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication", | |
| "Early Tail Duplication", false, false) | |
| bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) { | |
| if (skipFunction(MF.getFunction())) | |
| return false; | |
| auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); | |
| Duplicator.initMF(MF, PreRegAlloc, MBPI, /*LayoutMode=*/false); | |
| bool MadeChange = false; | |
| while (Duplicator.tailDuplicateBlocks()) | |
| MadeChange = true; | |
| return MadeChange; | |
| } |