Этот вопрос частично является следующим вопросом: GCC 5.1 Loop unrolling.Реактивное поведение в GCC
Согласно GCC documentation, и, как указано в моем ответе на поставленный вопрос, флаги, такие как -funroll-loops
очередь на «полного пилинга петли (т.е. полного удаления петель с малым постоянным числом итераций)». Поэтому, когда такой флаг включен, компилятор может выбрать разворачивание цикла, если он определит, что это оптимизирует выполнение данного фрагмента кода.
Тем не менее, в одном из моих проектов я заметил, что GCC иногда разворачивает циклы , хотя соответствующие флаги не были включены. Например, рассмотрим следующий простой фрагмент кода:
int main(int argc, char **argv)
{
int k = 0;
for(k = 0; k < 5; ++k)
{
volatile int temp = k;
}
}
При компиляции с -O1
, цикл развернутого и следующий код сборки генерируется с любой современной версией GCC:
main:
movl $0, -4(%rsp)
movl $1, -4(%rsp)
movl $2, -4(%rsp)
movl $3, -4(%rsp)
movl $4, -4(%rsp)
movl $0, %eax
ret
Даже когда компиляция с дополнительным -fno-unroll-loops -fno-peel-loops
, чтобы убедиться, что флаги отключен, GCC неожиданно выполняет цикл разворачивания по описанному выше примеру.
Это наблюдение приводит меня к следующим тесно связанным вопросам. Почему GCC выполняет разворот цикла, даже если флаги, соответствующие этому поведению, отключены? Развертывание также контролируется другими флагами, которые могут заставить компилятор развернуть цикл в некоторых случаях, хотя -funroll-loops
отключен? Есть ли способ полностью отключить разворот цикла в GCC (часть от компиляции с -O0
)?
Интересно Clang компилятор имеет ожидаемое поведение здесь, и, кажется, только выполнять разворачивая когда -funroll-loops
включена, а не в других случаях.
Заранее спасибо, любые дополнительные сведения по этому вопросу были бы очень признательны!
Поздравляем. Вы обнаружили, что разные компиляторы отличаются поведением и что флаги, которые вы передаете им, не всегда означают то, что, по вашему мнению, они имеют в виду. Добро пожаловать в реальный мир. –
Разве это нарушает функциональность вашей программы? – Serge
Нет, это не нарушает функциональность. Это больше вопрос общего интереса к тому, как GCC выполняет цикл разворачивания и как настраивать это поведение. – Pyves