위를 참조하십시오. 나는 샘플 기능에 쓴 : 왜 그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
}
이다 나는,555,533 그
opt -O3 source[-fp].ll -o opt.source[-fp].ll -S
를 사용하여 두 기능을 최적화 할 때3210은 최적화되었지만 double
은 최적화되지 않습니까? fadd
이 하나의 fmul
에 결합 될 것으로 예상됩니다. 대신 정확히 똑같아 보입니다.
플래그가 다르게 설정 되었기 때문입니까? double
에 대해 수행 할 수없는 i32
에 대해 가능한 특정 최적화에 대해 알고 있습니다. 그러나 간단한 상수 폴딩의 부재는 나의 이해를 넘어서는 것이다.
저는 LLVM 3.1을 사용하고 있습니다.
GCC가 왜 * a * a * a *를 (a * a * a) * (a * a * a)로 최적화하지 않는지 확실하지 않지만 관련성이 높습니다.)?] (http://stackoverflow.com/q/6430448/395760) – delnan
@delan 비슷한 부동 소수점 질문과 마찬가지로, 실제로 이것은 중복입니다. 질문의 세부 사항이 다를지라도 답은 동일합니다. 이 질문에 대한 좋은 대답은 부동 소수점 산술의 비 연관성과 언급 - 양적 수학을 지적 할 것입니다. –
감사합니다. 링크 된 질문에 대한 대답은 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html에서 찾아 볼 수 있으며 모호성에 대한 섹션을 강조합니다. – f00id