clang vs gcc: другой код для нестабильного доступа
Рассмотрим этот пример:
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)
в случае нестабильного доступа? Кто не прав?
1 ответ
Решение
Это просто пропущенная оптимизация от gcc. Обе реализации сохраняют чтение и запись в x
точно, и, следовательно, являются правильными.
Операция "под капотом" с операндом памяти выполняет те же нагрузки и сохраняет, что и более длинная реализация.