1212//
1313// ===----------------------------------------------------------------------===//
1414
15+ #include " llvm/CodeGen/TailDuplication.h"
1516#include " llvm/Analysis/ProfileSummaryInfo.h"
1617#include " llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
1718#include " llvm/CodeGen/MBFIWrapper.h"
1819#include " llvm/CodeGen/MachineBranchProbabilityInfo.h"
1920#include " llvm/CodeGen/MachineFunction.h"
2021#include " llvm/CodeGen/MachineFunctionPass.h"
22+ #include " llvm/CodeGen/MachinePassManager.h"
2123#include " llvm/CodeGen/TailDuplicator.h"
24+ #include " llvm/IR/Analysis.h"
2225#include " llvm/InitializePasses.h"
2326#include " llvm/Pass.h"
2427#include " llvm/PassRegistry.h"
@@ -29,13 +32,13 @@ using namespace llvm;
2932
3033namespace {
3134
32- class TailDuplicateBase : public MachineFunctionPass {
35+ class TailDuplicateBaseLegacy : public MachineFunctionPass {
3336 TailDuplicator Duplicator;
3437 std::unique_ptr<MBFIWrapper> MBFIW;
3538 bool PreRegAlloc;
3639public:
37- TailDuplicateBase (char &PassID, bool PreRegAlloc)
38- : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
40+ TailDuplicateBaseLegacy (char &PassID, bool PreRegAlloc)
41+ : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
3942
4043 bool runOnMachineFunction (MachineFunction &MF) override ;
4144
@@ -47,19 +50,19 @@ class TailDuplicateBase : public MachineFunctionPass {
4750 }
4851};
4952
50- class TailDuplicate : public TailDuplicateBase {
53+ class TailDuplicateLegacy : public TailDuplicateBaseLegacy {
5154public:
5255 static char ID;
53- TailDuplicate () : TailDuplicateBase (ID, false ) {
54- initializeTailDuplicatePass (*PassRegistry::getPassRegistry ());
56+ TailDuplicateLegacy () : TailDuplicateBaseLegacy (ID, false ) {
57+ initializeTailDuplicateLegacyPass (*PassRegistry::getPassRegistry ());
5558 }
5659};
5760
58- class EarlyTailDuplicate : public TailDuplicateBase {
61+ class EarlyTailDuplicateLegacy : public TailDuplicateBaseLegacy {
5962public:
6063 static char ID;
61- EarlyTailDuplicate () : TailDuplicateBase (ID, true ) {
62- initializeEarlyTailDuplicatePass (*PassRegistry::getPassRegistry ());
64+ EarlyTailDuplicateLegacy () : TailDuplicateBaseLegacy (ID, true ) {
65+ initializeEarlyTailDuplicateLegacyPass (*PassRegistry::getPassRegistry ());
6366 }
6467
6568 MachineFunctionProperties getClearedProperties () const override {
@@ -70,17 +73,18 @@ class EarlyTailDuplicate : public TailDuplicateBase {
7073
7174} // end anonymous namespace
7275
73- char TailDuplicate ::ID;
74- char EarlyTailDuplicate ::ID;
76+ char TailDuplicateLegacy ::ID;
77+ char EarlyTailDuplicateLegacy ::ID;
7578
76- char &llvm::TailDuplicateID = TailDuplicate ::ID;
77- char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate ::ID;
79+ char &llvm::TailDuplicateLegacyID = TailDuplicateLegacy ::ID;
80+ char &llvm::EarlyTailDuplicateLegacyID = EarlyTailDuplicateLegacy ::ID;
7881
79- INITIALIZE_PASS (TailDuplicate, DEBUG_TYPE, " Tail Duplication" , false , false )
80- INITIALIZE_PASS(EarlyTailDuplicate, " early-tailduplication" ,
82+ INITIALIZE_PASS (TailDuplicateLegacy, DEBUG_TYPE, " Tail Duplication" , false ,
83+ false )
84+ INITIALIZE_PASS(EarlyTailDuplicateLegacy, " early-tailduplication" ,
8185 " Early Tail Duplication" , false , false )
8286
83- bool TailDuplicateBase ::runOnMachineFunction(MachineFunction &MF) {
87+ bool TailDuplicateBaseLegacy ::runOnMachineFunction(MachineFunction &MF) {
8488 if (skipFunction (MF.getFunction ()))
8589 return false ;
8690
@@ -100,3 +104,36 @@ bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
100104
101105 return MadeChange;
102106}
107+
108+ template <typename DerivedT, bool PreRegAlloc>
109+ PreservedAnalyses TailDuplicatePassBase<DerivedT, PreRegAlloc>::run(
110+ MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
111+ MFPropsModifier _ (static_cast <DerivedT &>(*this ), MF);
112+
113+ if (MF.getFunction ().hasOptNone ())
114+ return PreservedAnalyses::all ();
115+
116+ auto *MBPI = &MFAM.getResult <MachineBranchProbabilityAnalysis>(MF);
117+ auto *PSI = MFAM.getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
118+ .getCachedResult <ProfileSummaryAnalysis>(
119+ *MF.getFunction ().getParent ());
120+ auto *MBFI = (PSI && PSI->hasProfileSummary ()
121+ ? &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF)
122+ : nullptr );
123+ if (MBFI)
124+ MBFIW = std::make_unique<MBFIWrapper>(*MBFI);
125+
126+ TailDuplicator Duplicator;
127+ Duplicator.initMF (MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get () : nullptr , PSI,
128+ /* LayoutMode=*/ false );
129+ bool MadeChange = false ;
130+ while (Duplicator.tailDuplicateBlocks ())
131+ MadeChange = true ;
132+
133+ if (!MadeChange)
134+ return PreservedAnalyses::all ();
135+ return getMachineFunctionPassPreservedAnalyses ();
136+ }
137+
138+ template class llvm ::TailDuplicatePassBase<TailDuplicatePass, false >;
139+ template class llvm ::TailDuplicatePassBase<EarlyTailDuplicatePass, true >;
0 commit comments