From 66941aed0ae54da23e7cb92bd656dffc295f5175 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 29 Mar 2021 15:51:15 +0100 Subject: [PATCH] Clamp maximum optimization level to 2 for `-llvm-api` --- src/llvm_backend.cpp | 6 +++--- src/llvm_backend_opt.cpp | 34 +++++++++++++++++++++------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ca2012916..a40b1c133 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -13631,14 +13631,14 @@ void lb_generate_code(lbGenerator *gen) { defer (LLVMDisposePassManager(default_function_pass_manager)); LLVMInitializeFunctionPassManager(default_function_pass_manager); - lb_populate_function_pass_manager(default_function_pass_manager, false); + lb_populate_function_pass_manager(default_function_pass_manager, false, build_context.optimization_level); LLVMFinalizeFunctionPassManager(default_function_pass_manager); LLVMPassManagerRef default_function_pass_manager_without_memcpy = LLVMCreateFunctionPassManagerForModule(mod); defer (LLVMDisposePassManager(default_function_pass_manager_without_memcpy)); LLVMInitializeFunctionPassManager(default_function_pass_manager_without_memcpy); - lb_populate_function_pass_manager(default_function_pass_manager_without_memcpy, true); + lb_populate_function_pass_manager(default_function_pass_manager_without_memcpy, true, build_context.optimization_level); LLVMFinalizeFunctionPassManager(default_function_pass_manager_without_memcpy); TIME_SECTION("LLVM Runtime Type Information Creation"); @@ -13961,7 +13961,7 @@ void lb_generate_code(lbGenerator *gen) { LLVMPassManagerRef module_pass_manager = LLVMCreatePassManager(); defer (LLVMDisposePassManager(module_pass_manager)); - lb_populate_module_pass_manager(target_machine, module_pass_manager); + lb_populate_module_pass_manager(target_machine, module_pass_manager, build_context.optimization_level); LLVMRunPassManager(module_pass_manager, mod); diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 0c53a01aa..ebb0ec0e3 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -2,11 +2,15 @@ #define LLVM_USE_BASIC_PASSES 0 #endif -void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcpy_pass) { +void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) { + // NOTE(bill): Treat -opt:3 as if it was -opt:2 + // TODO(bill): Determine which opt definitions should exist in the first place + optimization_level = gb_clamp(optimization_level, 0, 2); + if (!ignore_memcpy_pass) { LLVMAddMemCpyOptPass(fpm); } - if (LLVM_USE_BASIC_PASSES || build_context.optimization_level == 0) { + if (LLVM_USE_BASIC_PASSES || optimization_level == 0) { LLVMAddPromoteMemoryToRegisterPass(fpm); LLVMAddMergedLoadStoreMotionPass(fpm); LLVMAddEarlyCSEPass(fpm); @@ -35,7 +39,7 @@ void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcp LLVMAddLowerExpectIntrinsicPass(fpm); } -void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm) { +void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) { // LLVMAddScalarReplAggregatesPass(mpm); LLVMAddEarlyCSEMemSSAPass(mpm); @@ -44,7 +48,7 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm) { LLVMAddJumpThreadingPass(mpm); - if (build_context.optimization_level > 2) { + if (optimization_level > 2) { LLVMAddAggressiveInstCombinerPass(mpm); } LLVMAddInstructionCombiningPass(mpm); @@ -88,10 +92,14 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm) { } -void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm) { +void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level) { + // NOTE(bill): Treat -opt:3 as if it was -opt:2 + // TODO(bill): Determine which opt definitions should exist in the first place + optimization_level = gb_clamp(optimization_level, 0, 2); + LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate(); - LLVMPassManagerBuilderSetOptLevel(pmb, build_context.optimization_level); - LLVMPassManagerBuilderSetSizeLevel(pmb, build_context.optimization_level); + LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level); + LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level); LLVMPassManagerBuilderPopulateLTOPassManager(pmb, mpm, false, true); @@ -99,7 +107,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa LLVMAddStripDeadPrototypesPass(mpm); LLVMAddAnalysisPasses(target_machine, mpm); LLVMAddPruneEHPass(mpm); - if (LLVM_USE_BASIC_PASSES || build_context.optimization_level == 0) { + if (LLVM_USE_BASIC_PASSES || optimization_level == 0) { // LLVMAddMergeFunctionsPass(mpm); return; } @@ -119,10 +127,10 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa LLVMAddPruneEHPass(mpm); LLVMAddFunctionInliningPass(mpm); - if (build_context.optimization_level > 2) { + if (optimization_level > 2) { LLVMAddArgumentPromotionPass(mpm); } - lb_add_function_simplifcation_passes(mpm); + lb_add_function_simplifcation_passes(mpm, optimization_level); LLVMAddGlobalOptimizerPass(mpm); @@ -133,7 +141,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa LLVMAddLoopVectorizePass(mpm); LLVMAddInstructionCombiningPass(mpm); - if (build_context.optimization_level >= 2) { + if (optimization_level >= 2) { LLVMAddEarlyCSEPass(mpm); LLVMAddCorrelatedValuePropagationPass(mpm); LLVMAddLICMPass(mpm); @@ -151,7 +159,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa LLVMAddStripDeadPrototypesPass(mpm); - if (build_context.optimization_level >= 2) { + if (optimization_level >= 2) { LLVMAddGlobalDCEPass(mpm); LLVMAddConstantMergePass(mpm); } @@ -163,7 +171,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa LLVMAddAlwaysInlinerPass(mpm); LLVMAddStripDeadPrototypesPass(mpm); LLVMAddAnalysisPasses(target_machine, mpm); - if (build_context.optimization_level >= 2) { + if (optimization_level >= 2) { LLVMAddArgumentPromotionPass(mpm); LLVMAddConstantMergePass(mpm); LLVMAddGlobalDCEPass(mpm);