1 //===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// \file This pass duplicates basic blocks ending in unconditional branches 10 /// into the tails of their predecessors, using the TailDuplicator utility 11 /// class. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/Analysis/ProfileSummaryInfo.h" 16 #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h" 17 #include "llvm/CodeGen/MBFIWrapper.h" 18 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" 19 #include "llvm/CodeGen/MachineFunction.h" 20 #include "llvm/CodeGen/MachineFunctionPass.h" 21 #include "llvm/CodeGen/TailDuplicator.h" 22 #include "llvm/InitializePasses.h" 23 #include "llvm/Pass.h" 24 #include "llvm/PassRegistry.h" 25 26 using namespace llvm; 27 28 #define DEBUG_TYPE "tailduplication" 29 30 namespace { 31 32 class TailDuplicateBase : public MachineFunctionPass { 33 TailDuplicator Duplicator; 34 std::unique_ptr<MBFIWrapper> MBFIW; 35 bool PreRegAlloc; 36 public: 37 TailDuplicateBase(char &PassID, bool PreRegAlloc) 38 : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {} 39 40 bool runOnMachineFunction(MachineFunction &MF) override; 41 42 void getAnalysisUsage(AnalysisUsage &AU) const override { 43 AU.addRequired<MachineBranchProbabilityInfo>(); 44 AU.addRequired<LazyMachineBlockFrequencyInfoPass>(); 45 AU.addRequired<ProfileSummaryInfoWrapperPass>(); 46 MachineFunctionPass::getAnalysisUsage(AU); 47 } 48 }; 49 50 class TailDuplicate : public TailDuplicateBase { 51 public: 52 static char ID; 53 TailDuplicate() : TailDuplicateBase(ID, false) { 54 initializeTailDuplicatePass(*PassRegistry::getPassRegistry()); 55 } 56 }; 57 58 class EarlyTailDuplicate : public TailDuplicateBase { 59 public: 60 static char ID; 61 EarlyTailDuplicate() : TailDuplicateBase(ID, true) { 62 initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry()); 63 } 64 65 MachineFunctionProperties getClearedProperties() const override { 66 return MachineFunctionProperties() 67 .set(MachineFunctionProperties::Property::NoPHIs); 68 } 69 }; 70 71 } // end anonymous namespace 72 73 char TailDuplicate::ID; 74 char EarlyTailDuplicate::ID; 75 76 char &llvm::TailDuplicateID = TailDuplicate::ID; 77 char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID; 78 79 INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false) 80 INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication", 81 "Early Tail Duplication", false, false) 82 83 bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) { 84 if (skipFunction(MF.getFunction())) 85 return false; 86 87 auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); 88 auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI(); 89 auto *MBFI = (PSI && PSI->hasProfileSummary()) ? 90 &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI() : 91 nullptr; 92 if (MBFI) 93 MBFIW = std::make_unique<MBFIWrapper>(*MBFI); 94 Duplicator.initMF(MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get() : nullptr, PSI, 95 /*LayoutMode=*/false); 96 97 bool MadeChange = false; 98 while (Duplicator.tailDuplicateBlocks()) 99 MadeChange = true; 100 101 return MadeChange; 102 } 103