clang vs gcc: другой код для нестабильного доступа - PullRequest
0 голосов
/ 26 апреля 2018

Рассмотрим этот пример:

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 Ответ

0 голосов
/ 26 апреля 2018

Это просто пропущенная оптимизация от gcc. Обе реализации сохраняют чтение и запись в x точно и, следовательно, являются правильными.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...