Skip to content

Commit 51094f8

Browse files
pchintalapudimaleadt
authored andcommitted
Add Julia newpm passes and pipeline.
1 parent b7d00f8 commit 51094f8

File tree

14 files changed

+819
-115
lines changed

14 files changed

+819
-115
lines changed

deps/LLVMExtra/include/NewPM.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,16 @@ typedef struct LLVMOpaqueModuleAnalysisManager *LLVMModuleAnalysisManagerRef;
2626
typedef struct LLVMOpaqueCGSCCAnalysisManager *LLVMCGSCCAnalysisManagerRef;
2727
typedef struct LLVMOpaqueFunctionAnalysisManager *LLVMFunctionAnalysisManagerRef;
2828
typedef struct LLVMOpaqueLoopAnalysisManager *LLVMLoopAnalysisManagerRef;
29-
typedef struct LLVMOpaqueAAManager *LLVMAAManagerRef;
3029

3130
LLVMModuleAnalysisManagerRef LLVMCreateNewPMModuleAnalysisManager(void);
3231
LLVMCGSCCAnalysisManagerRef LLVMCreateNewPMCGSCCAnalysisManager(void);
3332
LLVMFunctionAnalysisManagerRef LLVMCreateNewPMFunctionAnalysisManager(void);
3433
LLVMLoopAnalysisManagerRef LLVMCreateNewPMLoopAnalysisManager(void);
35-
LLVMAAManagerRef LLVMCreateNewPMAAManager(void);
3634

3735
void LLVMDisposeNewPMModuleAnalysisManager(LLVMModuleAnalysisManagerRef AM);
3836
void LLVMDisposeNewPMCGSCCAnalysisManager(LLVMCGSCCAnalysisManagerRef AM);
3937
void LLVMDisposeNewPMFunctionAnalysisManager(LLVMFunctionAnalysisManagerRef AM);
4038
void LLVMDisposeNewPMLoopAnalysisManager(LLVMLoopAnalysisManagerRef AM);
41-
void LLVMDisposeNewPMAAManager(LLVMAAManagerRef AM);
4239

