繁体   English   中英

clang vs gcc:不同的易失性访问代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM