【发布时间】:2018-10-06 23:15:30
【问题描述】:
考虑这个例子:
volatile unsigned int x;
unsigned int y;
void f() {
x /= 2;
}
void g() {
y /= 2;
}
当使用 -Os 编译时,clang-6.0 在 x64 上为 f 和 g 生成相同的 shrl <offset>(%rip) 指令模式(参见 https://godbolt.org/g/hUPprL),而 gcc-7.3 为 f() 生成这个(参见 https://godbolt.org/g/vMcKVV) :
mov 0x200b67(%rip),%eax # 601034 <x>
shr %eax
mov %eax,0x200b5f(%rip) # 601034 <x>
这只是错过的优化还是 gcc 有理由拒绝 shrl <offset>(%rip) 在易失性访问的情况下?谁错了?
【问题讨论】:
-
如果它们都正常工作,那么它们都没有错,它们只是不同。
-
@PasserBy:我认为 OP 知道这一点,他在问这是否是一个错过的优化。
-
谢谢迈克尔。如果两者都产生相同的行为,那么 gcc 就会暴露一个“错过优化错误”,因为它清楚地知道如何对 'y/=2' 进行大小优化。
标签: c++ gcc assembly clang volatile