12
GCC为什么不将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?
我正在对科学应用程序进行一些数值优化。我注意到的一件事是,GCC将pow(a,2)通过将其编译为来优化该调用a*a,但是该调用pow(a,6)并未进行优化,实际上将调用该库函数pow,这大大降低了性能。(相反,可执行文件Intel C ++编译器icc将消除对的库调用pow(a,6)。) 我很好奇的是,当我替换pow(a,6)为a*a*a*a*a*a使用GCC 4.5.1和选项“ -O3 -lm -funroll-loops -msse4”时,它使用5 mulsd条指令: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 而如果我写(a*a*a)*(a*a*a),它将产生 movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm13, %xmm13 这将乘法指令的数量减少到3. icc具有相似的行为。 为什么编译器无法识别此优化技巧?