Я делаю некоторую численную оптимизацию в научном приложении. Я заметил, что GCC оптимизирует вызов pow(a,2), компилируя его в a*a, но вызов pow(a,6) не оптимизирован и фактически вызовет библиотечную функцию pow, что значительно замедляет производительность. (Напротив, Компилятор Intel С++, исполняемый 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
while, если я напишу (a*a*a)*(a*a*a), он произведет
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
который уменьшает количество команд умножения до 3. icc имеет схожее поведение.
Почему компиляторы не признают этот трюк оптимизации?