Skip to content

Commit 4f63a1f

Browse files
authored
Default to using NewPM. (#604)
1 parent a0e73b7 commit 4f63a1f

File tree

8 files changed

+99
-268
lines changed

8 files changed

+99
-268
lines changed

src/GPUCompiler.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ using Preferences
1616
const CC = Core.Compiler
1717
using Core: MethodInstance, CodeInstance, CodeInfo
1818

19-
const use_newpm = LLVM.has_newpm()
20-
2119
include("utils.jl")
2220
include("mangling.jl")
2321

src/driver.jl

Lines changed: 18 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,8 @@ const __llvm_initialized = Ref(false)
291291
push!(preserved_gvs, LLVM.name(gvar))
292292
end
293293
end
294-
if use_newpm && LLVM.version() >= v"17"
295-
run!(InternalizePass(InternalizePassOptions(; preserved_gvs)), ir,
294+
if LLVM.version() >= v"17"
295+
run!(InternalizePass(; preserved_gvs), ir,
296296
llvm_machine(job.config.target))
297297
else
298298
@dispose pm=ModulePassManager() begin
@@ -318,35 +318,17 @@ const __llvm_initialized = Ref(false)
318318
# which also need to happen _after_ regular optimization.
319319
# XXX: make these part of the optimizer pipeline?
320320
if has_deferred_jobs
321-
if use_newpm
322-
@dispose pb=NewPMPassBuilder() begin
323-
add!(pb, NewPMFunctionPassManager()) do fpm
324-
add!(fpm, InstCombinePass())
325-
end
326-
add!(pb, AlwaysInlinerPass())
327-
add!(pb, NewPMFunctionPassManager()) do fpm
328-
add!(fpm, SROAPass())
329-
add!(fpm, GVNPass())
330-
end
331-
add!(pb, MergeFunctionsPass())
332-
run!(pb, ir, llvm_machine(job.config.target))
321+
@dispose pb=NewPMPassBuilder() begin
322+
add!(pb, NewPMFunctionPassManager()) do fpm
323+
add!(fpm, InstCombinePass())
333324
end
334-
else
335-
@dispose pm=ModulePassManager() begin
336-
# inline and optimize the call to e deferred code. in particular we want
337-
# to remove unnecessary alloca's created by pass-by-ref semantics.
338-
instruction_combining!(pm)
339-
always_inliner!(pm)
340-
scalar_repl_aggregates_ssa!(pm)
341-
promote_memory_to_register!(pm)
342-
gvn!(pm)
343-
344-
# merge duplicate functions, since each compilation invocation emits everything
345-
# XXX: ideally we want to avoid emitting these in the first place
346-
merge_functions!(pm)
347-
348-
run!(pm, ir)
325+
add!(pb, AlwaysInlinerPass())
326+
add!(pb, NewPMFunctionPassManager()) do fpm
327+
add!(fpm, SROAPass())
328+
add!(fpm, GVNPass())
349329
end
330+
add!(pb, MergeFunctionsPass())
331+
run!(pb, ir, llvm_machine(job.config.target))
350332
end
351333
end
352334
end
@@ -357,29 +339,13 @@ const __llvm_initialized = Ref(false)
357339

358340
if cleanup
359341
@timeit_debug to "clean-up" begin
360-
if use_newpm
361-
@dispose pb=NewPMPassBuilder() begin
362-
add!(pb, RecomputeGlobalsAAPass())
363-
add!(pb, GlobalOptPass())
364-
add!(pb, GlobalDCEPass())
365-
add!(pb, StripDeadPrototypesPass())
366-
add!(pb, ConstantMergePass())
367-
run!(pb, ir, llvm_machine(job.config.target))
368-
end
369-
else
370-
# we can only clean-up now, as optimization may lower or introduce calls to
371-
# functions from the GPU runtime (e.g. julia.gc_alloc_obj -> gpu_gc_pool_alloc)
372-
@dispose pm=ModulePassManager() begin
373-
# eliminate all unused internal functions
374-
global_optimizer!(pm)
375-
global_dce!(pm)
376-
strip_dead_prototypes!(pm)
377-
378-
# merge constants (such as exception messages)
379-
constant_merge!(pm)
380-
381-
run!(pm, ir)
382-
end
342+
@dispose pb=NewPMPassBuilder() begin
343+
add!(pb, RecomputeGlobalsAAPass())
344+
add!(pb, GlobalOptPass())
345+
add!(pb, GlobalDCEPass())
346+
add!(pb, StripDeadPrototypesPass())
347+
add!(pb, ConstantMergePass())
348+
run!(pb, ir, llvm_machine(job.config.target))
383349
end
384350
end
385351
end

src/irgen.jl

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ function irgen(@nospecialize(job::CompilerJob))
101101
for gvar in globals(mod)
102102
push!(preserved_gvs, LLVM.name(gvar))
103103
end
104-
if use_newpm && LLVM.version() >= v"17"
104+
if LLVM.version() >= v"17"
105105
@dispose pb=NewPMPassBuilder() begin
106-
add!(pb, InternalizePass(InternalizePassOptions(; preserved_gvs)))
106+
add!(pb, InternalizePass(; preserved_gvs))
107107
add!(pb, AlwaysInlinerPass())
108108
run!(pb, mod, llvm_machine(job.config.target))
109109
end
@@ -718,11 +718,7 @@ function add_kernel_state!(mod::LLVM.Module)
718718

719719
return true
720720
end
721-
add_kernel_state!(pm::PassManager) =
722-
add!(pm, ModulePass("AddKernelStatePass", add_kernel_state!))
723-
if LLVM.has_newpm()
724-
AddKernelStatePass() = NewPMModulePass("AddKernelStatePass", add_kernel_state!)
725-
end
721+
AddKernelStatePass() = NewPMModulePass("AddKernelStatePass", add_kernel_state!)
726722

727723
# lower calls to the state getter intrinsic. this is a two-step process, so that the state
728724
# argument can be added before optimization, and that optimization can introduce new uses
@@ -774,11 +770,7 @@ function lower_kernel_state!(fun::LLVM.Function)
774770

775771
return changed
776772
end
777-
lower_kernel_state!(pm::PassManager) =
778-
add!(pm, FunctionPass("LowerKernelStatePass", lower_kernel_state!))
779-
if LLVM.has_newpm()
780-
LowerKernelStatePass() = NewPMFunctionPass("LowerKernelStatePass", lower_kernel_state!)
781-
end
773+
LowerKernelStatePass() = NewPMFunctionPass("LowerKernelStatePass", lower_kernel_state!)
782774

783775
function cleanup_kernel_state!(mod::LLVM.Module)
784776
job = current_job::CompilerJob
@@ -796,11 +788,7 @@ function cleanup_kernel_state!(mod::LLVM.Module)
796788

797789
return changed
798790
end
799-
cleanup_kernel_state!(pm::PassManager) =
800-
add!(pm, ModulePass("CleanupKernelStatePass", cleanup_kernel_state!))
801-
if LLVM.has_newpm()
802-
CleanupKernelStatePass() = NewPMModulePass("CleanupKernelStatePass", cleanup_kernel_state!)
803-
end
791+
CleanupKernelStatePass() = NewPMModulePass("CleanupKernelStatePass", cleanup_kernel_state!)
804792

805793
function kernel_state_intr(mod::LLVM.Module, T_state)
806794
state_intr = if haskey(functions(mod), "julia.gpu.state_getter")

src/mcgen.jl

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,16 @@ function prepare_execution!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
66
global current_job
77
current_job = job
88

9-
if use_newpm
10-
@dispose pb=NewPMPassBuilder() begin
11-
register!(pb, ResolveCPUReferencesPass())
9+
@dispose pb=NewPMPassBuilder() begin
10+
register!(pb, ResolveCPUReferencesPass())
1211

13-
add!(pb, RecomputeGlobalsAAPass())
14-
add!(pb, GlobalOptPass())
15-
add!(pb, ResolveCPUReferencesPass())
16-
add!(pb, GlobalDCEPass())
17-
add!(pb, StripDeadPrototypesPass())
12+
add!(pb, RecomputeGlobalsAAPass())
13+
add!(pb, GlobalOptPass())
14+
add!(pb, ResolveCPUReferencesPass())
15+
add!(pb, GlobalDCEPass())
16+
add!(pb, StripDeadPrototypesPass())
1817

19-
run!(pb, mod, llvm_machine(job.config.target))
20-
end
21-
else
22-
@dispose pm=ModulePassManager() begin
23-
global_optimizer!(pm)
24-
25-
resolve_cpu_references!(pm)
26-
27-
global_dce!(pm)
28-
strip_dead_prototypes!(pm)
29-
30-
run!(pm, mod)
31-
end
18+
run!(pb, mod, llvm_machine(job.config.target))
3219
end
3320

3421
return
@@ -78,12 +65,8 @@ function resolve_cpu_references!(mod::LLVM.Module)
7865

7966
return changed
8067
end
81-
resolve_cpu_references!(pm::PassManager) =
82-
add!(pm, ModulePass("ResolveCPUReferences", resolve_cpu_references!))
83-
if LLVM.has_newpm()
84-
ResolveCPUReferencesPass() =
85-
NewPMModulePass("ResolveCPUReferences", resolve_cpu_references!)
86-
end
68+
ResolveCPUReferencesPass() =
69+
NewPMModulePass("ResolveCPUReferences", resolve_cpu_references!)
8770

8871

8972
function mcgen(@nospecialize(job::CompilerJob), mod::LLVM.Module, format=LLVM.API.LLVMAssemblyFile)

src/metal.jl

Lines changed: 22 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,10 @@ function finish_module!(@nospecialize(job::CompilerJob{MetalCompilerTarget}), mo
7777

7878
# we emit properties (of the air and metal version) as private global constants,
7979
# so run the optimizer so that they are inlined before the rest of the optimizer runs.
80-
if use_newpm
81-
@dispose pb=NewPMPassBuilder() begin
82-
add!(pb, RecomputeGlobalsAAPass())
83-
add!(pb, GlobalOptPass())
84-
run!(pb, mod)
85-
end
86-
else
87-
@dispose pm=ModulePassManager() begin
88-
global_optimizer!(pm)
89-
run!(pm, mod)
90-
end
80+
@dispose pb=NewPMPassBuilder() begin
81+
add!(pb, RecomputeGlobalsAAPass())
82+
add!(pb, GlobalOptPass())
83+
run!(pb, mod)
9184
end
9285

9386
return functions(mod)[entry_fn]
@@ -121,22 +114,13 @@ function hide_noreturn!(mod::LLVM.Module)
121114
end
122115
any_noreturn || return false
123116

124-
if use_newpm
125-
@dispose pb=NewPMPassBuilder() begin
126-
add!(pb, AlwaysInlinerPass())
127-
add!(pb, NewPMFunctionPassManager()) do fpm
128-
add!(fpm, SimplifyCFGPass())
129-
add!(fpm, InstCombinePass())
130-
end
131-
run!(pb, mod)
132-
end
133-
else
134-
@dispose pm=ModulePassManager() begin
135-
always_inliner!(pm)
136-
cfgsimplification!(pm)
137-
instruction_combining!(pm)
138-
run!(pm, mod)
117+
@dispose pb=NewPMPassBuilder() begin
118+
add!(pb, AlwaysInlinerPass())
119+
add!(pb, NewPMFunctionPassManager()) do fpm
120+
add!(fpm, SimplifyCFGPass())
121+
add!(fpm, InstCombinePass())
139122
end
123+
run!(pb, mod)
140124
end
141125

142126
return true
@@ -164,22 +148,13 @@ function finish_ir!(@nospecialize(job::CompilerJob{MetalCompilerTarget}), mod::L
164148
end
165149
if changed
166150
# lowering may have introduced additional functions marked `alwaysinline`
167-
if use_newpm
168-
@dispose pb=NewPMPassBuilder() begin
169-
add!(pb, AlwaysInlinerPass())
170-
add!(pb, NewPMFunctionPassManager()) do fpm
171-
add!(fpm, SimplifyCFGPass())
172-
add!(fpm, InstCombinePass())
173-
end
174-
run!(pb, mod)
175-
end
176-
else
177-
@dispose pm=ModulePassManager() begin
178-
always_inliner!(pm)
179-
cfgsimplification!(pm)
180-
instruction_combining!(pm)
181-
run!(pm, mod)
151+
@dispose pb=NewPMPassBuilder() begin
152+
add!(pb, AlwaysInlinerPass())
153+
add!(pb, NewPMFunctionPassManager()) do fpm
154+
add!(fpm, SimplifyCFGPass())
155+
add!(fpm, InstCombinePass())
182156
end
157+
run!(pb, mod)
183158
end
184159
end
185160

@@ -305,24 +280,13 @@ function add_address_spaces!(@nospecialize(job::CompilerJob), mod::LLVM.Module,
305280
LLVM.name!(new_f, fn)
306281

307282
# clean-up after this pass (which runs after optimization)
308-
if use_newpm
309-
@dispose pb=NewPMPassBuilder() begin
310-
add!(pb, SimplifyCFGPass())
311-
add!(pb, SROAPass())
312-
add!(pb, EarlyCSEPass())
313-
add!(pb, InstCombinePass())
283+
@dispose pb=NewPMPassBuilder() begin
284+
add!(pb, SimplifyCFGPass())
285+
add!(pb, SROAPass())
286+
add!(pb, EarlyCSEPass())
287+
add!(pb, InstCombinePass())
314288

315-
run!(pb, mod)
316-
end
317-
else
318-
@dispose pm=ModulePassManager() begin
319-
cfgsimplification!(pm)
320-
scalar_repl_aggregates!(pm)
321-
early_cse!(pm)
322-
instruction_combining!(pm)
323-
324-
run!(pm, mod)
325-
end
289+
run!(pb, mod)
326290
end
327291

328292
return new_f

0 commit comments

Comments
 (0)