这个问题已经在这里有一个答案:
- 为什么不GCC优化A * A * A * A * A * A到(A * A * A)*(A * A * A)? 12个回答
往上看。 我写信给样品的功能:
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
得到合并到一个单一的fmul
。 相反,它看起来完全一样。
它是由于被设置的标志不同? 我知道某些优化是可能的i32
这是不可行的double
。 但由于没有简单的常量折叠超出了我的理解。
我使用LLVM 3.1。