int f(int x, int y) {
return 20 * (x - 10) + 50 * (x + 5);
}
int f_expected(int x, int y) {
return 70 * x + 50;
}
f(int, int):
lea eax, [rdi-50+rdi*4]
add edi, 5
imul edi, edi, 50
lea eax, [rdi+rax*4]
ret
f_expected(int, int):
imul eax, edi, 70
add eax, 50
ret
Я ожидаю, что f
будет скомпилирован в f_expected
. Я попробовал -O3
и -Ofast
в GCC 7. Какой именно флаг мне нужен (если есть)? clang и icc выдают ожидаемый код под -O3
.
Для справки, clang code:
f(int, int):
imul eax, edi, 70
add eax, 50
ret
f_expected(int, int):
imul eax, edi, 70
add eax, 50
ret
-fwrapv
— да, флаг, который запрещает некоторые оптимизации. - person harold   schedule 01.04.2017This flag enables some optimizations and disables others
. Без особого фона это кажется мне естественным (либо: A мы предполагаем какое-то математическое поведение / нет, либо B мы предполагаем одно из двух разных математических действий; я не уверен, в чем здесь дело, очевидно, что B) указывает скорее на тип включения некоторого; отключить другие вещи) - person sascha   schedule 01.04.2017-fsanitize=undefined
. Оптимизация действительна, но может быть выполнена только на низком уровне. Иногда обсуждают возможность автоматического включения-fwrapv
во время последних проходов оптимизации. - person Marc Glisse   schedule 04.11.2018