Skip to content

Commit ce5379f

Browse files
committed
[NPM] Add target specific hook to add passes for New Pass Manager
The patch adds a new TargetMachine member "registerPassBuilderCallbacks" for targets to add passes to the pass pipeline using the New Pass Manager (similar to adjustPassManager for the Legacy Pass Manager). Reviewed By: aeubanks Differential Revision: https://reviews.llvm.org/D88138
1 parent dd14e58 commit ce5379f

File tree

6 files changed

+54
-0
lines changed

6 files changed

+54
-0
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,9 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
12141214
PB.registerLoopAnalyses(LAM);
12151215
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
12161216

1217+
if (TM)
1218+
TM->registerPassBuilderCallbacks(PB, CodeGenOpts.DebugPassManager);
1219+
12171220
ModulePassManager MPM(CodeGenOpts.DebugPassManager);
12181221

12191222
if (!CodeGenOpts.DisableLLVMPasses) {

llvm/include/llvm/Target/TargetMachine.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class MCRegisterInfo;
3434
class MCSubtargetInfo;
3535
class MCSymbol;
3636
class raw_pwrite_stream;
37+
class PassBuilder;
3738
class PassManagerBuilder;
3839
struct PerFunctionMIParsingState;
3940
class SMDiagnostic;
@@ -294,6 +295,11 @@ class TargetMachine {
294295
/// PassManagerBuilder::addExtension.
295296
virtual void adjustPassManager(PassManagerBuilder &) {}
296297

298+
/// Allow the target to modify the pass pipeline with New Pass Manager
299+
/// (similar to adjustPassManager for Legacy Pass manager).
300+
virtual void registerPassBuilderCallbacks(PassBuilder &,
301+
bool DebugPassManager) {}
302+
297303
/// Add passes to the specified pass manager to get the specified file
298304
/// emitted. Typically this will involve several steps of code generation.
299305
/// This method should return true if emission of this file type is not

llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "llvm/CodeGen/TargetPassConfig.h"
2323
#include "llvm/IR/LegacyPassManager.h"
2424
#include "llvm/IR/Module.h"
25+
#include "llvm/Passes/PassBuilder.h"
2526
#include "llvm/Support/CommandLine.h"
2627
#include "llvm/Support/TargetRegistry.h"
2728
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
@@ -273,6 +274,18 @@ void HexagonTargetMachine::adjustPassManager(PassManagerBuilder &PMB) {
273274
});
274275
}
275276

277+
void HexagonTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB,
278+
bool DebugPassManager) {
279+
PB.registerOptimizerLastEPCallback(
280+
[=](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
281+
LoopPassManager LPM(DebugPassManager);
282+
FunctionPassManager FPM(DebugPassManager);
283+
LPM.addPass(HexagonVectorLoopCarriedReusePass());
284+
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM)));
285+
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
286+
});
287+
}
288+
276289
TargetTransformInfo
277290
HexagonTargetMachine::getTargetTransformInfo(const Function &F) {
278291
return TargetTransformInfo(HexagonTTIImpl(this, F));

llvm/lib/Target/Hexagon/HexagonTargetMachine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class HexagonTargetMachine : public LLVMTargetMachine {
3737
static unsigned getModuleMatchQuality(const Module &M);
3838

3939
void adjustPassManager(PassManagerBuilder &PMB) override;
40+
void registerPassBuilderCallbacks(PassBuilder &PB,
41+
bool DebugPassManager) override;
4042
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
4143
TargetTransformInfo getTargetTransformInfo(const Function &F) override;
4244

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; RUN: opt -mtriple=hexagon -disable-verify -debug-pass-manager \
2+
; RUN: -disable-output -passes='default<O1>' -S %s 2>&1 \
3+
; RUN: | FileCheck %s --check-prefix=NPM
4+
; RUN: opt -mtriple=hexagon -disable-verify -debug-pass-manager \
5+
; RUN: -disable-output -passes='default<O2>' -S %s 2>&1 \
6+
; RUN: | FileCheck %s --check-prefix=NPM
7+
; RUN: opt -mtriple=hexagon -disable-verify -debug-pass-manager \
8+
; RUN: -disable-output -passes='default<O3>' -S %s 2>&1 \
9+
; RUN: | FileCheck %s --check-prefix=NPM
10+
11+
; Test TargetMachine::registerPassBuilderCallbacks
12+
; NPM: Running pass: HexagonVectorLoopCarriedReusePass
13+
14+
declare void @bar() local_unnamed_addr
15+
16+
define void @foo(i32 %n) local_unnamed_addr {
17+
entry:
18+
br label %loop
19+
loop:
20+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
21+
%iv.next = add i32 %iv, 1
22+
tail call void @bar()
23+
%cmp = icmp eq i32 %iv, %n
24+
br i1 %cmp, label %exit, label %loop
25+
exit:
26+
ret void
27+
}

llvm/tools/opt/NewPMDriver.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,9 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
375375
PB.registerLoopAnalyses(LAM);
376376
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
377377

378+
if (TM)
379+
TM->registerPassBuilderCallbacks(PB, DebugPM);
380+
378381
ModulePassManager MPM(DebugPM);
379382
if (VK > VK_NoVerifier)
380383
MPM.addPass(VerifierPass());

0 commit comments

Comments
 (0)