optコマンド
optコマンドの最適化をひとつずつ試してみたいが、いまひとつ意味がわからないのが多い。とりあえず、標準的なものをひととおりやってくれそうな'-std-compile-opts'を試す。
sample.cpp
int foo() { int i = 5; int ret; if(i <= 5) { ret = 333; } else { ret = 999; } return ret; }
command line
llvm-gcc -O0 -S -emit-llvm sample.cpp -o sample.ll llvm-as sample.ll -o sample.bc -f opt -std-compile-opts -debug-pass=Arguments sample.bc -o sample-after.bc -f llvm-dis sample-after.bc -o sample-after.ll -f
sample.ll
; ModuleID = 'sample.cpp' target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" target triple = "i386-pc-linux-gnu" define i32 @_Z3foov() nounwind { entry: %retval = alloca i32 ;[#uses=2] %ret = alloca i32 ; [#uses=3] %i = alloca i32 ; [#uses=2] %0 = alloca i32 ; [#uses=2] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] store i32 5, i32* %i, align 4 %1 = load i32* %i, align 4 ; [#uses=1] %2 = icmp sle i32 %1, 5 ; [#uses=1] br i1 %2, label %bb, label %bb1 bb: ; preds = %entry store i32 333, i32* %ret, align 4 br label %bb2 bb1: ; preds = %entry store i32 999, i32* %ret, align 4 br label %bb2 bb2: ; preds = %bb1, %bb %3 = load i32* %ret, align 4 ; [#uses=1] store i32 %3, i32* %0, align 4 %4 = load i32* %0, align 4 ; [#uses=1] store i32 %4, i32* %retval, align 4 br label %return return: ; preds = %bb2 %retval3 = load i32* %retval ; [#uses=1] ret i32 %retval3 }
sample-after.ll
; ModuleID = 'sample-after.bc' target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" target triple = "i386-pc-linux-gnu" define i32 @_Z3foov() nounwind readnone { entry: ret i32 333 }
以下の最適化がセットで実行された結果らしい。どれが実際に聞いた結果なのかよくわからない・・・
Pass Arguments: -preverify -domtree -verify -lowersetjmp -raiseallocs -simplifycfg -domtree -domfrontier -mem2reg -globalopt -globaldce -ipconstprop -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -functionattrs -inline -argpromotion -simplify-libcalls -instcombine -jump-threading -simplifycfg -domtree -domfrontier -scalarrepl -instcombine -break-crit-edges -condprop -tailcallelim -simplifycfg -reassociate -domtree -loops -loopsimplify -domfrontier -scalar-evolution -lcssa -loop-rotate -licm -lcssa -loop-unswitch -scalar-evolution -lcssa -loop-index-split -instcombine -scalar-evolution -lcssa -indvars -scalar-evolution -lcssa -loop-deletion -domfrontier -lcssa -loop-unroll -instcombine -memdep -gvn -memdep -memcpyopt -sccp -instcombine -break-crit-edges -condprop -domtree -memdep -dse -adce -simplifycfg -strip-dead-prototypes -print-used-types -deadtypeelim -constmerge -preverify -domtree -verify