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"
@@ -47,19 +50,19 @@ class TailDuplicateBase : public MachineFunctionPass {
4750 }
4851};
4952
50- class TailDuplicate : public TailDuplicateBase {
53+ class TailDuplicateLegacy : public TailDuplicateBase {
5154public:
5255 static char ID;
53- TailDuplicate () : TailDuplicateBase(ID, false ) {
54- initializeTailDuplicatePass (*PassRegistry::getPassRegistry ());
56+ TailDuplicateLegacy () : TailDuplicateBase(ID, false ) {
57+ initializeTailDuplicateLegacyPass (*PassRegistry::getPassRegistry ());
5558 }
5659};
5760
58- class EarlyTailDuplicate : public TailDuplicateBase {
61+ class EarlyTailDuplicateLegacy : public TailDuplicateBase {
5962public:
6063 static char ID;
61- EarlyTailDuplicate () : TailDuplicateBase(ID, true ) {
62- initializeEarlyTailDuplicatePass (*PassRegistry::getPassRegistry ());
64+ EarlyTailDuplicateLegacy () : TailDuplicateBase(ID, true ) {
65+ initializeEarlyTailDuplicateLegacyPass (*PassRegistry::getPassRegistry ());
6366 }
6467
6568 MachineFunctionProperties getClearedProperties () const override {
@@ -70,14 +73,15 @@ 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
8387bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
@@ -100,3 +104,33 @@ 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<DerivedT> _ (static_cast <DerivedT &>(*this ), MF);
112+
113+ auto *MBPI = &MFAM.getResult <MachineBranchProbabilityAnalysis>(MF);
114+ auto *PSI = MFAM.getResult <ModuleAnalysisManagerMachineFunctionProxy>(MF)
115+ .getCachedResult <ProfileSummaryAnalysis>(
116+ *MF.getFunction ().getParent ());
117+ auto *MBFI = (PSI && PSI->hasProfileSummary ()
118+ ? &MFAM.getResult <MachineBlockFrequencyAnalysis>(MF)
119+ : nullptr );
120+ if (MBFI)
121+ MBFIW = std::make_unique<MBFIWrapper>(*MBFI);
122+
123+ TailDuplicator Duplicator;
124+ Duplicator.initMF (MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get () : nullptr , PSI,
125+ /* LayoutMode=*/ false );
126+ bool MadeChange = false ;
127+ while (Duplicator.tailDuplicateBlocks ())
128+ MadeChange = true ;
129+
130+ if (!MadeChange)
131+ return PreservedAnalyses::all ();
132+ return getMachineFunctionPassPreservedAnalyses ();
133+ }
134+
135+ template class llvm ::TailDuplicatePassBase<TailDuplicatePass, false >;
136+ template class llvm ::TailDuplicatePassBase<EarlyTailDuplicatePass, true >;
0 commit comments