【发布时间】:2020-10-10 17:34:04
【问题描述】:
由于有符号整数溢出是未定义的行为,我希望下面的三个函数编译为相同或相似的程序集。然而事实并非如此。 test2 与 test1 略有不同,test3 使用两个 imul 指令,其他示例不需要。
int test1(int x)
{
return x * 5 / 2;
}
int test2(int x)
{
return x * 10 / 4;
}
int test3(int x)
{
return x * 50 / 20;
}
comparison on compiler explorer
编译器不执行这种优化是否有原因?
【问题讨论】:
-
我认为正式的 C++ 规范本身没有任何东西可以阻止这种优化。我认为这就像“以前没有人想到过”一样简单,可以尝试对整数乘法和除法进行微优化,以找到一些数学上相同的序列,其乘法和除法步骤可以通过优化的机器语言完成说明。
-
如果这两个因素抵消为整数值,则执行您期望的优化。我不确定舍入除法是否会表现不同,或者编译器是否无法证明它没有。
-
我怀疑这与 GCC 支持包装有符号整数溢出有关。这不是 C 标准所要求的,但在 GCC 文档中有所提及。
x * 5 / 2、x * 10 / 4和x * 50 / 20在存在溢出的情况下会产生不同的结果,因此它们无法针对相同的代码进行优化。 -
@WeatherVane 这不一定是为了避免溢出。如果 GCC 有明确定义的有符号溢出,那么它必须确保它总是表现得好像确实发生了溢出一样。
-
欢迎补丁。优化只在编译器中进行,因为有人有动机实现了它们。
标签: c++ c compiler-optimization