From 63d6c00c3dad03bd7556057a85016f31e929f0f1 Mon Sep 17 00:00:00 2001 From: Samy Al Bahra Date: Thu, 7 May 2015 01:16:03 -0400 Subject: [PATCH] gcc/ck_pr: GCC-backed primitives should serve as compiler barriers. Olivier pointed out that he was seeing some load / store operations get optimized away and / or re-ordered otherwise. --- include/gcc/ck_pr.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/include/gcc/ck_pr.h b/include/gcc/ck_pr.h index aecf89b..b127392 100644 --- a/include/gcc/ck_pr.h +++ b/include/gcc/ck_pr.h @@ -60,28 +60,39 @@ ck_pr_barrier(void) ck_pr_md_load_##S(const M *target) \ { \ T r; \ + ck_pr_barrier(); \ r = CK_PR_ACCESS(*(T *)target); \ + ck_pr_barrier(); \ return (r); \ } \ CK_CC_INLINE static void \ ck_pr_md_store_##S(M *target, T v) \ { \ + ck_pr_barrier(); \ CK_PR_ACCESS(*(T *)target) = v; \ + ck_pr_barrier(); \ return; \ } CK_CC_INLINE static void * ck_pr_md_load_ptr(const void *target) { + void *r; - return CK_PR_ACCESS(*(void **)target); + ck_pr_barrier(); + r = CK_PR_ACCESS(*(void **)target); + ck_pr_barrier(); + + return r; } CK_CC_INLINE static void ck_pr_md_store_ptr(void *target, const void *v) { + ck_pr_barrier(); CK_PR_ACCESS(*(void **)target) = (void *)v; + ck_pr_barrier(); return; }