Skip to content

Commit 104629e

Browse files
authored
Make the optimization level configurable. (#577)
1 parent 288b613 commit 104629e

File tree

3 files changed

+17
-25
lines changed

3 files changed

+17
-25
lines changed

src/driver.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ const __llvm_initialized = Ref(false)
348348

349349
if optimize
350350
@timeit_debug to "optimization" begin
351-
optimize!(job, ir)
351+
optimize!(job, ir; job.config.opt_level)
352352

353353
# deferred codegen has some special optimization requirements,
354354
# which also need to happen _after_ regular optimization.

src/interface.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,26 +94,28 @@ struct CompilerConfig{T,P}
9494
name::Union{Nothing,String}
9595
entry_abi::Symbol
9696
always_inline::Bool
97+
opt_level::Int
9798

9899
function CompilerConfig(target::AbstractCompilerTarget,
99100
params::AbstractCompilerParams;
100101
kernel=true,
101102
name=nothing,
102103
entry_abi=:specfunc,
103-
always_inline=false)
104+
always_inline=false,
105+
opt_level=2)
104106
if entry_abi (:specfunc, :func)
105107
error("Unknown entry_abi=$entry_abi")
106108
end
107109
new{typeof(target), typeof(params)}(target, params, kernel, name, entry_abi,
108-
always_inline)
110+
always_inline, opt_level)
109111
end
110112
end
111113

112114
# copy constructor
113115
CompilerConfig(cfg::CompilerConfig; target=cfg.target, params=cfg.params,
114116
kernel=cfg.kernel, name=cfg.name, entry_abi=cfg.entry_abi,
115-
always_inline=cfg.always_inline) =
116-
CompilerConfig(target, params; kernel, entry_abi, name, always_inline)
117+
always_inline=cfg.always_inline, opt_level=cfg.opt_level) =
118+
CompilerConfig(target, params; kernel, entry_abi, name, always_inline, opt_level)
117119

118120
function Base.show(io::IO, @nospecialize(cfg::CompilerConfig{T})) where {T}
119121
print(io, "CompilerConfig for ", T)
@@ -127,6 +129,7 @@ function Base.hash(cfg::CompilerConfig, h::UInt)
127129
h = hash(cfg.name, h)
128130
h = hash(cfg.entry_abi, h)
129131
h = hash(cfg.always_inline, h)
132+
h = hash(cfg.opt_level, h)
130133

131134
return h
132135
end

src/optim.jl

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
# LLVM IR optimization
22

3-
function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
3+
function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=2)
44
if use_newpm
5-
optimize_newpm!(job, mod)
5+
optimize_newpm!(job, mod; opt_level)
66
else
7-
optimize_legacypm!(job, mod)
7+
optimize_legacypm!(job, mod; opt_level)
88
end
99
return
1010
end
1111

1212

1313
## new pm
1414

15-
function optimize_newpm!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
15+
function optimize_newpm!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level)
1616
triple = llvm_triple(job.config.target)
1717
tm = llvm_machine(job.config.target)
1818

@@ -21,7 +21,7 @@ function optimize_newpm!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
2121

2222
@dispose pb=PassBuilder(tm) begin
2323
@dispose mpm=NewPMModulePassManager(pb) begin
24-
buildNewPMPipeline!(mpm, job)
24+
buildNewPMPipeline!(mpm, job, opt_level)
2525
run!(mpm, mod, tm)
2626
end
2727
end
@@ -30,7 +30,7 @@ function optimize_newpm!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
3030
return
3131
end
3232

33-
function buildNewPMPipeline!(mpm, @nospecialize(job::CompilerJob), opt_level=2)
33+
function buildNewPMPipeline!(mpm, @nospecialize(job::CompilerJob), opt_level)
3434
buildEarlySimplificationPipeline(mpm, job, opt_level)
3535
add!(mpm, AlwaysInlinerPass())
3636
buildEarlyOptimizerPipeline(mpm, job, opt_level)
@@ -283,7 +283,7 @@ end
283283

284284
## legacy pm
285285

286-
function optimize_legacypm!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
286+
function optimize_legacypm!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level)
287287
triple = llvm_triple(job.config.target)
288288
tm = llvm_machine(job.config.target)
289289

@@ -292,7 +292,7 @@ function optimize_legacypm!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
292292

293293
@dispose pm=ModulePassManager() begin
294294
addTargetPasses!(pm, tm, triple)
295-
addOptimizationPasses!(pm)
295+
addOptimizationPasses!(pm, opt_level)
296296
run!(pm, mod)
297297
end
298298

@@ -404,17 +404,6 @@ function optimize_legacypm!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
404404
run!(pm, mod)
405405
end
406406

407-
# compare to Clang by using the pass manager builder APIs:
408-
#LLVM.clopts("-print-after-all", "-filter-print-funcs=$(LLVM.name(entry))")
409-
#@dispose pm=ModulePassManager() begin
410-
# addTargetPasses!(pm, tm, triple)
411-
# PassManager@dispose pmb=IRBuilder() begin
412-
# optlevel!(pmb, 2)
413-
# populate!(pm, pmb)
414-
# end
415-
# run!(pm, mod)
416-
#end
417-
418407
return
419408
end
420409

@@ -424,7 +413,7 @@ function addTargetPasses!(pm, tm, triple)
424413
end
425414

426415
# Based on Julia's optimization pipeline, minus the SLP and loop vectorizers.
427-
function addOptimizationPasses!(pm, opt_level=2)
416+
function addOptimizationPasses!(pm, opt_level)
428417
# compare with the using Julia's optimization pipeline directly:
429418
#ccall(:jl_add_optimization_passes, Cvoid,
430419
# (LLVM.API.LLVMPassManagerRef, Cint, Cint),

0 commit comments

Comments
 (0)