[英]clang vs gcc: different code for volatile access
考虑这个例子:
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生成此(请参阅https://godbolt.org/g/vMcKVV )获取f():
mov 0x200b67(%rip),%eax # 601034 <x>
shr %eax
mov %eax,0x200b5f(%rip) # 601034 <x>
这只是一个错过的优化还是有理由让gcc在易失性访问的情况下拒绝shrl <offset>(%rip)
? 谁错了?
这只是gcc错过的优化。 两种实现都精确地保留了对x
的读取和写入,因此是正确的。
操作内存操作数的“引擎盖下”执行与较长实现相同的加载和存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.