86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- 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;
 | |
| }
 |