GCC не объединяет последовательные заборы - PullRequest
1 голос
/ 10 апреля 2019

Для этого простого куска кода

std::atomic_int i;
void foo() {
    i.store(1);
    i.store(2);
}

gcc создает следующую сборку для ARM:

movw    r3, #:lower16:.LANCHOR0
movt    r3, #:upper16:.LANCHOR0
dmb ish
mov r1, #1
mov r2, #2
str r1, [r3]
dmb ish
dmb ish               ; why is this not eliminated?
str r2, [r3]
dmb ish
bx  lr

Вы можете заметить, что в центре образуется повторяющийся забор, который кажется излишним. Проблема в том, что оптимизатор gcc не может поймать и устранить лишние ограждения или я что-то упустил?

Кстати, лязг, кажется, обрабатывает смежные заборы.

1 Ответ

2 голосов
/ 10 апреля 2019

Да, нет, и я уже некоторое время обсуждаю это с разными людьми.Для такого внешнего наблюдателя, как я, эффект заключается в том, что он воспринимает atomic как volatile, тогда как стандарт не требует этого.Мне не удалось найти требования для этого в стандарте.

Однако это также может быть простой случай отсутствия оптимизации.

...