本文介绍如何使用opt工具优化llvm ir。
使用之前编写的代码 multiply.c
int mult() { |
执行命令
clang -emit-llvm -S multiply.c -o multiply.ll |
生成 multiply.ll
; ModuleID = 'multiply.c' |
执行命令:
opt -mem2reg -S multiply.ll -o multiply1.ll |
输出 multiply1.ll
; ModuleID = 'multiply.ll' |
我在mac上执行的,不知道为什么结果和书上的不一致,这个优化好像并没有生效。
其他的优化选项还有
adce: Aggressive Dead Code Eliminationbb-vectorize: Basic-Block Vectorizationconstprop: Simple constant propagationdce: Dead Code Eliminationdeadargelim: Dead Argument Eliminationglobaldce: Dead Global Eliminationglobalopt: Global Variable Optimizergvn: Global Value Numberinginline: Function Integration/Inlininginstcombine: Combine redundant instructionslicm: Loop Invariant Code Motionloop: unswitch: Unswithch Looploweratomic: Lower atomic intrinsics to non-atomic formlowerinvoke: Lower invokes to calls, for unwindless code generatorslowerswitch: Lower SwithcInsts to branchesmem2reg: Promote Memory to Registrymemcpyopt: MemCpy Optimizationsimplifycfg: Simplify the CFGsink: Code sinkingtailcallelim: Tail Call Elimination
可以在源码目录 test/Transforms/ 下找到测试代码。