Browse Source

Change function pass manager passes

gingerBill 4 years ago
parent
commit
1c9f48031d
2 changed files with 43 additions and 4 deletions
  1. 3 3
      src/llvm_backend.cpp
  2. 40 1
      src/llvm_backend_opt.cpp

+ 3 - 3
src/llvm_backend.cpp

@@ -14030,9 +14030,9 @@ void lb_generate_code(lbGenerator *gen) {
 	LLVMInitializeFunctionPassManager(function_pass_manager_speed);
 
 	lb_populate_function_pass_manager(default_function_pass_manager, false, build_context.optimization_level);
-	lb_populate_function_pass_manager(function_pass_manager_minimal, false, 0);
-	lb_populate_function_pass_manager(function_pass_manager_size, false, 1);
-	lb_populate_function_pass_manager(function_pass_manager_speed, false, 2);
+	lb_populate_function_pass_manager_specific(function_pass_manager_minimal, 0);
+	lb_populate_function_pass_manager_specific(function_pass_manager_size,    1);
+	lb_populate_function_pass_manager_specific(function_pass_manager_speed,   2);
 
 	LLVMFinalizeFunctionPassManager(default_function_pass_manager);
 	LLVMFinalizeFunctionPassManager(function_pass_manager_minimal);

+ 40 - 1
src/llvm_backend_opt.cpp

@@ -1,6 +1,7 @@
 void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level);
 void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level);
 void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level);
+void lb_populate_function_pass_manager_specific(LLVMPassManagerRef fpm, i32 optimization_level);
 
 void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm) {
 	LLVMAddPromoteMemoryToRegisterPass(fpm);
@@ -28,8 +29,46 @@ void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcp
 		return;
 	}
 
-#if 1
+#if 0
+	LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate();
+	LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level);
+	LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level);
+	LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm);
+#else
+	LLVMAddMemCpyOptPass(fpm);
+	LLVMAddPromoteMemoryToRegisterPass(fpm);
+	LLVMAddMergedLoadStoreMotionPass(fpm);
+	LLVMAddConstantPropagationPass(fpm);
+	LLVMAddEarlyCSEPass(fpm);
+
+	LLVMAddConstantPropagationPass(fpm);
+	LLVMAddMergedLoadStoreMotionPass(fpm);
+	LLVMAddPromoteMemoryToRegisterPass(fpm);
+	LLVMAddCFGSimplificationPass(fpm);
+
+	LLVMAddSCCPPass(fpm);
+
+	LLVMAddPromoteMemoryToRegisterPass(fpm);
+	LLVMAddUnifyFunctionExitNodesPass(fpm);
+
+	LLVMAddCFGSimplificationPass(fpm);
+	LLVMAddEarlyCSEPass(fpm);
+	LLVMAddLowerExpectIntrinsicPass(fpm);
+#endif
+}
 
+void lb_populate_function_pass_manager_specific(LLVMPassManagerRef fpm, 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 (optimization_level == 0) {
+		LLVMAddMemCpyOptPass(fpm);
+		lb_basic_populate_function_pass_manager(fpm);
+		return;
+	}
+
+#if 1
 	LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate();
 	LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level);
 	LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level);