mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-22 00:09:33 +03:00
Add explicit OptLevel to add_passes
This commit is contained in:
parent
b19386c1f6
commit
ea713023e8
@ -31,6 +31,11 @@ const PRINT_FN_VERIFICATION_OUTPUT: bool = false;
|
|||||||
// TODO: experiment with different internal calling conventions, e.g. "fast"
|
// TODO: experiment with different internal calling conventions, e.g. "fast"
|
||||||
const DEFAULT_CALLING_CONVENTION: u32 = 0;
|
const DEFAULT_CALLING_CONVENTION: u32 = 0;
|
||||||
|
|
||||||
|
pub enum OptLevel {
|
||||||
|
Normal,
|
||||||
|
Optimize,
|
||||||
|
}
|
||||||
|
|
||||||
type Scope<'a, 'ctx> = ImMap<Symbol, (Layout<'a>, PointerValue<'ctx>)>;
|
type Scope<'a, 'ctx> = ImMap<Symbol, (Layout<'a>, PointerValue<'ctx>)>;
|
||||||
|
|
||||||
pub struct Env<'a, 'ctx, 'env> {
|
pub struct Env<'a, 'ctx, 'env> {
|
||||||
@ -56,7 +61,7 @@ pub fn module_from_builtins<'ctx>(ctx: &'ctx Context, module_name: &str) -> Modu
|
|||||||
.unwrap_or_else(|err| panic!("Unable to import builtins bitcode. LLVM error: {:?}", err))
|
.unwrap_or_else(|err| panic!("Unable to import builtins bitcode. LLVM error: {:?}", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_passes(fpm: &PassManager<FunctionValue<'_>>) {
|
pub fn add_passes(fpm: &PassManager<FunctionValue<'_>>, opt_level: OptLevel) {
|
||||||
// tail-call elimination is always on
|
// tail-call elimination is always on
|
||||||
fpm.add_instruction_combining_pass();
|
fpm.add_instruction_combining_pass();
|
||||||
fpm.add_tail_call_elimination_pass();
|
fpm.add_tail_call_elimination_pass();
|
||||||
@ -64,28 +69,32 @@ pub fn add_passes(fpm: &PassManager<FunctionValue<'_>>) {
|
|||||||
let pmb = PassManagerBuilder::create();
|
let pmb = PassManagerBuilder::create();
|
||||||
|
|
||||||
// Enable more optimizations when running cargo test --release
|
// Enable more optimizations when running cargo test --release
|
||||||
if cfg!(debug_assertions) {
|
match opt_level {
|
||||||
pmb.set_optimization_level(OptimizationLevel::None);
|
OptLevel::Normal => {
|
||||||
} else {
|
pmb.set_optimization_level(OptimizationLevel::None);
|
||||||
// Default is O2, Aggressive is O3
|
}
|
||||||
//
|
OptLevel::Optimize => {
|
||||||
// See https://llvm.org/doxygen/CodeGen_8h_source.html
|
// Default is O2, Aggressive is O3
|
||||||
pmb.set_optimization_level(OptimizationLevel::Aggressive);
|
//
|
||||||
|
// See https://llvm.org/doxygen/CodeGen_8h_source.html
|
||||||
|
pmb.set_optimization_level(OptimizationLevel::Aggressive);
|
||||||
|
|
||||||
// TODO figure out how enabling these individually differs from
|
// TODO figure out how enabling these individually differs from
|
||||||
// the broad "aggressive optimizations" setting.
|
// the broad "aggressive optimizations" setting.
|
||||||
|
|
||||||
// fpm.add_reassociate_pass();
|
// fpm.add_reassociate_pass();
|
||||||
// fpm.add_basic_alias_analysis_pass();
|
// fpm.add_basic_alias_analysis_pass();
|
||||||
// fpm.add_promote_memory_to_register_pass();
|
// fpm.add_promote_memory_to_register_pass();
|
||||||
// fpm.add_cfg_simplification_pass();
|
// fpm.add_cfg_simplification_pass();
|
||||||
// fpm.add_gvn_pass();
|
// fpm.add_gvn_pass();
|
||||||
// TODO figure out why enabling any of these (even alone) causes LLVM to segfault
|
// TODO figure out why enabling any of these (even alone) causes LLVM to segfault
|
||||||
// fpm.add_strip_dead_prototypes_pass();
|
// fpm.add_strip_dead_prototypes_pass();
|
||||||
// fpm.add_dead_arg_elimination_pass();
|
// fpm.add_dead_arg_elimination_pass();
|
||||||
// fpm.add_function_inlining_pass();
|
// fpm.add_function_inlining_pass();
|
||||||
// pmb.set_inliner_with_threshold(4);
|
// pmb.set_inliner_with_threshold(4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pmb.populate_function_pass_manager(&fpm);
|
pmb.populate_function_pass_manager(&fpm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,9 +12,14 @@ macro_rules! assert_llvm_evals_to {
|
|||||||
let context = Context::create();
|
let context = Context::create();
|
||||||
let module = roc_gen::llvm::build::module_from_builtins(&context, "app");
|
let module = roc_gen::llvm::build::module_from_builtins(&context, "app");
|
||||||
let builder = context.create_builder();
|
let builder = context.create_builder();
|
||||||
let fpm = inkwell::passes::PassManager::create(&module);
|
let opt_level = if(cfg!(debug_assertions)) {
|
||||||
|
roc_gen::llvm::build::OptLevel::Normal
|
||||||
|
} else {
|
||||||
|
roc_gen::llvm::build::OptLevel::Optimize
|
||||||
|
};
|
||||||
|
let fpm = PassManager::create(&module);
|
||||||
|
|
||||||
roc_gen::llvm::build::add_passes(&fpm);
|
roc_gen::llvm::build::add_passes(&fpm, opt_level);
|
||||||
|
|
||||||
fpm.initialize();
|
fpm.initialize();
|
||||||
|
|
||||||
@ -147,9 +152,14 @@ macro_rules! assert_opt_evals_to {
|
|||||||
let context = Context::create();
|
let context = Context::create();
|
||||||
let module = roc_gen::llvm::build::module_from_builtins(&context, "app");
|
let module = roc_gen::llvm::build::module_from_builtins(&context, "app");
|
||||||
let builder = context.create_builder();
|
let builder = context.create_builder();
|
||||||
|
let opt_level = if(cfg!(debug_assertions)) {
|
||||||
|
roc_gen::llvm::build::OptLevel::Normal
|
||||||
|
} else {
|
||||||
|
roc_gen::llvm::build::OptLevel::Optimize
|
||||||
|
};
|
||||||
let fpm = PassManager::create(&module);
|
let fpm = PassManager::create(&module);
|
||||||
|
|
||||||
roc_gen::llvm::build::add_passes(&fpm);
|
roc_gen::llvm::build::add_passes(&fpm, opt_level);
|
||||||
|
|
||||||
fpm.initialize();
|
fpm.initialize();
|
||||||
|
|
||||||
@ -278,9 +288,14 @@ macro_rules! emit_expr {
|
|||||||
let context = Context::create();
|
let context = Context::create();
|
||||||
let module = context.create_module("app");
|
let module = context.create_module("app");
|
||||||
let builder = context.create_builder();
|
let builder = context.create_builder();
|
||||||
|
let opt_level = if(cfg!(debug_assertions)) {
|
||||||
|
roc_gen::llvm::build::OptLevel::Normal
|
||||||
|
} else {
|
||||||
|
roc_gen::llvm::build::OptLevel::Optimize
|
||||||
|
};
|
||||||
let fpm = PassManager::create(&module);
|
let fpm = PassManager::create(&module);
|
||||||
|
|
||||||
roc_gen::llvm::build::add_passes(&fpm);
|
roc_gen::llvm::build::add_passes(&fpm, opt_level);
|
||||||
|
|
||||||
fpm.initialize();
|
fpm.initialize();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user