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