c++ - gcc 不合并连续的栅栏

标签 c++ optimization memory-barriers memory-model

对于这段简单的代码

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 似乎可以处理相邻的栅栏。

最佳答案

是的,它不是,我已经和不同的人争论了一段时间。对于像我这样的外部观察者来说,效果是它将 atomic 视为 volatile,而标准并不要求它。我在标准中找不到这方面的要求。

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

关于c++ - gcc 不合并连续的栅栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55620073/

相关文章:

c++ - 在模板中实例化模板对象

c++ - Poco - 无法打开应用程序日志导致子系统关闭失败

algorithm - 根据给定的标准找到图中两个节点之间的路径 - 优化任务

c++ - GCC优化isnan(x)是否可行|| isnan(y) 变成 isunordered(x, y)?

mysql - Magento 碎片表

c++ - 具有多个模板说明符的函数

c++ - 顺序异构函数执行器

c++ - 线程同步101

opengl - GLSL 内存屏障()

assembly - 为什么(或不是?)SFENCE + LFENCE 等价于 MFENCE?