上記を参照。私はサンプル関数に書きました:
source.ll:
define i32 @bleh(i32 %x) {
entry:
%addtmp = add i32 %x, %x
%addtmp1 = add i32 %addtmp, %x
%addtmp2 = add i32 %addtmp1, %x
%addtmp3 = add i32 %addtmp2, %x
%addtmp4 = add i32 %addtmp3, 1
%addtmp5 = add i32 %addtmp4, 2
%addtmp6 = add i32 %addtmp5, 3
%multmp = mul i32 %x, 3
%addtmp7 = add i32 %addtmp6, %multmp
ret i32 %addtmp7
}
source-fp.ll:
define double @bleh(double %x) {
entry:
%addtmp = fadd double %x, %x
%addtmp1 = fadd double %addtmp, %x
%addtmp2 = fadd double %addtmp1, %x
%addtmp3 = fadd double %addtmp2, %x
%addtmp4 = fadd double %addtmp3, 1.000000e+00
%addtmp5 = fadd double %addtmp4, 2.000000e+00
%addtmp6 = fadd double %addtmp5, 3.000000e+00
%multmp = fmul double %x, 3.000000e+00
%addtmp7 = fadd double %addtmp6, %multmp
ret double %addtmp7
}
両方の関数を使用して最適化すると、なぜですか
opt -O3 source[-fp].ll -o opt.source[-fp].ll -S
最適化されi32
ますが、最適化されdouble
ませんか?fadd
が1つに結合されることを期待していましたfmul
。代わりに、まったく同じように見えます。
フラグの設定が違うためですか?私は、のために可能であり、のために実行できi32
ない特定の最適化を知っていdouble
ます。しかし、単純な定数畳み込みがないことは、私の理解を超えています。
LLVM3.1を使用しています。