Рассмотрим этот пример:
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)
в случае нестабильного доступа? Кто не прав?