4340
typedef struct LLVMOpaqueModulePassManager *LLVMModulePassManagerRef;
4441
typedef struct LLVMOpaqueCGSCCPassManager *LLVMCGSCCPassManagerRef;
@@ -79,7 +76,6 @@ LLVMErrorRef LLVMPassBuilderParseModulePassPipeline(LLVMPassBuilderRef PB, LLVMM
7976
LLVMErrorRef LLVMPassBuilderParseCGSCCPassPipeline(LLVMPassBuilderRef PB, LLVMCGSCCPassManagerRef PM, const char *PipelineText, size_t PipelineTextLength);
8077
LLVMErrorRef LLVMPassBuilderParseFunctionPassPipeline(LLVMPassBuilderRef PB, LLVMFunctionPassManagerRef PM, const char *PipelineText, size_t PipelineTextLength);
8178
LLVMErrorRef LLVMPassBuilderParseLoopPassPipeline(LLVMPassBuilderRef PB, LLVMLoopPassManagerRef PM, const char *PipelineText, size_t PipelineTextLength);
82-
LLVMErrorRef LLVMPassBuilderParseAAPipeline(LLVMPassBuilderRef PB, LLVMAAManagerRef AM, const char *PipelineText, size_t PipelineTextLength);
8379

8480
void LLVMPassBuilderRegisterModuleAnalyses(LLVMPassBuilderRef PB, LLVMModuleAnalysisManagerRef AM);
8581
void LLVMPassBuilderRegisterCGSCCAnalyses(LLVMPassBuilderRef PB, LLVMCGSCCAnalysisManagerRef AM);
@@ -95,7 +91,7 @@ void LLVMLPMAddLPM(LLVMLoopPassManagerRef PM, LLVMLoopPassManagerRef NestedPM);
9591

9692
void LLVMMPMAddCGPM(LLVMModulePassManagerRef PM, LLVMCGSCCPassManagerRef NestedPM);
9793
void LLVMCGPMAddFPM(LLVMCGSCCPassManagerRef PM, LLVMFunctionPassManagerRef NestedPM);
98-
void LLVMFPMAddLPM(LLVMFunctionPassManagerRef PM, LLVMLoopPassManagerRef NestedPM);
94+
void LLVMFPMAddLPM(LLVMFunctionPassManagerRef PM, LLVMLoopPassManagerRef NestedPM, LLVMBool UseMemorySSA);
9995
void LLVMMPMAddFPM(LLVMModulePassManagerRef PM, LLVMFunctionPassManagerRef NestedPM);
10096

10197
typedef LLVMPreservedAnalysesRef (*LLVMJuliaModulePassCallback)(LLVMModuleRef M, LLVMModuleAnalysisManagerRef AM, void *Thunk);
@@ -104,6 +100,13 @@ typedef LLVMPreservedAnalysesRef (*LLVMJuliaFunctionPassCallback)(LLVMValueRef F
104100
void LLVMMPMAddJuliaPass(LLVMModulePassManagerRef PM, LLVMJuliaModulePassCallback Callback, void *Thunk);
105101
void LLVMFPMAddJuliaPass(LLVMFunctionPassManagerRef PM, LLVMJuliaFunctionPassCallback Callback, void *Thunk);
106102

103+
// Target Analyses
104+
LLVMBool LLVMRegisterTargetIRAnalysis(LLVMFunctionAnalysisManagerRef FAM, LLVMTargetMachineRef TM);
105+
LLVMBool LLVMRegisterTargetLibraryAnalysis(LLVMFunctionAnalysisManagerRef FAM, const char *Triple, size_t TripleLength);
106+
107+
// Analyses
108+
LLVMErrorRef LLVMRegisterAliasAnalyses(LLVMFunctionAnalysisManagerRef FAM, LLVMPassBuilderRef PB, LLVMTargetMachineRef TM, const char *Analyses, size_t AnalysesLength);
109+
107110
LLVM_C_EXTERN_C_END
108111

109112
#endif

deps/LLVMExtra/lib/newpm.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
#if LLVM_VERSION_MAJOR >= 15
44

55
#include <llvm/Analysis/AliasAnalysis.h>
6+
#include <llvm/Analysis/TargetTransformInfo.h>
67
#include <llvm/Passes/PassBuilder.h>
78
#include <llvm/Passes/StandardInstrumentations.h>
89
#include <llvm/IR/Module.h>
910
#include <llvm/IR/Function.h>
11+
#include <llvm/Target/TargetMachine.h>
1012

11-
#include "llvm/Support/CBindingWrapping.h"
13+
#include <llvm/Support/CBindingWrapping.h>
1214

1315
using llvm::wrap;
1416
using llvm::unwrap;
@@ -43,7 +45,6 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::ModuleAnalysisManager, LLVMModuleAnalys
4345
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::CGSCCAnalysisManager, LLVMCGSCCAnalysisManagerRef)
4446
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::FunctionAnalysisManager, LLVMFunctionAnalysisManagerRef)
4547
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::LoopAnalysisManager, LLVMLoopAnalysisManagerRef)
46-
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::AAManager, LLVMAAManagerRef)
4748

