见上。我写信给样本功能:为什么LLVM不通过优化浮点指令?
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
的同时优化功能3210得到优化,但double
一个不?我预计fadd
将合并为一个fmul
。相反,它看起来完全一样。
这是由于标志设置不同吗?我知道i32
可能对double
不可行的某些优化。但是缺乏简单的不断折叠是我无法理解的。
我正在使用LLVM 3.1。
高度相关,虽然我不确定它是否是重复的:[为什么不GCC优化a * a * a * a * a到(a * a * a)*(a * a * a )?](http://stackoverflow.com/q/6430448/395760) – delnan 2012-08-13 21:33:28
@delan这与许多类似的浮点问题一样,确实是重复的。即使问题的细节有所不同,答案也是一样的。这个问题的任何好的答案都会指出浮点算术和提及 - 数学 - 数学的非关联性,就像这个问题的接受答案一样。 – 2012-08-13 21:41:40
谢谢你们两位。链接问题的答案提出了http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html,并强调了其中的歧义部分。 – f00id 2012-08-13 21:44:27