Skip to content

Commit e0c554a

Browse files
Port CodeGenPrepare to new pass manager (and BasicBlockSectionsProfil… (#75380)
Port CodeGenPrepare to new pass manager and dependency BasicBlockSectionsProfileReader Fixes: #64560 Co-authored-by: Krishna-13-cyber <[email protected]>
1 parent 6681650 commit e0c554a

File tree

112 files changed

+399
-238
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+399
-238
lines changed

llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@
2121
#include "llvm/ADT/StringRef.h"
2222
#include "llvm/CodeGen/MachineBasicBlock.h"
2323
#include "llvm/IR/Module.h"
24+
#include "llvm/IR/PassManager.h"
2425
#include "llvm/InitializePasses.h"
2526
#include "llvm/Pass.h"
2627
#include "llvm/Support/Error.h"
2728
#include "llvm/Support/LineIterator.h"
2829
#include "llvm/Support/MemoryBuffer.h"
30+
#include "llvm/Target/TargetMachine.h"
31+
2932
using namespace llvm;
3033

3134
namespace llvm {
@@ -72,25 +75,13 @@ template <> struct DenseMapInfo<UniqueBBID> {
7275
}
7376
};
7477

75-
class BasicBlockSectionsProfileReader : public ImmutablePass {
78+
class BasicBlockSectionsProfileReader {
7679
public:
77-
static char ID;
78-
80+
friend class BasicBlockSectionsProfileReaderWrapperPass;
7981
BasicBlockSectionsProfileReader(const MemoryBuffer *Buf)
80-
: ImmutablePass(ID), MBuf(Buf),
81-
LineIt(*Buf, /*SkipBlanks=*/true, /*CommentMarker=*/'#') {
82-
initializeBasicBlockSectionsProfileReaderPass(
83-
*PassRegistry::getPassRegistry());
84-
};
82+
: MBuf(Buf), LineIt(*Buf, /*SkipBlanks=*/true, /*CommentMarker=*/'#'){};
8583

86-
BasicBlockSectionsProfileReader() : ImmutablePass(ID) {
87-
initializeBasicBlockSectionsProfileReaderPass(
88-
*PassRegistry::getPassRegistry());
89-
}
90-
91-
StringRef getPassName() const override {
92-
return "Basic Block Sections Profile Reader";
93-
}
84+
BasicBlockSectionsProfileReader(){};
9485

9586
// Returns true if basic block sections profile exist for function \p
9687
// FuncName.
@@ -109,10 +100,6 @@ class BasicBlockSectionsProfileReader : public ImmutablePass {
109100
SmallVector<SmallVector<unsigned>>
110101
getClonePathsForFunction(StringRef FuncName) const;
111102

112-
// Initializes the FunctionNameToDIFilename map for the current module and
113-
// then reads the profile for the matching functions.
114-
bool doInitialization(Module &M) override;
115-
116103
private:
117104
StringRef getAliasName(StringRef FuncName) const {
118105
auto R = FuncAliasMap.find(FuncName);
@@ -170,7 +157,61 @@ class BasicBlockSectionsProfileReader : public ImmutablePass {
170157
// sections profile. \p Buf is a memory buffer that contains the list of
171158
// functions and basic block ids to selectively enable basic block sections.
172159
ImmutablePass *
173-
createBasicBlockSectionsProfileReaderPass(const MemoryBuffer *Buf);
160+
createBasicBlockSectionsProfileReaderWrapperPass(const MemoryBuffer *Buf);
161+
162+
/// Analysis pass providing the \c BasicBlockSectionsProfileReader.
163+
///
164+
/// Note that this pass's result cannot be invalidated, it is immutable for the
165+
/// life of the module.
166+
class BasicBlockSectionsProfileReaderAnalysis
167+
: public AnalysisInfoMixin<BasicBlockSectionsProfileReaderAnalysis> {
168+
169+
public:
170+
static AnalysisKey Key;
171+
typedef BasicBlockSectionsProfileReader Result;
172+
BasicBlockSectionsProfileReaderAnalysis(const TargetMachine *TM) : TM(TM) {}
173+
174+
Result run(Function &F, FunctionAnalysisManager &AM);
175+
176+
private:
177+
const TargetMachine *TM;
178+
};
179+
180+
class BasicBlockSectionsProfileReaderWrapperPass : public ImmutablePass {
181+
public:
182+
static char ID;
183+
BasicBlockSectionsProfileReader BBSPR;
184+
185+
BasicBlockSectionsProfileReaderWrapperPass(const MemoryBuffer *Buf)
186+
: ImmutablePass(ID), BBSPR(BasicBlockSectionsProfileReader(Buf)) {
187+
initializeBasicBlockSectionsProfileReaderWrapperPassPass(
188+
*PassRegistry::getPassRegistry());
189+
};
190+
191+
BasicBlockSectionsProfileReaderWrapperPass()
192+
: ImmutablePass(ID), BBSPR(BasicBlockSectionsProfileReader()) {
193+
initializeBasicBlockSectionsProfileReaderWrapperPassPass(
194+
*PassRegistry::getPassRegistry());
195+
}
196+
197+
StringRef getPassName() const override {
198+
return "Basic Block Sections Profile Reader";
199+
}
200+
201+
bool isFunctionHot(StringRef FuncName) const;
202+
203+
std::pair<bool, SmallVector<BBClusterInfo>>
204+
getClusterInfoForFunction(StringRef FuncName) const;
205+
206+
SmallVector<SmallVector<unsigned>>
207+
getClonePathsForFunction(StringRef FuncName) const;
208+
209+
// Initializes the FunctionNameToDIFilename map for the current module and
210+
// then reads the profile for the matching functions.
211+
bool doInitialization(Module &M) override;
212+
213+
BasicBlockSectionsProfileReader &getBBSPR();
214+
};
174215

175216
} // namespace llvm
176217
#endif // LLVM_CODEGEN_BASICBLOCKSECTIONSPROFILEREADER_H
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//===- CodeGenPrepare.h -----------------------------------------*- C++ -*-===//
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+
/// \file
9+
///
10+
/// Defines an IR pass for CodeGen Prepare.
11+
///
12+
//===----------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_CODEGEN_PREPARE_H
15+
#define LLVM_CODEGEN_PREPARE_H
16+
17+
#include "llvm/IR/PassManager.h"
18+
19+
namespace llvm {
20+
21+
class Function;
22+
class TargetMachine;
23+
24+
class CodeGenPreparePass : public PassInfoMixin<CodeGenPreparePass> {
25+
private:
26+
const TargetMachine *TM;
27+
28+
public:
29+
CodeGenPreparePass(const TargetMachine *TM) : TM(TM) {}
30+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
31+
};
32+
33+
} // end namespace llvm
34+
35+
#endif // LLVM_CODEGEN_PREPARE_H

llvm/include/llvm/CodeGen/Passes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ namespace llvm {
9393
MachineFunctionPass *createResetMachineFunctionPass(bool EmitFallbackDiag,
9494
bool AbortOnFailedISel);
9595

96-
/// createCodeGenPreparePass - Transform the code to expose more pattern
96+
/// createCodeGenPrepareLegacyPass - Transform the code to expose more pattern
9797
/// matching during instruction selection.
98-
FunctionPass *createCodeGenPreparePass();
98+
FunctionPass *createCodeGenPrepareLegacyPass();
9999

100100
/// This pass implements generation of target-specific intrinsics to support
101101
/// handling of complex number arithmetic

llvm/include/llvm/InitializePasses.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void initializeAssignmentTrackingAnalysisPass(PassRegistry &);
5454
void initializeAssumptionCacheTrackerPass(PassRegistry&);
5555
void initializeAtomicExpandPass(PassRegistry&);
5656
void initializeBasicBlockPathCloningPass(PassRegistry &);
57-
void initializeBasicBlockSectionsProfileReaderPass(PassRegistry &);
57+
void initializeBasicBlockSectionsProfileReaderWrapperPassPass(PassRegistry &);
5858
void initializeBasicBlockSectionsPass(PassRegistry &);
5959
void initializeBarrierNoopPass(PassRegistry&);
6060
void initializeBasicAAWrapperPassPass(PassRegistry&);
@@ -75,7 +75,7 @@ void initializeCallGraphDOTPrinterPass(PassRegistry&);
7575
void initializeCallGraphViewerPass(PassRegistry&);
7676
void initializeCallGraphWrapperPassPass(PassRegistry&);
7777
void initializeCheckDebugMachineModulePass(PassRegistry &);
78-
void initializeCodeGenPreparePass(PassRegistry&);
78+
void initializeCodeGenPrepareLegacyPassPass(PassRegistry &);
7979
void initializeComplexDeinterleavingLegacyPassPass(PassRegistry&);
8080
void initializeConstantHoistingLegacyPassPass(PassRegistry&);
8181
void initializeCycleInfoWrapperPassPass(PassRegistry &);

llvm/include/llvm/LinkAllPasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ namespace {
113113
(void) llvm::createTailCallEliminationPass();
114114
(void)llvm::createTLSVariableHoistPass();
115115
(void) llvm::createConstantHoistingPass();
116-
(void) llvm::createCodeGenPreparePass();
116+
(void)llvm::createCodeGenPrepareLegacyPass();
117117
(void) llvm::createEarlyCSEPass();
118118
(void) llvm::createGVNPass();
119119
(void) llvm::createPostDomTree();

llvm/lib/CodeGen/BasicBlockPathCloning.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class BasicBlockPathCloning : public MachineFunctionPass {
196196
public:
197197
static char ID;
198198

199-
BasicBlockSectionsProfileReader *BBSectionsProfileReader = nullptr;
199+
BasicBlockSectionsProfileReaderWrapperPass *BBSectionsProfileReader = nullptr;
200200

201201
BasicBlockPathCloning() : MachineFunctionPass(ID) {
202202
initializeBasicBlockPathCloningPass(*PassRegistry::getPassRegistry());
@@ -218,7 +218,7 @@ INITIALIZE_PASS_BEGIN(
218218
BasicBlockPathCloning, "bb-path-cloning",
219219
"Applies path clonings for the -basic-block-sections=list option", false,
220220
false)
221-
INITIALIZE_PASS_DEPENDENCY(BasicBlockSectionsProfileReader)
221+
INITIALIZE_PASS_DEPENDENCY(BasicBlockSectionsProfileReaderWrapperPass)
222222
INITIALIZE_PASS_END(
223223
BasicBlockPathCloning, "bb-path-cloning",
224224
"Applies path clonings for the -basic-block-sections=list option", false,
@@ -230,13 +230,14 @@ bool BasicBlockPathCloning::runOnMachineFunction(MachineFunction &MF) {
230230
if (hasInstrProfHashMismatch(MF))
231231
return false;
232232

233-
return ApplyCloning(MF, getAnalysis<BasicBlockSectionsProfileReader>()
234-
.getClonePathsForFunction(MF.getName()));
233+
return ApplyCloning(MF,
234+
getAnalysis<BasicBlockSectionsProfileReaderWrapperPass>()
235+
.getClonePathsForFunction(MF.getName()));
235236
}
236237

237238
void BasicBlockPathCloning::getAnalysisUsage(AnalysisUsage &AU) const {
238239
AU.setPreservesAll();
239-
AU.addRequired<BasicBlockSectionsProfileReader>();
240+
AU.addRequired<BasicBlockSectionsProfileReaderWrapperPass>();
240241
MachineFunctionPass::getAnalysisUsage(AU);
241242
}
242243

llvm/lib/CodeGen/BasicBlockSections.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class BasicBlockSections : public MachineFunctionPass {
103103
public:
104104
static char ID;
105105

106-
BasicBlockSectionsProfileReader *BBSectionsProfileReader = nullptr;
106+
BasicBlockSectionsProfileReaderWrapperPass *BBSectionsProfileReader = nullptr;
107107

108108
BasicBlockSections() : MachineFunctionPass(ID) {
109109
initializeBasicBlockSectionsPass(*PassRegistry::getPassRegistry());
@@ -128,7 +128,7 @@ INITIALIZE_PASS_BEGIN(
128128
"Prepares for basic block sections, by splitting functions "
129129
"into clusters of basic blocks.",
130130
false, false)
131-
INITIALIZE_PASS_DEPENDENCY(BasicBlockSectionsProfileReader)
131+
INITIALIZE_PASS_DEPENDENCY(BasicBlockSectionsProfileReaderWrapperPass)
132132
INITIALIZE_PASS_END(BasicBlockSections, "bbsections-prepare",
133133
"Prepares for basic block sections, by splitting functions "
134134
"into clusters of basic blocks.",
@@ -306,7 +306,7 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
306306
DenseMap<UniqueBBID, BBClusterInfo> FuncClusterInfo;
307307
if (BBSectionsType == BasicBlockSection::List) {
308308
auto [HasProfile, ClusterInfo] =
309-
getAnalysis<BasicBlockSectionsProfileReader>()
309+
getAnalysis<BasicBlockSectionsProfileReaderWrapperPass>()
310310
.getClusterInfoForFunction(MF.getName());
311311
if (!HasProfile)
312312
return false;
@@ -362,7 +362,7 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
362362

363363
void BasicBlockSections::getAnalysisUsage(AnalysisUsage &AU) const {
364364
AU.setPreservesAll();
365-
AU.addRequired<BasicBlockSectionsProfileReader>();
365+
AU.addRequired<BasicBlockSectionsProfileReaderWrapperPass>();
366366
MachineFunctionPass::getAnalysisUsage(AU);
367367
}
368368

llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@
3030

3131
using namespace llvm;
3232

33-
char BasicBlockSectionsProfileReader::ID = 0;
34-
INITIALIZE_PASS(BasicBlockSectionsProfileReader, "bbsections-profile-reader",
33+
char BasicBlockSectionsProfileReaderWrapperPass::ID = 0;
34+
INITIALIZE_PASS(BasicBlockSectionsProfileReaderWrapperPass,
35+
"bbsections-profile-reader",
3536
"Reads and parses a basic block sections profile.", false,
3637
false)
3738

@@ -395,11 +396,11 @@ Error BasicBlockSectionsProfileReader::ReadProfile() {
395396
}
396397
}
397398

398-
bool BasicBlockSectionsProfileReader::doInitialization(Module &M) {
399-
if (!MBuf)
399+
bool BasicBlockSectionsProfileReaderWrapperPass::doInitialization(Module &M) {
400+
if (!BBSPR.MBuf)
400401
return false;
401402
// Get the function name to debug info filename mapping.
402-
FunctionNameToDIFilename.clear();
403+
BBSPR.FunctionNameToDIFilename.clear();
403404
for (const Function &F : M) {
404405
SmallString<128> DIFilename;
405406
if (F.isDeclaration())
@@ -411,15 +412,46 @@ bool BasicBlockSectionsProfileReader::doInitialization(Module &M) {
411412
DIFilename = sys::path::remove_leading_dotslash(CU->getFilename());
412413
}
413414
[[maybe_unused]] bool inserted =
414-
FunctionNameToDIFilename.try_emplace(F.getName(), DIFilename).second;
415+
BBSPR.FunctionNameToDIFilename.try_emplace(F.getName(), DIFilename)
416+
.second;
415417
assert(inserted);
416418
}
417-
if (auto Err = ReadProfile())
419+
if (auto Err = BBSPR.ReadProfile())
418420
report_fatal_error(std::move(Err));
419421
return false;
420422
}
421423

422-
ImmutablePass *
423-
llvm::createBasicBlockSectionsProfileReaderPass(const MemoryBuffer *Buf) {
424-
return new BasicBlockSectionsProfileReader(Buf);
424+
AnalysisKey BasicBlockSectionsProfileReaderAnalysis::Key;
425+
426+
BasicBlockSectionsProfileReader
427+
BasicBlockSectionsProfileReaderAnalysis::run(Function &F,
428+
FunctionAnalysisManager &AM) {
429+
return BasicBlockSectionsProfileReader(TM->getBBSectionsFuncListBuf());
430+
}
431+
432+
bool BasicBlockSectionsProfileReaderWrapperPass::isFunctionHot(
433+
StringRef FuncName) const {
434+
return BBSPR.isFunctionHot(FuncName);
435+
}
436+
437+
std::pair<bool, SmallVector<BBClusterInfo>>
438+
BasicBlockSectionsProfileReaderWrapperPass::getClusterInfoForFunction(
439+
StringRef FuncName) const {
440+
return BBSPR.getClusterInfoForFunction(FuncName);
441+
}
442+
443+
SmallVector<SmallVector<unsigned>>
444+
BasicBlockSectionsProfileReaderWrapperPass::getClonePathsForFunction(
445+
StringRef FuncName) const {
446+
return BBSPR.getClonePathsForFunction(FuncName);
447+
}
448+
449+
BasicBlockSectionsProfileReader &
450+
BasicBlockSectionsProfileReaderWrapperPass::getBBSPR() {
451+
return BBSPR;
452+
}
453+
454+
ImmutablePass *llvm::createBasicBlockSectionsProfileReaderWrapperPass(
455+
const MemoryBuffer *Buf) {
456+
return new BasicBlockSectionsProfileReaderWrapperPass(Buf);
425457
}

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
3030
initializeCFIFixupPass(Registry);
3131
initializeCFIInstrInserterPass(Registry);
3232
initializeCheckDebugMachineModulePass(Registry);
33-
initializeCodeGenPreparePass(Registry);
33+
initializeCodeGenPrepareLegacyPassPass(Registry);
3434
initializeDeadMachineInstructionElimPass(Registry);
3535
initializeDebugifyMachineModulePass(Registry);
3636
initializeDetectDeadLanesPass(Registry);

0 commit comments

Comments
 (0)