¿Por qué GCC no optimiza a * a * a * a * a * a a (a * a * a) * (a * a * a)?

Estoy haciendo una optimización numérica en una aplicación científica. Una cosa que noté es que GCC optimizará la llamadapow(a,2) compilándolo ena*a, pero la llamadapow(a,6) no está optimizado y en realidad llamará a la función de bibliotecapow, lo que ralentiza enormemente el rendimiento. (A diferencia de,ompilador @Intel C ++, ejecutableicc, eliminará la llamada a la biblioteca parapow(a,6).)

Lo que me interesa es que cuando reemplacépow(a,6) cona*a*a*a*a*a usando GCC 4.5.1 y las opciones "-O3 -lm -funroll-loops -msse4 ", utiliza 5mulsd instrucciones:

movapd  %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13

mientras escribo(a*a*a)*(a*a*a), producirá

movapd  %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm13, %xmm13

que reduce el número de instrucciones de multiplicación a 3.icc tiene un comportamiento similar.

¿Por qué los compiladores no reconocen este truco de optimización?

Respuestas a la pregunta(12)

Su respuesta a la pregunta