見上。我寫信給樣本功能:爲什麼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