Skip to content

Commit 4de3ee7

Browse files
gbaraldivchuravy
authored andcommitted
Implement callback invoking on the NewPM API
1 parent f929743 commit 4de3ee7

File tree

4 files changed

+117
-1
lines changed

4 files changed

+117
-1
lines changed

deps/LLVMExtra/lib/NewPM.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,54 @@ void LLVMPassBuilderExtensionsSetAAPipeline(LLVMPassBuilderExtensionsRef Extensi
143143
}
144144
#endif
145145

146+
// Register target specific parsing callbacks
147+
static void registerCallbackParsing(PassBuilder &PB) {
148+
PB.registerPipelineParsingCallback(
149+
[&](StringRef Name, FunctionPassManager &PM,
150+
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
151+
#define FUNCTION_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
152+
#include "callbacks.inc"
153+
#undef FUNCTION_CALLBACK
154+
return false;
155+
}
156+
);
157+
158+
PB.registerPipelineParsingCallback(
159+
[&](StringRef Name, ModulePassManager &PM,
160+
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
161+
#define MODULE_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
162+
#include "callbacks.inc"
163+
#undef MODULE_CALLBACK
164+
#if LLVM_VERSION_MAJOR >= 20
165+
#define MODULE_LTO_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2, ThinOrFullLTOPhase::None); return true; }
166+
#else
167+
#define MODULE_LTO_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
168+
#endif
169+
#include "callbacks.inc"
170+
#undef MODULE_LTO_CALLBACK
171+
return false;
172+
}
173+
);
174+
175+
PB.registerPipelineParsingCallback(
176+
[&](StringRef Name, CGSCCPassManager &CGPM,
177+
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
178+
#define CGSCC_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(CGPM, OptimizationLevel::O2); return true; }
179+
#include "callbacks.inc"
180+
#undef CGSCC_CALLBACK
181+
return false;
182+
}
183+
);
184+
PB.registerPipelineParsingCallback(
185+
[&](StringRef Name, LoopPassManager &PM,
186+
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
187+
#define LOOP_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
188+
#include "callbacks.inc"
189+
#undef LOOP_CALLBACK
190+
return false;
191+
}
192+
);
193+
}
146194

147195
// Vendored API entrypoint
148196

