diff --git a/rts/Proftimer.c b/rts/Proftimer.c
index 22ef1c417182e2c2a28c25ed7c37d1c3ad87515f..be29c06ec8bc5de3669646c3fb94ecd442b1cb84 100644
--- a/rts/Proftimer.c
+++ b/rts/Proftimer.c
@@ -124,7 +124,8 @@ handleProfTick(void)
         uint32_t n;
         for (n=0; n < getNumCapabilities(); n++) {
             Capability *cap = getCapability(n);
-            cap->r.rCCCS->time_ticks++;
+            CostCentreStack *ccs = RELAXED_LOAD(&cap->r.rCCCS);
+            ccs->time_ticks++;
             traceProfSampleCostCentre(cap, cap->r.rCCCS, total_ticks);
         }
     }
diff --git a/rts/sm/GC.c b/rts/sm/GC.c
index 51f8b32e4b0027a8b0179b670925a7f3ff8730de..200df4a2f598346f615e2be91cceb03f590a39e2 100644
--- a/rts/sm/GC.c
+++ b/rts/sm/GC.c
@@ -340,8 +340,8 @@ GarbageCollect (struct GcConfig config,
   // attribute any costs to CCS_GC
 #if defined(PROFILING)
   for (n = 0; n < getNumCapabilities(); n++) {
-      save_CCS[n] = getCapability(n)->r.rCCCS;
-      getCapability(n)->r.rCCCS = CCS_GC;
+      save_CCS[n] = RELAXED_LOAD(&getCapability(n)->r.rCCCS);
+      RELAXED_STORE(&getCapability(n)->r.rCCCS, CCS_GC);
   }
 #endif