首页 > 解决方案 > gcc 不会合并连续的栅栏

问题描述

对于这段简单的代码

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 的优化器无法捕捉和消除额外的栅栏的问题,还是我遗漏了什么?

顺便说一句,clang 似乎可以处理相邻的栅栏。

标签: c++optimizationmemory-barriersmemory-model

解决方案


是的,它没有,我已经和不同的人争论了一段时间。对于像我这样的外部观察者来说,效果是它被视为atomicvolatile而标准并不要求它。我无法在标准中找到对此的要求。

但是,它也可能是缺少优化的简单情况。


推荐阅读