Bläddra i källkod

Add `-o:aggressive` for LLVM 17

gingerBill 1 år sedan
förälder
incheckning
e82b0ea4cd
5 ändrade filer med 43 tillägg och 14 borttagningar
  1. 1 1
      src/build_settings.cpp
  2. 19 10
      src/llvm_backend.cpp
  3. 1 0
      src/llvm_backend.hpp
  4. 1 2
      src/llvm_backend_opt.cpp
  5. 21 1
      src/main.cpp

+ 1 - 1
src/build_settings.cpp

@@ -1390,7 +1390,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
 		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
 	bc->dynamic_map_calls = true;

+ 19 - 10
src/llvm_backend.cpp

@@ -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_size]                   = 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_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_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_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_speed],   2);
+		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_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_aggressive], 3);
 
 		LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_default]);
 		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_size]);
 		LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_speed]);
+		LLVMFinalizeFunctionPassManager(m->function_pass_managers[lbFunctionPassManager_aggressive]);
 	}
 
 	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;
 	LLVMPassBuilderOptionsSetInlinerThreshold(pb_options, inline_threshold);
 
-	if (build_context.optimization_level == 2) {
+	if (build_context.optimization_level >= 2) {
 		LLVMPassBuilderOptionsSetLoopVectorization(pb_options, true);
 		LLVMPassBuilderOptionsSetLoopUnrolling    (pb_options, true);
 		LLVMPassBuilderOptionsSetMergeFunctions   (pb_options, true);
@@ -1483,6 +1486,9 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
 	case 2:
 		passes = gb_string_appendc(passes, "default<O2>");
 		break;
+	case 3:
+		passes = gb_string_appendc(passes, "default<O3>");
+		break;
 	}
 
 	// asan - Linux, Darwin, Windows
@@ -2105,12 +2111,15 @@ gb_internal bool lb_generate_code(lbGenerator *gen) {
 	// GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target));
 
 	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) {
-	case 0: code_gen_level = LLVMCodeGenLevelNone;    break;
-	case 1: code_gen_level = LLVMCodeGenLevelLess;    break;
-	case 2: code_gen_level = LLVMCodeGenLevelDefault; break;
-	case 3: code_gen_level = LLVMCodeGenLevelDefault; break; // NOTE(bill): force -opt:3 to be the same as -opt:2
-	// case 3: code_gen_level = LLVMCodeGenLevelAggressive; break;
+	default:/*fallthrough*/
+	case 0: code_gen_level = LLVMCodeGenLevelNone;       break;
+	case 1: code_gen_level = LLVMCodeGenLevelLess;       break;
+	case 2: code_gen_level = LLVMCodeGenLevelDefault;    break;
+	case 3: code_gen_level = LLVMCodeGenLevelAggressive; break;
 	}
 
 	// NOTE(bill): Target Machine Creation

+ 1 - 0
src/llvm_backend.hpp

@@ -117,6 +117,7 @@ enum lbFunctionPassManagerKind {
 	lbFunctionPassManager_minimal,
 	lbFunctionPassManager_size,
 	lbFunctionPassManager_speed,
+	lbFunctionPassManager_aggressive,
 
 	lbFunctionPassManager_COUNT
 };

+ 1 - 2
src/llvm_backend_opt.cpp

@@ -66,8 +66,7 @@ gb_internal void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPas
 #endif
 
 gb_internal bool lb_opt_ignore(i32 optimization_level) {
-	optimization_level = gb_clamp(optimization_level, -1, 2);
-	return optimization_level == -1;
+	return optimization_level < 0;
 }
 
 gb_internal void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) {

+ 21 - 1
src/main.cpp

@@ -664,12 +664,18 @@ gb_internal bool parse_build_flags(Array<String> args) {
 							} else if (value.value_string == "speed") {
 								build_context.custom_optimization_level = true;
 								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 {
 								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("\tminimal\n");
 								gb_printf_err("\tsize\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");
 								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(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, "The default is -o:minimal");
 		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 defined(GB_SYSTEM_WINDOWS)
 		print_usage_line(1, "-ignore-vs-search");