@@ -164,7 +212,7 @@ static LLVMErrorRef runJuliaPasses(Module *Mod, Function *Fun, const char *Passe
164212
PB.registerPipelineParsingCallback(Callback);
165213
for (auto &Callback : PassExts->FunctionPipelineParsingCallbacks)
166214
PB.registerPipelineParsingCallback(Callback);
167-
215+
registerCallbackParsing(PB); // Parsing for target-specific callbacks
168216
LoopAnalysisManager LAM;
169217
FunctionAnalysisManager FAM;
170218
CGSCCAnalysisManager CGAM;

deps/LLVMExtra/lib/callbacks.inc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifdef FUNCTION_CALLBACK
2+
FUNCTION_CALLBACK("PeepholeCallbacks", invokePeepholeEPCallbacks)
3+
FUNCTION_CALLBACK("ScalarOptimizerLateCallbacks", invokeScalarOptimizerLateEPCallbacks)
4+
FUNCTION_CALLBACK("VectorizerStartCallbacks", invokeVectorizerStartEPCallbacks)
5+
#endif
6+
7+
#ifdef LOOP_CALLBACK
8+
LOOP_CALLBACK("LateLoopOptimizationsCallbacks", invokeLateLoopOptimizationsEPCallbacks)
9+
LOOP_CALLBACK("LoopOptimizerEndCallbacks", invokeLoopOptimizerEndEPCallbacks)
10+
#endif
11+
12+
#ifdef MODULE_CALLBACK
13+
MODULE_CALLBACK("PipelineStartCallbacks", invokePipelineStartEPCallbacks)
14+
#endif
15+
16+
// There are some full lto specific ones that are ignored here
17+
#ifdef MODULE_LTO_CALLBACK
18+
MODULE_LTO_CALLBACK("PipelineEarlySimplificationCallbacks", invokePipelineEarlySimplificationEPCallbacks)
19+
MODULE_LTO_CALLBACK("OptimizerEarlyCallbacks", invokeOptimizerEarlyEPCallbacks)
20+
MODULE_LTO_CALLBACK("OptimizerLastCallbacks", invokeOptimizerLastEPCallbacks)
21+
#endif
22+
23+
#ifdef CGSCC_CALLBACK
24+
CGSCC_CALLBACK("CGSCCOptimizerLateCallbacks", invokeCGSCCOptimizerLateEPCallbacks)
25+
#endif

src/newpm.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,11 @@ function InternalizePass(; preserved_gvs::Vector=String[], kwargs...)
514514

515515
"internalize" * kwargs_to_params(kwargs)
516516
end
517+
# Module callbacks
518+
@module_pass "PipelineStartCallbacks" PipelineStartCallbacks
519+
@module_pass "PipelineEarlySimplificationCallbacks" PipelineEarlySimplificationCallbacks
520+
@module_pass "OptimizerEarlyCallbacks" OptimizerEarlyCallbacks
521+
@module_pass "OptimizerLastCallbacks" OptimizerLastCallbacks
517522

518523
# CGSCC passes
519524

@@ -526,6 +531,9 @@ end
526531
@cgscc_pass "inline" InlinerPass
527532
@cgscc_pass "coro-split" CoroSplitPass
528533

534+
#CGSCC callbacks
535+
@cgscc_pass "CGSCCOptimizerLateCallbacks" CGSCCOptimizerLateCallbacks
536+
529537
# function passes
530538

531539
@function_pass "aa-eval" AAEvaluator
@@ -709,6 +717,10 @@ end
709717
@function_pass "gvn" GVNPass
710718
@function_pass "print<stack-lifetime>" StackLifetimePrinterPass
711719

720+
# Function pass callbacks
721+
@function_pass "PeepholeCallbacks" PeepholeCallbacks
722+
@function_pass "ScalarOptimizerLateCallbacks" ScalarOptimizerLateCallbacks
723+
@function_pass "VectorizerStartCallbacks" VectorizerStartCallbacks
712724
# loop nest passes
713725

714726
@loop_pass "loop-flatten" LoopFlattenPass
@@ -746,6 +758,10 @@ end
746758
@loop_pass "licm" LICMPass
747759
@loop_pass "lnicm" LNICMPass
748760

761+
# Loop Callbacks
762+
@loop_pass "LateLoopOptimizationsCallbacks" LateLoopOptimizationsCallbacks
763+
@loop_pass "LoopOptimizerEndCallbacks" LoopOptimizerEndCallbacks
764+
749765

750766
## alias analyses
751767

test/newpm.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,4 +409,31 @@ end
409409
end
410410
end
411411

412+
@testset "callbacks" begin
413+
# just check that the callbacks can be registered and run without errors
414+
@dispose ctx=Context() begin
415+
# module callbacks
416+
@dispose pb=NewPMPassBuilder() mod=test_module() begin
417+
run!("PipelineStartCallbacks", mod) === nothing
418+
end
419+
@dispose pb=NewPMPassBuilder() mod=test_module() begin
420+
run!(PipelineStartCallbacks(), mod) === nothing
421+
end
422+
# CGSCC callback
423+
@dispose pb=NewPMPassBuilder() mod=test_module() begin
424+
run!("CGSCCOptimizerLateCallbacks", mod) === nothing
425+
end
426+
@dispose pb=NewPMPassBuilder() mod=test_module() begin
427+
run!(CGSCCOptimizerLateCallbacks(), mod) === nothing
428+
end
429+
# function callbacks
430+
@dispose pb=NewPMPassBuilder() mod=test_module() begin
431+
run!("PeepholeCallbacks", mod) === nothing
432+
end
433+
@dispose pb=NewPMPassBuilder() mod=test_module() begin
434+
run!(PeepholeCallbacks(), mod) === nothing
435+
end
436+
end
437+
end
438+
412439
end

0 commit comments

Comments
 (0)