Clamp maximum optimization level to 2 for -llvm-api

This commit is contained in:
gingerBill
2021-03-29 15:51:15 +01:00
parent fc8c94324e
commit 66941aed0a
2 changed files with 24 additions and 16 deletions
+3 -3
View File
@@ -13631,14 +13631,14 @@ void lb_generate_code(lbGenerator *gen) {
defer (LLVMDisposePassManager(default_function_pass_manager)); defer (LLVMDisposePassManager(default_function_pass_manager));
LLVMInitializeFunctionPassManager(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); LLVMFinalizeFunctionPassManager(default_function_pass_manager);
LLVMPassManagerRef default_function_pass_manager_without_memcpy = LLVMCreateFunctionPassManagerForModule(mod); LLVMPassManagerRef default_function_pass_manager_without_memcpy = LLVMCreateFunctionPassManagerForModule(mod);
defer (LLVMDisposePassManager(default_function_pass_manager_without_memcpy)); defer (LLVMDisposePassManager(default_function_pass_manager_without_memcpy));
LLVMInitializeFunctionPassManager(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); LLVMFinalizeFunctionPassManager(default_function_pass_manager_without_memcpy);
TIME_SECTION("LLVM Runtime Type Information Creation"); TIME_SECTION("LLVM Runtime Type Information Creation");
@@ -13961,7 +13961,7 @@ void lb_generate_code(lbGenerator *gen) {
LLVMPassManagerRef module_pass_manager = LLVMCreatePassManager(); LLVMPassManagerRef module_pass_manager = LLVMCreatePassManager();
defer (LLVMDisposePassManager(module_pass_manager)); 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); LLVMRunPassManager(module_pass_manager, mod);
+21 -13
View File
@@ -2,11 +2,15 @@
#define LLVM_USE_BASIC_PASSES 0 #define LLVM_USE_BASIC_PASSES 0
#endif #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) { if (!ignore_memcpy_pass) {
LLVMAddMemCpyOptPass(fpm); LLVMAddMemCpyOptPass(fpm);
} }
if (LLVM_USE_BASIC_PASSES || build_context.optimization_level == 0) { if (LLVM_USE_BASIC_PASSES || optimization_level == 0) {
LLVMAddPromoteMemoryToRegisterPass(fpm); LLVMAddPromoteMemoryToRegisterPass(fpm);
LLVMAddMergedLoadStoreMotionPass(fpm); LLVMAddMergedLoadStoreMotionPass(fpm);
LLVMAddEarlyCSEPass(fpm); LLVMAddEarlyCSEPass(fpm);
@@ -35,7 +39,7 @@ void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcp
LLVMAddLowerExpectIntrinsicPass(fpm); LLVMAddLowerExpectIntrinsicPass(fpm);
} }
void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm) { void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) {
// LLVMAddScalarReplAggregatesPass(mpm); // LLVMAddScalarReplAggregatesPass(mpm);
LLVMAddEarlyCSEMemSSAPass(mpm); LLVMAddEarlyCSEMemSSAPass(mpm);
@@ -44,7 +48,7 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm) {
LLVMAddJumpThreadingPass(mpm); LLVMAddJumpThreadingPass(mpm);
if (build_context.optimization_level > 2) { if (optimization_level > 2) {
LLVMAddAggressiveInstCombinerPass(mpm); LLVMAddAggressiveInstCombinerPass(mpm);
} }
LLVMAddInstructionCombiningPass(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(); LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate();
LLVMPassManagerBuilderSetOptLevel(pmb, build_context.optimization_level); LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level);
LLVMPassManagerBuilderSetSizeLevel(pmb, build_context.optimization_level); LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level);
LLVMPassManagerBuilderPopulateLTOPassManager(pmb, mpm, false, true); LLVMPassManagerBuilderPopulateLTOPassManager(pmb, mpm, false, true);
@@ -99,7 +107,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddStripDeadPrototypesPass(mpm); LLVMAddStripDeadPrototypesPass(mpm);
LLVMAddAnalysisPasses(target_machine, mpm); LLVMAddAnalysisPasses(target_machine, mpm);
LLVMAddPruneEHPass(mpm); LLVMAddPruneEHPass(mpm);
if (LLVM_USE_BASIC_PASSES || build_context.optimization_level == 0) { if (LLVM_USE_BASIC_PASSES || optimization_level == 0) {
// LLVMAddMergeFunctionsPass(mpm); // LLVMAddMergeFunctionsPass(mpm);
return; return;
} }
@@ -119,10 +127,10 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddPruneEHPass(mpm); LLVMAddPruneEHPass(mpm);
LLVMAddFunctionInliningPass(mpm); LLVMAddFunctionInliningPass(mpm);
if (build_context.optimization_level > 2) { if (optimization_level > 2) {
LLVMAddArgumentPromotionPass(mpm); LLVMAddArgumentPromotionPass(mpm);
} }
lb_add_function_simplifcation_passes(mpm); lb_add_function_simplifcation_passes(mpm, optimization_level);
LLVMAddGlobalOptimizerPass(mpm); LLVMAddGlobalOptimizerPass(mpm);
@@ -133,7 +141,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddLoopVectorizePass(mpm); LLVMAddLoopVectorizePass(mpm);
LLVMAddInstructionCombiningPass(mpm); LLVMAddInstructionCombiningPass(mpm);
if (build_context.optimization_level >= 2) { if (optimization_level >= 2) {
LLVMAddEarlyCSEPass(mpm); LLVMAddEarlyCSEPass(mpm);
LLVMAddCorrelatedValuePropagationPass(mpm); LLVMAddCorrelatedValuePropagationPass(mpm);
LLVMAddLICMPass(mpm); LLVMAddLICMPass(mpm);
@@ -151,7 +159,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddStripDeadPrototypesPass(mpm); LLVMAddStripDeadPrototypesPass(mpm);
if (build_context.optimization_level >= 2) { if (optimization_level >= 2) {
LLVMAddGlobalDCEPass(mpm); LLVMAddGlobalDCEPass(mpm);
LLVMAddConstantMergePass(mpm); LLVMAddConstantMergePass(mpm);
} }
@@ -163,7 +171,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddAlwaysInlinerPass(mpm); LLVMAddAlwaysInlinerPass(mpm);
LLVMAddStripDeadPrototypesPass(mpm); LLVMAddStripDeadPrototypesPass(mpm);
LLVMAddAnalysisPasses(target_machine, mpm); LLVMAddAnalysisPasses(target_machine, mpm);
if (build_context.optimization_level >= 2) { if (optimization_level >= 2) {
LLVMAddArgumentPromotionPass(mpm); LLVMAddArgumentPromotionPass(mpm);
LLVMAddConstantMergePass(mpm); LLVMAddConstantMergePass(mpm);
LLVMAddGlobalDCEPass(mpm); LLVMAddGlobalDCEPass(mpm);