4849
LLVMModuleAnalysisManagerRef LLVMCreateNewPMModuleAnalysisManager(void) {
4950
return wrap(new llvm::ModuleAnalysisManager());
@@ -57,9 +58,6 @@ LLVMFunctionAnalysisManagerRef LLVMCreateNewPMFunctionAnalysisManager(void) {
5758
LLVMLoopAnalysisManagerRef LLVMCreateNewPMLoopAnalysisManager(void) {
5859
return wrap(new llvm::LoopAnalysisManager());
5960
}
60-
LLVMAAManagerRef LLVMCreateNewPMAAManager(void) {
61-
return wrap(new llvm::AAManager());
62-
}
6361

6462
void LLVMDisposeNewPMModuleAnalysisManager(LLVMModuleAnalysisManagerRef AM) {
6563
delete unwrap(AM);
@@ -73,9 +71,6 @@ void LLVMDisposeNewPMFunctionAnalysisManager(LLVMFunctionAnalysisManagerRef AM)
7371
void LLVMDisposeNewPMLoopAnalysisManager(LLVMLoopAnalysisManagerRef AM) {
7472
delete unwrap(AM);
7573
}
76-
void LLVMDisposeNewPMAAManager(LLVMAAManagerRef AM) {
77-
delete unwrap(AM);
78-
}
7974

8075
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::ModulePassManager, LLVMModulePassManagerRef)
8176
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::CGSCCPassManager, LLVMCGSCCPassManagerRef)
@@ -158,9 +153,6 @@ LLVMErrorRef LLVMPassBuilderParseFunctionPassPipeline(LLVMPassBuilderRef PB, LLV
158153
LLVMErrorRef LLVMPassBuilderParseLoopPassPipeline(LLVMPassBuilderRef PB, LLVMLoopPassManagerRef PM, const char *PipelineText, size_t PipelineTextLength) {
159154
return wrap(unwrap(PB)->parsePassPipeline(*unwrap(PM), llvm::StringRef(PipelineText, PipelineTextLength)));
160155
}
161-
LLVMErrorRef LLVMPassBuilderParseAAPipeline(LLVMPassBuilderRef PB, LLVMAAManagerRef AM, const char *PipelineText, size_t PipelineTextLength) {
162-
return wrap(unwrap(PB)->parseAAPipeline(*unwrap(AM), llvm::StringRef(PipelineText, PipelineTextLength)));
163-
}
164156

165157
void LLVMPassBuilderRegisterModuleAnalyses(LLVMPassBuilderRef PB, LLVMModuleAnalysisManagerRef AM) {
166158
unwrap(PB)->registerModuleAnalyses(*unwrap(AM));
@@ -198,8 +190,8 @@ void LLVMMPMAddCGPM(LLVMModulePassManagerRef PM, LLVMCGSCCPassManagerRef NestedP
198190
void LLVMCGPMAddFPM(LLVMCGSCCPassManagerRef PM, LLVMFunctionPassManagerRef NestedPM) {
199191
unwrap(PM)->addPass(llvm::createCGSCCToFunctionPassAdaptor(std::move(*unwrap(NestedPM))));
200192
}
201-
void LLVMFPMAddLPM(LLVMFunctionPassManagerRef PM, LLVMLoopPassManagerRef NestedPM) {
202-
unwrap(PM)->addPass(llvm::createFunctionToLoopPassAdaptor(std::move(*unwrap(NestedPM))));
193+
void LLVMFPMAddLPM(LLVMFunctionPassManagerRef PM, LLVMLoopPassManagerRef NestedPM, LLVMBool UseMemorySSA) {
194+
unwrap(PM)->addPass(llvm::createFunctionToLoopPassAdaptor(std::move(*unwrap(NestedPM)), UseMemorySSA));
203195
}
204196
void LLVMMPMAddFPM(LLVMModulePassManagerRef PM, LLVMFunctionPassManagerRef NestedPM) {
205197
unwrap(PM)->addPass(llvm::createModuleToFunctionPassAdaptor(std::move(*unwrap(NestedPM))));
@@ -239,4 +231,25 @@ void LLVMFPMAddJuliaPass(LLVMFunctionPassManagerRef PM, LLVMJuliaFunctionPassCal
239231
unwrap(PM)->addPass(JuliaCustomFunctionPass(Callback, Thunk));
240232
}
241233

234+
// Target Analyses
235+
236+
LLVMBool LLVMRegisterTargetIRAnalysis(LLVMFunctionAnalysisManagerRef FAM, LLVMTargetMachineRef TM) {
237+
return unwrap(FAM)->registerPass([&] { return llvm::TargetIRAnalysis(unwrap(TM)->getTargetIRAnalysis()); });
238+
}
239+
LLVMBool LLVMRegisterTargetLibraryAnalysis(LLVMFunctionAnalysisManagerRef FAM, const char *Triple, size_t TripleLength) {
240+
return unwrap(FAM)->registerPass([&] { return llvm::TargetLibraryAnalysis(llvm::TargetLibraryInfoImpl(llvm::Triple(llvm::StringRef(Triple, TripleLength)))); });
241+
}
242+
243+
// Alias Analyses
244+
LLVMErrorRef LLVMRegisterAliasAnalyses(LLVMFunctionAnalysisManagerRef FAM, LLVMPassBuilderRef PB, LLVMTargetMachineRef TM, const char *Analyses, size_t AnalysesLength) {
245+
llvm::AAManager AA;
246+
auto err = unwrap(PB)->parseAAPipeline(AA, llvm::StringRef(Analyses, AnalysesLength));
247+
if (err)
248+
return wrap(std::move(err));
249+
if (TM)
250+
unwrap(TM)->registerDefaultAliasAnalyses(AA);
251+
unwrap(FAM)->registerPass([&] { return std::move(AA); });
252+
return LLVMErrorSuccess;
253+
}
254+
242255
#endif

lib/libLLVM_extra.jl

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -510,10 +510,6 @@ mutable struct LLVMOpaqueLoopAnalysisManager end
510510

511511
const LLVMLoopAnalysisManagerRef = Ptr{LLVMOpaqueLoopAnalysisManager}
512512

513-
mutable struct LLVMOpaqueAAManager end
514-
515-
const LLVMAAManagerRef = Ptr{LLVMOpaqueAAManager}
516-
517513
function LLVMCreateNewPMModuleAnalysisManager()
518514
ccall((:LLVMCreateNewPMModuleAnalysisManager, libLLVMExtra), LLVMModuleAnalysisManagerRef, ())
519515
end
@@ -530,10 +526,6 @@ function LLVMCreateNewPMLoopAnalysisManager()
530526
ccall((:LLVMCreateNewPMLoopAnalysisManager, libLLVMExtra), LLVMLoopAnalysisManagerRef, ())
531527
end
532528

533-
function LLVMCreateNewPMAAManager()
534-
ccall((:LLVMCreateNewPMAAManager, libLLVMExtra), LLVMAAManagerRef, ())
535-
end
536-
537529
function LLVMDisposeNewPMModuleAnalysisManager(AM)
538530
ccall((:LLVMDisposeNewPMModuleAnalysisManager, libLLVMExtra), Cvoid, (LLVMModuleAnalysisManagerRef,), AM)
539531
end
@@ -550,10 +542,6 @@ function LLVMDisposeNewPMLoopAnalysisManager(AM)
550542
ccall((:LLVMDisposeNewPMLoopAnalysisManager, libLLVMExtra), Cvoid, (LLVMLoopAnalysisManagerRef,), AM)
551543
end
552544

553-
function LLVMDisposeNewPMAAManager(AM)
554-
ccall((:LLVMDisposeNewPMAAManager, libLLVMExtra), Cvoid, (LLVMAAManagerRef,), AM)
555-
end
556-
557545
mutable struct LLVMOpaqueModulePassManager end
558546

559547
const LLVMModulePassManagerRef = Ptr{LLVMOpaqueModulePassManager}
@@ -666,10 +654,6 @@ function LLVMPassBuilderParseLoopPassPipeline(PB, PM, PipelineText, PipelineText
666654
ccall((:LLVMPassBuilderParseLoopPassPipeline, libLLVMExtra), LLVMErrorRef, (LLVMPassBuilderRef, LLVMLoopPassManagerRef, Cstring, Csize_t), PB, PM, PipelineText, PipelineTextLength)
667655
end
668656

669-
function LLVMPassBuilderParseAAPipeline(PB, AM, PipelineText, PipelineTextLength)
670-
ccall((:LLVMPassBuilderParseAAPipeline, libLLVMExtra), LLVMErrorRef, (LLVMPassBuilderRef, LLVMAAManagerRef, Cstring, Csize_t), PB, AM, PipelineText, PipelineTextLength)
671-
end
672-
673657
function LLVMPassBuilderRegisterModuleAnalyses(PB, AM)
674658
ccall((:LLVMPassBuilderRegisterModuleAnalyses, libLLVMExtra), Cvoid, (LLVMPassBuilderRef, LLVMModuleAnalysisManagerRef), PB, AM)
675659
end
@@ -714,8 +698,8 @@ function LLVMCGPMAddFPM(PM, NestedPM)
714698
ccall((:LLVMCGPMAddFPM, libLLVMExtra), Cvoid, (LLVMCGSCCPassManagerRef, LLVMFunctionPassManagerRef), PM, NestedPM)
715699
end
716700

717-
function LLVMFPMAddLPM(PM, NestedPM)
718-
ccall((:LLVMFPMAddLPM, libLLVMExtra), Cvoid, (LLVMFunctionPassManagerRef, LLVMLoopPassManagerRef), PM, NestedPM)
701+
function LLVMFPMAddLPM(PM, NestedPM, UseMemorySSA)
702+
ccall((:LLVMFPMAddLPM, libLLVMExtra), Cvoid, (LLVMFunctionPassManagerRef, LLVMLoopPassManagerRef, LLVMBool), PM, NestedPM, UseMemorySSA)
719703
end
720704

721705
function LLVMMPMAddFPM(PM, NestedPM)
@@ -735,5 +719,16 @@ end
735719
function LLVMFPMAddJuliaPass(PM, Callback, Thunk)
736720
ccall((:LLVMFPMAddJuliaPass, libLLVMExtra), Cvoid, (LLVMFunctionPassManagerRef, LLVMJuliaFunctionPassCallback, Ptr{Cvoid}), PM, Callback, Thunk)
737721
end
738-
end # v"15" <= version()
739722

723+
function LLVMRegisterTargetIRAnalysis(FAM, TM)
724+
ccall((:LLVMRegisterTargetIRAnalysis, libLLVMExtra), LLVMBool, (LLVMFunctionAnalysisManagerRef, LLVMTargetMachineRef), FAM, TM)
725+
end
726+
727+
function LLVMRegisterTargetLibraryAnalysis(FAM, Triple, TripleLength)
728+
ccall((:LLVMRegisterTargetLibraryAnalysis, libLLVMExtra), LLVMBool, (LLVMFunctionAnalysisManagerRef, Cstring, Csize_t), FAM, Triple, TripleLength)
729+
end
730+
731+
function LLVMRegisterAliasAnalyses(FAM, PB, TM, Analyses, AnalysesLength)
732+
ccall((:LLVMRegisterAliasAnalyses, libLLVMExtra), LLVMErrorRef, (LLVMFunctionAnalysisManagerRef, LLVMPassBuilderRef, LLVMTargetMachineRef, Cstring, Csize_t), FAM, PB, TM, Analyses, AnalysesLength)
733+
end
734+
end # v"15" <= version()

lib/libLLVM_julia.jl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ function LLVMAddCPUFeaturesPass(PM)
6060
ccall(:LLVMExtraAddCPUFeaturesPass,Cvoid,(LLVMPassManagerRef,), PM)
6161
end
6262

63+
if VERSION >= v"1.10.0-DEV.1622"
64+
65+
function LLVMRegisterJuliaPassBuilderCallbacks(PB)
66+
ccall(:jl_register_passbuilder_callbacks,Cvoid,(LLVMPassBuilderRef,), PB)
67+
end
68+
69+
function LLVMAddJuliaPipelinePass(PM, PB, Speedup, Size, lower_intrinsics, dump_native, external_use, llvm_only)
70+
ccall(:jl_build_newpm_pipeline,Cvoid,(LLVMModulePassManagerRef,LLVMPassBuilderRef,Cint,Cint,Cint,Cint,Cint,Cint), PM, PB, Speedup, Size, lower_intrinsics, dump_native, external_use, llvm_only)
71+
end
72+
73+
end
74+
75+
6376
if VERSION >= v"1.10.0-DEV.1395"
6477

6578
mutable struct JLOpaqueJuliaOJIT end
@@ -110,4 +123,4 @@ function JLJITGetIRCompileLayer(JIT)
110123
ccall(:JLJITGetIRCompileLayer, LLVMOrcIRCompileLayerRef, (JuliaOJITRef,), JIT)
111124
end
112125

113-
end # VERSION >= v"1.10.0-DEV.1395"
126+
end

src/interop.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ include("interop/pointer.jl")
1010
include("interop/utils.jl")
1111
include("interop/intrinsics.jl")
1212

13+
if LLVM.has_newpm() && VERSION >= v"1.10.0-DEV.1622"
14+
include("interop/newpm.jl")
15+
end
16+
1317
end

src/interop/newpm.jl

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import ..LLVM: @module_pass, @function_pass, @loop_pass
2+
import ..LLVM: is_module_pass, is_cgscc_pass, is_function_pass, is_loop_pass
3+
import ..LLVM: pass_string, options_string, add!
4+
5+
@module_pass "CPUFeatures" CPUFeaturesPass
6+
@module_pass "RemoveNI" RemoveNIPass
7+
@module_pass "LowerSIMDLoop" LowerSIMDLoopPass
8+
@module_pass "FinalLowerGC" FinalLowerGCPass
9+
@module_pass "RemoveJuliaAddrspaces" RemoveJuliaAddrspacesPass
10+
@module_pass "RemoveAddrspaces" RemoveAddrspacesPass
11+
12+
struct MultiVersioningPassOptions
13+
external::Core.Bool
14+
end
15+
MultiVersioningPassOptions(; external::Core.Bool=false) = MultiVersioningPassOptions(external)
16+
options_string(options::MultiVersioningPassOptions) = ifelse(options.external, "<external>", "")
17+
@module_pass "JuliaMultiVersioning" MultiVersioningPass MultiVersioningPassOptions
18+
19+
struct LowerPTLSPassOptions
20+
imaging::Core.Bool
21+
end
22+
LowerPTLSPassOptions(; imaging::Core.Bool=false) = LowerPTLSPassOptions(imaging)
23+
options_string(options::LowerPTLSPassOptions) = ifelse(options.imaging, "<imaging>", "")
24+
@module_pass "LowerPTLSPass" LowerPTLSPass LowerPTLSPassOptions
25+
26+
@function_pass "DemoteFloat16" DemoteFloat16Pass
27+
@function_pass "CombineMulAdd" CombineMulAddPass
28+
@function_pass "LateLowerGCFrame" LateLowerGCPass
29+
@function_pass "AllocOpt" AllocOptPass
30+
@function_pass "PropagateJuliaAddrspaces" PropagateJuliaAddrspacesPass
31+
@function_pass "LowerExcHandlers" LowerExcHandlersPass
32+
33+
struct GCInvariantVerifierPassOptions
34+
strong::Core.Bool
35+
end
36+
GCInvariantVerifierPassOptions(; strong::Core.Bool=false) = GCInvariantVerifierPassOptions(strong)
37+
options_string(options::GCInvariantVerifierPassOptions) = ifelse(options.strong, "<strong>", "")
38+
@function_pass "GCInvariantVerifier" GCInvariantVerifierPass GCInvariantVerifierPassOptions
39+
40+
@loop_pass "JuliaLICM" JuliaLICMPass
41+
42+
# The entire Julia pipeline
43+
struct JuliaPipelinePassOptions
44+
speedup::Int
45+
lower_intrinsics::Core.Bool
46+
dump_native::Core.Bool
47+
external_use::Core.Bool
48+
llvm_only::Core.Bool
49+
end
50+
JuliaPipelinePassOptions(; speedup=Base.JLOptions().opt_level, lower_intrinsics::Core.Bool=true,
51+
dump_native::Core.Bool=false, external_use::Core.Bool=false,
52+
llvm_only::Core.Bool=false) = JuliaPipelinePassOptions(convert(Int, speedup), lower_intrinsics, dump_native, external_use, llvm_only)
53+
function options_string(options::JuliaPipelinePassOptions)
54+
optlevel = "O$(options.speedup)"
55+
lower_intrinsics = ifelse(options.lower_intrinsics, "lower_intrinsics", "no_lower_intrinsics")
56+
dump_native = ifelse(options.dump_native, "dump_native", "no_dump_native")
57+
external_use = ifelse(options.external_use, "external_use", "no_external_use")
58+
llvm_only = ifelse(options.llvm_only, "llvm_only", "no_llvm_only")
59+
"<$optlevel;$lower_intrinsics;$dump_native;$external_use;$llvm_only>"
60+
end
61+
@module_pass "julia" JuliaPipelinePass JuliaPipelinePassOptions
62+
63+
# We specialize the add! here because if we go through the PassBuilder parser,
64+
# Julia won't insert the PassBuilder's callbacks in the right spots.
65+
# Using the specific method call here allows insertion of those callbacks.
66+
function add!(pm::NewPMModulePassManager, pb::PassBuilder, pass::JuliaPipelinePass)
67+
API.LLVMAddJuliaPipelinePass(pm, pb, pass.options.speedup, 0, pass.options.lower_intrinsics,
68+
pass.options.dump_native, pass.options.external_use,
69+
pass.options.llvm_only)
70+
end

src/newpm.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ include("newpm/analysismanager.jl")
33
include("newpm/passmanager.jl")
44
include("newpm/instrumentation.jl")
55
include("newpm/passbuilder.jl")
6+
include("newpm/analyses.jl")
67
include("newpm/passes.jl")
78
include("newpm/custompass.jl")

src/newpm/analyses.jl

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
export NewPMAnalysis, NewPMAliasAnalysis
2+
3+
export add!, analysis_string, analysis_managers
4+
5+
abstract type NewPMAnalysis end
6+
abstract type NewPMAliasAnalysis end
7+
8+
macro alias_analysis(analysis_name, class_name)
9+
quote
10+
export $class_name
11+
struct $class_name <: NewPMAliasAnalysis end
12+
@eval analysis_string(::$class_name) = $analysis_name
13+
end
14+
end
15+
16+
analysis_string(aa::AAManager) = join(aa.aas, ",")
17+
18+
Base.show(io::IO, analysis::NewPMAnalysis) = print(io, analysis_string(analysis))
19+
Base.show(io::IO, aa::AAManager) = print(io, analysis_string(aa))
20+
21+
# Module Alias Analysis
22+
@alias_analysis "globals-aa" GlobalsAA
23+
24+
# Function Alias Analysis
25+
@alias_analysis "basic-aa" BasicAA
26+
@alias_analysis "cfl-anders-aa" CFLAndersAA
27+
@alias_analysis "cfl-steens-aa" CFLSteensAA
28+
@alias_analysis "objc-arc-aa" ObjCARCAA
29+
@alias_analysis "scev-aa" SCEVAA
30+
@alias_analysis "scoped-noalias-aa" ScopedNoAliasAA
31+
@alias_analysis "tbaa" TypeBasedAA
32+
33+
add!(am::AAManager, aa::NewPMAliasAnalysis) = push!(am.aas, analysis_string(aa))
34+
add!(am::AAManager, aas::AbstractVector{<:NewPMAliasAnalysis}) = append!(am.aas, analysis_string.(aas))
35+
add!(am::AAManager, tm::TargetMachine) = am.tm = tm
36+
37+
export TargetIRAnalysis, TargetLibraryAnalysis
38+
39+
struct TargetIRAnalysis
40+
tm::TargetMachine
41+
end
42+
analysis_string(::TargetIRAnalysis) = "target-ir-analysis"
43+
44+
struct TargetLibraryAnalysis
45+
triple::String
46+
end
47+
analysis_string(::TargetLibraryAnalysis) = "target-library-analysis"
48+
49+
add!(fam::FunctionAnalysisManager, analysis::TargetIRAnalysis) = convert(Core.Bool, API.LLVMRegisterTargetIRAnalysis(fam, analysis.tm))
50+
add!(fam::FunctionAnalysisManager, analysis::TargetLibraryAnalysis) = convert(Core.Bool, API.LLVMRegisterTargetLibraryAnalysis(fam, analysis.triple, length(analysis.triple)))
51+
52+
function analysis_managers(f::Core.Function, pb::Union{Nothing,PassBuilder}=nothing, tm::Union{Nothing,TargetMachine}=nothing, aa_stack::AbstractVector{<:NewPMAliasAnalysis}=NewPMAliasAnalysis[])
53+
@dispose lam=LoopAnalysisManager() fam=FunctionAnalysisManager() cam=CGSCCAnalysisManager() mam=ModuleAnalysisManager() begin
54+
if !isempty(aa_stack)
55+
add!(fam, AAManager) do aam
56+
add!(aam, aa_stack)
57+
if !isnothing(tm)
58+
add!(aam, tm)
59+
end
60+
end
61+
end
62+
if !isnothing(tm)
63+
add!(fam, TargetIRAnalysis(tm))
64+
add!(fam, TargetLibraryAnalysis(triple(tm)))
65+
end
66+
if !isnothing(pb)
67+
register!(pb, lam, fam, cam, mam)
68+
end
69+
f(lam, fam, cam, mam)
70+
end
71+
end

0 commit comments

Comments
 (0)