Add -o:aggressive for LLVM 17

This commit is contained in:
gingerBill
2023-09-21 09:48:53 +01:00
parent 2160484b62
commit e82b0ea4cd
5 changed files with 43 additions and 14 deletions
+1 -1
View File
@@ -1390,7 +1390,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
bc->optimization_level = -1; // -o:none bc->optimization_level = -1; // -o:none
} }
bc->optimization_level = gb_clamp(bc->optimization_level, -1, 2); bc->optimization_level = gb_clamp(bc->optimization_level, -1, 3);
// ENFORCE DYNAMIC MAP CALLS // ENFORCE DYNAMIC MAP CALLS
bc->dynamic_map_calls = true; bc->dynamic_map_calls = true;
+19 -10
View File
@@ -1358,6 +1358,7 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) {
m->function_pass_managers[lbFunctionPassManager_minimal] = LLVMCreateFunctionPassManagerForModule(m->mod); m->function_pass_managers[lbFunctionPassManager_minimal] = LLVMCreateFunctionPassManagerForModule(m->mod);
m->function_pass_managers[lbFunctionPassManager_size] = LLVMCreateFunctionPassManagerForModule(m->mod); m->function_pass_managers[lbFunctionPassManager_size] = LLVMCreateFunctionPassManagerForModule(m->mod);
m->function_pass_managers[lbFunctionPassManager_speed] = LLVMCreateFunctionPassManagerForModule(m->mod); m->function_pass_managers[lbFunctionPassManager_speed] = LLVMCreateFunctionPassManagerForModule(m->mod);
m->function_pass_managers[lbFunctionPassManager_aggressive] = LLVMCreateFunctionPassManagerForModule(m->mod);
LLVMInitializeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default]); LLVMInitializeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default]);
LLVMInitializeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default_without_memcpy]); LLVMInitializeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default_without_memcpy]);
@@ -1368,10 +1369,11 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) {
lb_populate_function_pass_manager(m, m->function_pass_managers[lbFunctionPassManager_default], false, build_context.optimization_level); lb_populate_function_pass_manager(m, m->function_pass_managers[lbFunctionPassManager_default], false, build_context.optimization_level);
lb_populate_function_pass_manager(m, m->function_pass_managers[lbFunctionPassManager_default_without_memcpy], true, build_context.optimization_level); lb_populate_function_pass_manager(m, m->function_pass_managers[lbFunctionPassManager_default_without_memcpy], true, build_context.optimization_level);
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_none], -1); lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_none], -1);
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_minimal], 0); lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_minimal], 0);
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_size], 1); lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_size], 1);
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_speed], 2); lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_speed], 2);
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_aggressive], 3);
LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default]); LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default]);
LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default_without_memcpy]); LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default_without_memcpy]);
@@ -1379,6 +1381,7 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) {
LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_minimal]); LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_minimal]);
LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_size]); LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_size]);
LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_speed]); LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_speed]);
LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_aggressive]);
} }
if (m == &m->gen->default_module) { if (m == &m->gen->default_module) {
@@ -1464,7 +1467,7 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
int inline_threshold = 0; int inline_threshold = 0;
LLVMPassBuilderOptionsSetInlinerThreshold(pb_options, inline_threshold); LLVMPassBuilderOptionsSetInlinerThreshold(pb_options, inline_threshold);
if (build_context.optimization_level == 2) { if (build_context.optimization_level >= 2) {
LLVMPassBuilderOptionsSetLoopVectorization(pb_options, true); LLVMPassBuilderOptionsSetLoopVectorization(pb_options, true);
LLVMPassBuilderOptionsSetLoopUnrolling (pb_options, true); LLVMPassBuilderOptionsSetLoopUnrolling (pb_options, true);
LLVMPassBuilderOptionsSetMergeFunctions (pb_options, true); LLVMPassBuilderOptionsSetMergeFunctions (pb_options, true);
@@ -1483,6 +1486,9 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
case 2: case 2:
passes = gb_string_appendc(passes, "default<O2>"); passes = gb_string_appendc(passes, "default<O2>");
break; break;
case 3:
passes = gb_string_appendc(passes, "default<O3>");
break;
} }
// asan - Linux, Darwin, Windows // asan - Linux, Darwin, Windows
@@ -2105,12 +2111,15 @@ gb_internal bool lb_generate_code(lbGenerator *gen) {
// GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target)); // GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target));
LLVMCodeGenOptLevel code_gen_level = LLVMCodeGenLevelNone; LLVMCodeGenOptLevel code_gen_level = LLVMCodeGenLevelNone;
if (!LB_USE_NEW_PASS_SYSTEM) {
build_context.optimization_level = gb_clamp(build_context.optimization_level, -1, 2);
}
switch (build_context.optimization_level) { switch (build_context.optimization_level) {
case 0: code_gen_level = LLVMCodeGenLevelNone; break; default:/*fallthrough*/
case 1: code_gen_level = LLVMCodeGenLevelLess; break; case 0: code_gen_level = LLVMCodeGenLevelNone; break;
case 2: code_gen_level = LLVMCodeGenLevelDefault; break; case 1: code_gen_level = LLVMCodeGenLevelLess; break;
case 3: code_gen_level = LLVMCodeGenLevelDefault; break; // NOTE(bill): force -opt:3 to be the same as -opt:2 case 2: code_gen_level = LLVMCodeGenLevelDefault; break;
// case 3: code_gen_level = LLVMCodeGenLevelAggressive; break; case 3: code_gen_level = LLVMCodeGenLevelAggressive; break;
} }
// NOTE(bill): Target Machine Creation // NOTE(bill): Target Machine Creation
+1
View File
@@ -117,6 +117,7 @@ enum lbFunctionPassManagerKind {
lbFunctionPassManager_minimal, lbFunctionPassManager_minimal,
lbFunctionPassManager_size, lbFunctionPassManager_size,
lbFunctionPassManager_speed, lbFunctionPassManager_speed,
lbFunctionPassManager_aggressive,
lbFunctionPassManager_COUNT lbFunctionPassManager_COUNT
}; };
+1 -2
View File
@@ -66,8 +66,7 @@ gb_internal void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPas
#endif #endif
gb_internal bool lb_opt_ignore(i32 optimization_level) { gb_internal bool lb_opt_ignore(i32 optimization_level) {
optimization_level = gb_clamp(optimization_level, -1, 2); return optimization_level < 0;
return optimization_level == -1;
} }
gb_internal void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) { gb_internal void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) {
+21 -1
View File
@@ -664,12 +664,18 @@ gb_internal bool parse_build_flags(Array<String> args) {
} else if (value.value_string == "speed") { } else if (value.value_string == "speed") {
build_context.custom_optimization_level = true; build_context.custom_optimization_level = true;
build_context.optimization_level = 2; build_context.optimization_level = 2;
} else if (value.value_string == "aggressive" && LB_USE_NEW_PASS_SYSTEM) {
build_context.custom_optimization_level = true;
build_context.optimization_level = 3;
} else { } else {
gb_printf_err("Invalid optimization mode for -o:<string>, got %.*s\n", LIT(value.value_string)); gb_printf_err("Invalid optimization mode for -o:<string>, got %.*s\n", LIT(value.value_string));
gb_printf_err("Valid optimization modes:\n"); gb_printf_err("Valid optimization modes:\n");
gb_printf_err("\tminimal\n"); gb_printf_err("\tminimal\n");
gb_printf_err("\tsize\n"); gb_printf_err("\tsize\n");
gb_printf_err("\tspeed\n"); gb_printf_err("\tspeed\n");
if (LB_USE_NEW_PASS_SYSTEM) {
gb_printf_err("\taggressive\n");
}
gb_printf_err("\tnone (useful for -debug builds)\n"); gb_printf_err("\tnone (useful for -debug builds)\n");
bad_flags = true; bad_flags = true;
} }
@@ -1668,8 +1674,13 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(1, "-o:<string>"); print_usage_line(1, "-o:<string>");
print_usage_line(2, "Set the optimization mode for compilation"); print_usage_line(2, "Set the optimization mode for compilation");
print_usage_line(2, "Accepted values: minimal, size, speed, none"); if (LB_USE_NEW_PASS_SYSTEM) {
print_usage_line(2, "Accepted values: none, minimal, size, speed, aggressive");
} else {
print_usage_line(2, "Accepted values: none, minimal, size, speed");
}
print_usage_line(2, "Example: -o:speed"); print_usage_line(2, "Example: -o:speed");
print_usage_line(2, "The default is -o:minimal");
print_usage_line(0, ""); print_usage_line(0, "");
} }
@@ -1948,6 +1959,15 @@ gb_internal void print_show_help(String const arg0, String const &command) {
} }
if (run_or_build) {
print_usage_line(1, "-sanitize:<string>");
print_usage_line(1, "Enables sanitization analysis");
print_usage_line(1, "Options are 'address', 'memory', and 'thread'");
print_usage_line(1, "NOTE: This flag can be used multiple times");
print_usage_line(0, "");
}
if (run_or_build) { if (run_or_build) {
#if defined(GB_SYSTEM_WINDOWS) #if defined(GB_SYSTEM_WINDOWS)
print_usage_line(1, "-ignore-vs-search"); print_usage_line(1, "-ignore-vs-search");