GCC не выполняет движение инвариантного кода цикла

Я решил проверить результат оптимизации движения инвариантного кода цикла с помощью g ++. Тем не менее, когда я скомпилировал следующий код с -fmove-loop-invariants и проанализировав его сборку, я увидел что k + 17 Расчет по-прежнему выполняется в теле цикла.

Что может помешать компилятору оптимизировать его?

Может быть, компилятор приходит к выводу, что более эффективно пересчитать k + 17?

int main()
{
int k = 0;
std::cin >> k;

for (int i = 0; i < 10000; ++i)
{
int n = k + 17; // not moved out of the loop
printf("%d\n", n);
}

return 0;
}

Пытался g++ -O0 -fmove-loop-invariants, g++ -O3 а также g++ -O3 -fmove-loop-invariants используя g ++ 4.6.3 и g ++ 4.8.3.

3

Решение

РЕДАКТИРОВАТЬ: Игнорировать мой предыдущий ответ. Вы можете видеть, что расчет свернут в константу. Поэтому это является выполнение цикла инвариантной оптимизации.


Из-за как будто правило. Проще говоря, компилятору не разрешается делать какие-либо оптимизации, которые могут повлиять на наблюдаемое поведение программы, в этом случае printf, Вы можете увидеть, что произойдет, если вы делаете n летучий и удалить printf:

for (int i = 0; i < 10000; ++i)
{
volatile int n = k + 17; // not moved out of the loop
}

// Example assembly output for GCC 4.6.4
// ...
movl    $10000, %eax
addl    $17, %edx
.L2:
subl    $1, %eax
movl    %edx, 12(%rsp)
// ...
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]