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 точно, и, следовательно, являются правильными.

Операция "под капотом" с операндом памяти выполняет те же нагрузки и сохраняет, что и более длинная реализация.

Другие вопросы по тегам