http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55673
Bug #: 55673
Summary: [SPARC] Transposed before-after in
sparc_emit_membar_for_model()
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: tomash.brec...@gmail.com
As for other architectures (compare with need_atomic_barrier_p() for instance),
in gcc/config/sparc/sparc.c:sparc_emit_membar_for_model() memory barrier for
ACQUIRE should be emitted _after_ the operation and memory barrier for RELEASE
should be emitted _before_ the operation, i.e.:
diff --git i/gcc/config/sparc/sparc.c w/gcc/config/sparc/sparc.c
index 4e9de98..fdc6374 100644
--- i/gcc/config/sparc/sparc.c
+++ w/gcc/config/sparc/sparc.c
@@ -11188,7 +11188,7 @@ sparc_emit_membar_for_model (enum memmodel model,
gcc_unreachable ();
}
- if (before_after & 1)
+ if (before_after & 2)
{
if (model == MEMMODEL_ACQUIRE
|| model == MEMMODEL_ACQ_REL
@@ -11200,7 +11200,7 @@ sparc_emit_membar_for_model (enum memmodel model,
mm |= StoreLoad | StoreStore;
}
}
- if (before_after & 2)
+ if (before_after & 1)
{
if (model == MEMMODEL_RELEASE
|| model == MEMMODEL_ACQ_REL