Por que o GCC não otimiza a * a * a * a * a * a para (a * a * a) * (a * a * a)?
Estou fazendo alguma otimização numérica em um aplicativo científico. Uma coisa que notei é que o GCC otimiza a chamadapow(a,2)
compilando-o ema*a
, mas a chamadapow(a,6)
não é otimizado e, na verdade, chama a função de bibliotecapow
, o que diminui bastante o desempenho. (Em contraste,Intel C ++ Compiler, executávelicc
, eliminará a chamada da biblioteca parapow(a,6)
.)
O que estou curioso é que, quando substituípow(a,6)
coma*a*a*a*a*a
usando o GCC 4.5.1 e opções "-O3 -lm -funroll-loops -msse4
", usa 5mulsd
instruções:
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
enquanto eu escrevo(a*a*a)*(a*a*a)
, produzirá
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
que reduz o número de instruções de multiplicação para 3.icc
tem um comportamento semelhante.
Por que os compiladores não reconhecem esse truque de otimizaçã