Нет, похоже, нет способа сказать gcc сделать это переупорядочение в -O0
. Управляется флагом -freorder-blocks
:
$ g++ -O 1.c -S -o- | egrep '(ret|call.*logic_error)'
ret
call _ZNSt11logic_errorC1EPKc@PLT
и с -fno-reorder-blocks
мы получаем поведение -O0
:
$ g++ -O -fno-reorder-blocks 1.c -S -o- | egrep '(ret|call.*logic_error)'
call _ZNSt11logic_errorC1EPKc@PLT
ret
Но флаг действует только в том случае, если оптимизация включена. Вот соответствующая часть из gcc/bb-reorder.c
(метод gate
прохода указывает, выполнен он или нет):
virtual bool gate (function *)
{
if (targetm.cannot_modify_jumps_p ())
return false;
return (optimize > 0
&& (flag_reorder_blocks || flag_reorder_blocks_and_partition));
}
И действительно, прохождение -freorder-blocks
без -O[123s]
не имеет никакого эффекта.
AFAIK, это относится к большинству проходов оптимизации. Я не знаю, есть ли причина, по которой пользователь не может выполнить эту оптимизацию на -O0
. Вы можете попробовать настроить приведенный выше код и создать собственную версию gcc, чтобы выяснить это; -)
Кроме того, может быть способ обмануть gcc в создании кода, который вы хотите, но я понятия не имею, как это сделать.