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çã

questionAnswers(12)

yourAnswerToTheQuestion