From 3ecc5a8b3fa284898accd99beaf029564cc83826 Mon Sep 17 00:00:00 2001 From: Julian P Samaroo Date: Sun, 10 May 2020 08:21:19 -0500 Subject: [PATCH] Allow modifying Julia's optim pipeline --- src/gcn.jl | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/optim.jl | 10 +++++-- 2 files changed, 84 insertions(+), 3 deletions(-) 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