aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_opt.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-11-06 17:23:33 +0000
committergingerBill <bill@gingerbill.org>2021-11-06 17:23:33 +0000
commit3d3785a7f1535cfa213f074704085f42ae02638a (patch)
treef7387a64a44d747b02b3a1ff481e9cbbd969abd2 /src/llvm_backend_opt.cpp
parent5df15b5724e1c25366d39b4bbb2f24b33068d5f6 (diff)
Remove many LLVM optimization passes which were causes UB due to them assuming C-like behaviour incompatible with Odin
Diffstat (limited to 'src/llvm_backend_opt.cpp')
-rw-r--r--src/llvm_backend_opt.cpp80
1 files changed, 53 insertions, 27 deletions
diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp
index 6c947dcae..94efe793f 100644
--- a/src/llvm_backend_opt.cpp
+++ b/src/llvm_backend_opt.cpp
@@ -1,3 +1,36 @@
+/**************************************************************************
+
+ IMPORTANT NOTE(bill, 2021-11-06): Regarding Optimization Passes
+
+ A lot of the passes taken here have been modified with what was
+ partially done in LLVM 11.
+
+ Passes that CANNOT be used by Odin due to C-like optimizations which
+ are not compatible with Odin:
+
+ LLVMAddCorrelatedValuePropagationPass
+ LLVMAddAggressiveInstCombinerPass
+ LLVMAddInstructionCombiningPass
+ LLVMAddIndVarSimplifyPass
+ LLVMAddLoopUnrollPass
+ LLVMAddEarlyCSEMemSSAPass
+ LLVMAddGVNPass
+
+ Odin does not allow poison-value based optimizations.
+
+ For example, *-flowing integers in C is "undefined behaviour" and thus
+ many optimizers, including LLVM, take advantage of this for a certain
+ class of optimizations. Odin on the other hand defines *-flowing
+ behaviour to obey the rules of 2's complement, meaning wrapping is a
+ expected. This means any outputted IR containing the following flags
+ may cause incorrect behaviour:
+
+ nsw (no signed wrap)
+ nuw (no unsigned wrap)
+ poison (poison value)
+**************************************************************************/
+
+
void lb_populate_function_pass_manager(lbModule *m, 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);
@@ -33,10 +66,10 @@ void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm) {
LLVM_ADD_CONSTANT_VALUE_PASS(fpm);
LLVMAddEarlyCSEPass(fpm);
- LLVM_ADD_CONSTANT_VALUE_PASS(fpm);
- LLVMAddMergedLoadStoreMotionPass(fpm);
- LLVMAddPromoteMemoryToRegisterPass(fpm);
- LLVMAddCFGSimplificationPass(fpm);
+ // LLVM_ADD_CONSTANT_VALUE_PASS(fpm);
+ // LLVMAddMergedLoadStoreMotionPass(fpm);
+ // LLVMAddPromoteMemoryToRegisterPass(fpm);
+ // LLVMAddCFGSimplificationPass(fpm);
}
void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) {
@@ -61,6 +94,7 @@ void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool
LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level);
LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm);
#else
+ LLVMAddMemCpyOptPass(fpm);
lb_basic_populate_function_pass_manager(fpm);
LLVMAddSCCPPass(fpm);
@@ -116,17 +150,10 @@ void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef
}
void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) {
- LLVMAddEarlyCSEMemSSAPass(mpm);
-
- LLVMAddGVNPass(mpm);
LLVMAddCFGSimplificationPass(mpm);
LLVMAddJumpThreadingPass(mpm);
- // if (optimization_level > 2) {
- // LLVMAddAggressiveInstCombinerPass(mpm);
- // }
- LLVMAddInstructionCombiningPass(mpm);
LLVMAddSimplifyLibCallsPass(mpm);
LLVMAddTailCallEliminationPass(mpm);
@@ -138,23 +165,16 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimizati
LLVMAddLoopUnswitchPass(mpm);
LLVMAddCFGSimplificationPass(mpm);
- LLVMAddInstructionCombiningPass(mpm);
- LLVMAddIndVarSimplifyPass(mpm);
LLVMAddLoopIdiomPass(mpm);
LLVMAddLoopDeletionPass(mpm);
- LLVMAddLoopUnrollPass(mpm);
-
LLVMAddMergedLoadStoreMotionPass(mpm);
- LLVMAddGVNPass(mpm);
-
LLVMAddMemCpyOptPass(mpm);
LLVMAddSCCPPass(mpm);
LLVMAddBitTrackingDCEPass(mpm);
- LLVMAddInstructionCombiningPass(mpm);
LLVMAddJumpThreadingPass(mpm);
LLVM_ADD_CONSTANT_VALUE_PASS(mpm);
LLVMAddDeadStoreEliminationPass(mpm);
@@ -163,7 +183,6 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimizati
LLVMAddLoopRerollPass(mpm);
LLVMAddAggressiveDCEPass(mpm);
LLVMAddCFGSimplificationPass(mpm);
- LLVMAddInstructionCombiningPass(mpm);
}
@@ -191,6 +210,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
// LLVMPassManagerBuilderPopulateLTOPassManager(pmb, mpm, false, true);
// return;
}
+
LLVMAddIPSCCPPass(mpm);
LLVMAddCalledValuePropagationPass(mpm);
@@ -198,8 +218,6 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddGlobalOptimizerPass(mpm);
LLVMAddDeadArgEliminationPass(mpm);
- // LLVMAddConstantMergePass(mpm); // ???
- LLVMAddInstructionCombiningPass(mpm);
LLVMAddCFGSimplificationPass(mpm);
LLVMAddPruneEHPass(mpm);
@@ -208,25 +226,24 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
}
LLVMAddFunctionInliningPass(mpm);
+
lb_add_function_simplifcation_passes(mpm, optimization_level);
-
+
+
LLVMAddGlobalDCEPass(mpm);
LLVMAddGlobalOptimizerPass(mpm);
-
- // LLVMAddLowerConstantIntrinsicsPass(mpm);
+
LLVMAddLoopRotatePass(mpm);
LLVMAddLoopVectorizePass(mpm);
-
- LLVMAddInstructionCombiningPass(mpm);
+
if (optimization_level >= 2) {
LLVMAddEarlyCSEPass(mpm);
LLVM_ADD_CONSTANT_VALUE_PASS(mpm);
LLVMAddLICMPass(mpm);
LLVMAddLoopUnswitchPass(mpm);
LLVMAddCFGSimplificationPass(mpm);
- LLVMAddInstructionCombiningPass(mpm);
}
LLVMAddCFGSimplificationPass(mpm);
@@ -246,6 +263,15 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddCFGSimplificationPass(mpm);
}
+
+
+/**************************************************************************
+ IMPORTANT NOTE(bill, 2021-11-06): Custom Passes
+
+ The procedures below are custom written passes to aid in the
+ optimization of Odin programs
+**************************************************************************/
+
void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
isize removal_count = 0;
isize pass_count = 0;