diff --git a/src/gcn.jl b/src/gcn.jl index 93c7bc81..fed90f24 100644 --- a/src/gcn.jl +++ b/src/gcn.jl @@ -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 diff --git a/src/optim.jl b/src/optim.jl index c128b408..f59e496e 100644 --- a/src/optim.jl +++ b/src/optim.jl @@ -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) @@ -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