Remove LLVMPassManagerBuilder usage in lb_populate_module_pass_manager; simplify lb_populate_function_pass_manager

This commit is contained in:
gingerBill
2021-03-29 22:04:54 +01:00
parent 8fcc6ca464
commit e1588c9322
+32 -56
View File
@@ -1,41 +1,30 @@
#ifndef LLVM_USE_NO_EXTRA_PASSES
#define LLVM_USE_NO_EXTRA_PASSES 0
#endif
#ifndef LLVM_USE_BASIC_PASSES
#define LLVM_USE_BASIC_PASSES LLVM_USE_NO_EXTRA_PASSES
#endif
void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) { 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 // NOTE(bill): Treat -opt:3 as if it was -opt:2
// TODO(bill): Determine which opt definitions should exist in the first place // TODO(bill): Determine which opt definitions should exist in the first place
optimization_level = gb_clamp(optimization_level, 0, 2); optimization_level = gb_clamp(optimization_level, 0, 2);
if (LLVM_USE_BASIC_PASSES) {
optimization_level = 0;
}
if (!ignore_memcpy_pass) { if (!ignore_memcpy_pass) {
LLVMAddMemCpyOptPass(fpm); LLVMAddMemCpyOptPass(fpm);
} }
LLVMAddPromoteMemoryToRegisterPass(fpm);
LLVMAddMergedLoadStoreMotionPass(fpm);
LLVMAddEarlyCSEPass(fpm);
// LLVMAddEarlyCSEMemSSAPass(fpm);
LLVMAddConstantPropagationPass(fpm);
LLVMAddMergedLoadStoreMotionPass(fpm);
LLVMAddPromoteMemoryToRegisterPass(fpm);
LLVMAddCFGSimplificationPass(fpm);
// LLVMAddSLPVectorizePass(fpm);
// LLVMAddLoopVectorizePass(fpm);
// LLVMAddScalarizerPass(fpm);
// LLVMAddLoopIdiomPass(fpm);
if (optimization_level == 0) { if (optimization_level == 0) {
LLVMAddPromoteMemoryToRegisterPass(fpm);
LLVMAddMergedLoadStoreMotionPass(fpm);
LLVMAddEarlyCSEPass(fpm);
// LLVMAddEarlyCSEMemSSAPass(fpm);
LLVMAddConstantPropagationPass(fpm);
LLVMAddMergedLoadStoreMotionPass(fpm);
LLVMAddPromoteMemoryToRegisterPass(fpm);
LLVMAddCFGSimplificationPass(fpm);
// LLVMAddSLPVectorizePass(fpm);
// LLVMAddLoopVectorizePass(fpm);
// LLVMAddScalarizerPass(fpm);
// LLVMAddLoopIdiomPass(fpm);
return; return;
} }
#if 0
LLVMAddSCCPPass(fpm); LLVMAddSCCPPass(fpm);
LLVMAddPromoteMemoryToRegisterPass(fpm); LLVMAddPromoteMemoryToRegisterPass(fpm);
@@ -45,6 +34,7 @@ void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcp
// LLVMAddScalarReplAggregatesPass(fpm); // LLVMAddScalarReplAggregatesPass(fpm);
LLVMAddEarlyCSEPass(fpm); LLVMAddEarlyCSEPass(fpm);
LLVMAddLowerExpectIntrinsicPass(fpm); LLVMAddLowerExpectIntrinsicPass(fpm);
#endif
} }
void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) { void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) {
@@ -101,35 +91,31 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimizati
void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level) { void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level) {
LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate();
// NOTE(bill): Treat -opt:3 as if it was -opt:2 // NOTE(bill): Treat -opt:3 as if it was -opt:2
// TODO(bill): Determine which opt definitions should exist in the first place // TODO(bill): Determine which opt definitions should exist in the first place
optimization_level = gb_clamp(optimization_level, 0, 2); optimization_level = gb_clamp(optimization_level, 0, 2);
LLVMAddAnalysisPasses(target_machine, mpm); if (optimization_level >= 2) {
LLVMPassManagerBuilderPopulateModulePassManager(pmb, mpm); // NOTE(bill, 2021-03-29: use this causes invalid code generation)
LLVMPassManagerBuilderPopulateLTOPassManager(pmb, mpm, false, true); // LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate();
LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level); // LLVMPassManagerBuilderPopulateModulePassManager(pmb, mpm);
LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level); // LLVMPassManagerBuilderPopulateLTOPassManager(pmb, mpm, false, true);
// LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level);
if (LLVM_USE_BASIC_PASSES) { // LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level);
optimization_level = 0;
}
if (LLVM_USE_NO_EXTRA_PASSES) {
return;
} }
LLVMAddAlwaysInlinerPass(mpm); LLVMAddAlwaysInlinerPass(mpm);
LLVMAddStripDeadPrototypesPass(mpm); LLVMAddStripDeadPrototypesPass(mpm);
LLVMAddAnalysisPasses(target_machine, mpm);
LLVMAddPruneEHPass(mpm); LLVMAddPruneEHPass(mpm);
if (optimization_level == 0) { if (optimization_level == 0) {
// LLVMAddMergeFunctionsPass(mpm);
return; return;
} }
LLVMAddGlobalDCEPass(mpm); LLVMAddGlobalDCEPass(mpm);
LLVMAddIPSCCPPass(mpm); LLVMAddIPSCCPPass(mpm);
LLVMAddCalledValuePropagationPass(mpm); LLVMAddCalledValuePropagationPass(mpm);
@@ -141,13 +127,14 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddCFGSimplificationPass(mpm); LLVMAddCFGSimplificationPass(mpm);
LLVMAddPruneEHPass(mpm); LLVMAddPruneEHPass(mpm);
LLVMAddFunctionInliningPass(mpm); if (optimization_level < 2) {
return;
}
// if (optimization_level > 2) { LLVMAddFunctionInliningPass(mpm);
// LLVMAddArgumentPromotionPass(mpm);
// }
lb_add_function_simplifcation_passes(mpm, optimization_level); lb_add_function_simplifcation_passes(mpm, optimization_level);
LLVMAddGlobalDCEPass(mpm);
LLVMAddGlobalOptimizerPass(mpm); LLVMAddGlobalOptimizerPass(mpm);
// LLVMAddLowerConstantIntrinsicsPass(mpm); // LLVMAddLowerConstantIntrinsicsPass(mpm);
@@ -181,17 +168,6 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
} }
LLVMAddCFGSimplificationPass(mpm); LLVMAddCFGSimplificationPass(mpm);
#if 0
#endif
#if 0
LLVMAddAlwaysInlinerPass(mpm);
LLVMAddStripDeadPrototypesPass(mpm);
LLVMAddAnalysisPasses(target_machine, mpm);
if (optimization_level >= 2) {
LLVMAddArgumentPromotionPass(mpm);
LLVMAddConstantMergePass(mpm);
LLVMAddGlobalDCEPass(mpm);
LLVMAddDeadArgEliminationPass(mpm);
}
#endif
} }