本文介绍如何使用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/
下找到测试代码。