|
24 | 24 | #include "llvm/ADT/Statistic.h" |
25 | 25 | #include "llvm/Analysis/ProfileSummaryInfo.h" |
26 | 26 | #include "llvm/CodeGen/Analysis.h" |
| 27 | +#include "llvm/CodeGen/BranchFoldingPass.h" |
27 | 28 | #include "llvm/CodeGen/MBFIWrapper.h" |
28 | 29 | #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" |
29 | 30 | #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" |
@@ -88,38 +89,62 @@ TailMergeSize("tail-merge-size", |
88 | 89 | namespace { |
89 | 90 |
|
90 | 91 | /// BranchFolderPass - Wrap branch folder in a machine function pass. |
91 | | - class BranchFolderPass : public MachineFunctionPass { |
92 | | - public: |
93 | | - static char ID; |
| 92 | +class BranchFolderLegacy : public MachineFunctionPass { |
| 93 | +public: |
| 94 | + static char ID; |
94 | 95 |
|
95 | | - explicit BranchFolderPass(): MachineFunctionPass(ID) {} |
| 96 | + explicit BranchFolderLegacy() : MachineFunctionPass(ID) {} |
96 | 97 |
|
97 | | - bool runOnMachineFunction(MachineFunction &MF) override; |
| 98 | + bool runOnMachineFunction(MachineFunction &MF) override; |
98 | 99 |
|
99 | | - void getAnalysisUsage(AnalysisUsage &AU) const override { |
100 | | - AU.addRequired<MachineBlockFrequencyInfoWrapperPass>(); |
101 | | - AU.addRequired<MachineBranchProbabilityInfoWrapperPass>(); |
102 | | - AU.addRequired<ProfileSummaryInfoWrapperPass>(); |
103 | | - AU.addRequired<TargetPassConfig>(); |
104 | | - MachineFunctionPass::getAnalysisUsage(AU); |
105 | | - } |
| 100 | + void getAnalysisUsage(AnalysisUsage &AU) const override { |
| 101 | + AU.addRequired<MachineBlockFrequencyInfoWrapperPass>(); |
| 102 | + AU.addRequired<MachineBranchProbabilityInfoWrapperPass>(); |
| 103 | + AU.addRequired<ProfileSummaryInfoWrapperPass>(); |
| 104 | + AU.addRequired<TargetPassConfig>(); |
| 105 | + MachineFunctionPass::getAnalysisUsage(AU); |
| 106 | + } |
106 | 107 |
|
107 | | - MachineFunctionProperties getRequiredProperties() const override { |
108 | | - return MachineFunctionProperties().set( |
109 | | - MachineFunctionProperties::Property::NoPHIs); |
110 | | - } |
111 | | - }; |
| 108 | + MachineFunctionProperties getRequiredProperties() const override { |
| 109 | + return MachineFunctionProperties().set( |
| 110 | + MachineFunctionProperties::Property::NoPHIs); |
| 111 | + } |
| 112 | +}; |
112 | 113 |
|
113 | 114 | } // end anonymous namespace |
114 | 115 |
|
115 | | -char BranchFolderPass::ID = 0; |
116 | | - |
117 | | -char &llvm::BranchFolderPassID = BranchFolderPass::ID; |
118 | | - |
119 | | -INITIALIZE_PASS(BranchFolderPass, DEBUG_TYPE, |
120 | | - "Control Flow Optimizer", false, false) |
| 116 | +char BranchFolderLegacy::ID = 0; |
| 117 | + |
| 118 | +char &llvm::BranchFolderPassID = BranchFolderLegacy::ID; |
| 119 | + |
| 120 | +INITIALIZE_PASS(BranchFolderLegacy, DEBUG_TYPE, "Control Flow Optimizer", false, |
| 121 | + false) |
| 122 | + |
| 123 | +PreservedAnalyses BranchFolderPass::run(MachineFunction &MF, |
| 124 | + MachineFunctionAnalysisManager &MFAM) { |
| 125 | + MFPropsModifier _(*this, MF); |
| 126 | + bool EnableTailMerge = |
| 127 | + !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge; |
| 128 | + |
| 129 | + auto &MBPI = MFAM.getResult<MachineBranchProbabilityAnalysis>(MF); |
| 130 | + auto *PSI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF) |
| 131 | + .getCachedResult<ProfileSummaryAnalysis>( |
| 132 | + *MF.getFunction().getParent()); |
| 133 | + if (!PSI) |
| 134 | + report_fatal_error( |
| 135 | + "ProfileSummaryAnalysis is required for BranchFoldingPass", false); |
| 136 | + |
| 137 | + auto &MBFI = MFAM.getResult<MachineBlockFrequencyAnalysis>(MF); |
| 138 | + MBFIWrapper MBBFreqInfo(MBFI); |
| 139 | + BranchFolder Folder(EnableTailMerge, /*CommonHoist=*/true, MBBFreqInfo, MBPI, |
| 140 | + PSI); |
| 141 | + if (!Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(), |
| 142 | + MF.getSubtarget().getRegisterInfo())) |
| 143 | + return PreservedAnalyses::all(); |
| 144 | + return getMachineFunctionPassPreservedAnalyses(); |
| 145 | +} |
121 | 146 |
|
122 | | -bool BranchFolderPass::runOnMachineFunction(MachineFunction &MF) { |
| 147 | +bool BranchFolderLegacy::runOnMachineFunction(MachineFunction &MF) { |
123 | 148 | if (skipFunction(MF.getFunction())) |
124 | 149 | return false; |
125 | 150 |
|
|
0 commit comments