Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions src/gcn.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,83 @@ function process_kernel!(job::CompilerJob{GCNCompilerTarget}, mod::LLVM.Module,
callconv!(kernel, LLVM.API.LLVMCallConv(91))
end

function add_julia_optimizations!(job::CompilerJob{GCNCompilerTarget}, pm::LLVM.PassManager)
opt_level = Base.JLOptions().opt_level
# everying except unroll, slpvec, loop-vec
# then finish Julia GC
if opt_level < 2
cfgsimplification!(pm)
if opt_level == 1
scalar_repl_aggregates!(pm) # SSA variant?
instruction_combining!(pm)
early_cse!(pm)
end
mem_cpy_opt!(pm)
always_inliner!(pm)
lower_simdloop!(pm)
# GC passes
barrier_noop!(pm)
lower_exc_handlers!(pm)
gc_invariant_verifier!(pm, false)
else
#propagate_julia_addrsp!(pm)
scoped_no_alias_aa!(pm)
type_based_alias_analysis!(pm)
if opt_level >= 2
basic_alias_analysis!(pm)
end
cfgsimplification!(pm)
# TODO: DCE (doesn't exist in llvm-c)
scalar_repl_aggregates!(pm) # SSA variant?
mem_cpy_opt!(pm)
always_inliner!(pm)
alloc_opt!(pm)
instruction_combining!(pm)
cfgsimplification!(pm)
scalar_repl_aggregates!(pm) # SSA variant?
instruction_combining!(pm)
jump_threading!(pm)
instruction_combining!(pm)
reassociate!(pm)
early_cse!(pm)
alloc_opt!(pm)
loop_idiom!(pm)
loop_rotate!(pm)
lower_simdloop!(pm)
licm!(pm)
loop_unswitch!(pm)
instruction_combining!(pm)
ind_var_simplify!(pm)
loop_deletion!(pm)
# SimpleLoopUnroll
alloc_opt!(pm)
scalar_repl_aggregates!(pm) # SSA variant?
instruction_combining!(pm)
gvn!(pm)
mem_cpy_opt!(pm)
sccp!(pm)
# TODO: Sinking Pass
# TODO: LLVM <7 InstructionSimplifier
instruction_combining!(pm)
jump_threading!(pm)
dead_store_elimination!(pm)
alloc_opt!(pm)
cfgsimplification!(pm)
loop_idiom!(pm)
loop_deletion!(pm)
jump_threading!(pm)
# SLP_Vectorizer
aggressive_dce!(pm)
instruction_combining!(pm)
# Loop Vectorize
# InstCombine
# GC passes
barrier_noop!(pm)
lower_exc_handlers!(pm)
gc_invariant_verifier!(pm, false)
end
end

function add_lowering_passes!(job::CompilerJob{GCNCompilerTarget}, pm::LLVM.PassManager)
add!(pm, ModulePass("LowerThrowExtra", lower_throw_extra!))
end
Expand Down
10 changes: 7 additions & 3 deletions src/optim.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# LLVM IR optimization

function add_julia_optimizations!(job::CompilerJob, pm::LLVM.PassManager)
ccall(:jl_add_optimization_passes, Cvoid,
(LLVM.API.LLVMPassManagerRef, Cint, Cint),
LLVM.ref(pm), Base.JLOptions().opt_level, #=lower_intrinsics=# 0)
end

function optimize!(job::CompilerJob, mod::LLVM.Module, entry::LLVM.Function)
tm = llvm_machine(job.target)
entry_fn = LLVM.name(entry)
Expand All @@ -19,9 +25,7 @@ function optimize!(job::CompilerJob, mod::LLVM.Module, entry::LLVM.Function)

ModulePassManager() do pm
initialize!(pm)
ccall(:jl_add_optimization_passes, Cvoid,
(LLVM.API.LLVMPassManagerRef, Cint, Cint),
LLVM.ref(pm), Base.JLOptions().opt_level, #=lower_intrinsics=# 0)
add_julia_optimizations!(job, pm)
run!(pm, mod)
end

Expand Down