On Thu, 8 Jun 2017, Alexander Monakov wrote:
> Ping^3.

Ping^4: https://gcc.gnu.org/ml/gcc-patches/2017-05/msg00782.html

This is a wrong-code issue with C11 atomics: even if no machine barrier is
needed for a given fence type on this architecture, a compiler barrier must
be present in RTL.

Alternatively, it's possible to have a more complete and future-proof solution
by explicitly emitting a compiler barrier from the middle-end, leaving it up
to the backend to emit a machine barrier if needed.  The following patch could
achieve that (but at the cost of creating slightly redundant RTL on targets
that always emit some kind of memory barrier).

        * optabs.c (expand_mem_thread_fence): Always emit a compiler barrier
        if using mem_thread_fence expansion.

diff --git a/gcc/optabs.c b/gcc/optabs.c
index 8fd5d91..92080c3 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -6297,7 +6297,11 @@ void
 expand_mem_thread_fence (enum memmodel model)
 {
   if (targetm.have_mem_thread_fence ())
-    emit_insn (targetm.gen_mem_thread_fence (GEN_INT (model)));
+    {
+      emit_insn (targetm.gen_mem_thread_fence (GEN_INT (model)));
+      if (!is_mm_relaxed (model))
+       expand_asm_memory_barrier ();
+    }
   else if (!is_mm_relaxed (model))
     {
       if (targetm.have_memory_barrier ())


Reply via email to