Кажется, что теперь gcc делает: выполняя "gcc -O2 -S" для следующего кода и читая сборку, вызов foo () из test () определяется как чистый и перемещается за пределы цикла:
#include <stdio.h>
double __attribute__((noinline)) foo(double x)
{
x = x + 1;
x = x * x;
if (x > 20)
x -= 1;
x -= x * x;
return x;
}
void test(int iters, double x)
{
int i;
for (i = 0; i < iters; ++i) {
printf("%g\n", foo(x));
}
}
Это Fedora 22, gcc 5.1.1, x86_64.Я не пробовал, но с -flto, я ожидал бы, что это сработает в разных единицах компиляции.
Также стоит отметить, что сегодня gcc имеет параметры командной строки -Wsuggest-attribute = pure и -Wsuggest= соп атрибута по.