StgCmmPrim: Add missing MO_WriteBarrier
authorBen Gamari <bgamari.foss@gmail.com>
Wed, 31 Aug 2016 01:08:05 +0000 (21:08 -0400)
committerClint Adams <clint@debian.org>
Mon, 14 Nov 2016 16:35:40 +0000 (16:35 +0000)
StgCmmPrim: Add missing MO_WriteBarrier

Test Plan: Good question

Reviewers: austin, trommler, simonmar, rrnewton

Reviewed By: simonmar

Subscribers: RyanGlScott, thomie

Differential Revision: https://phabricator.haskell.org/D2495

GHC Trac Issues: #12469

(cherry picked from commit d40d6df74a9fca382a84709ac9bc862897fbec18)

Gbp-Pq: Name add-missing-MO_WriteBarrier

compiler/codeGen/StgCmmPrim.hs

index 5d3b94f090f719c9c9fa142daba17f8a3c8fcae0..3cb9f83cace1fef69b552ccc47be885664bfcbb8 100644 (file)
@@ -310,8 +310,11 @@ emitPrimOp _ [res] GetCurrentCCSOp [_dummy_arg]
 emitPrimOp dflags [res] ReadMutVarOp [mutv]
    = emitAssign (CmmLocal res) (cmmLoadIndexW dflags mutv (fixedHdrSizeW dflags) (gcWord dflags))
 
-emitPrimOp dflags [] WriteMutVarOp [mutv,var]
-   = do emitStore (cmmOffsetW dflags mutv (fixedHdrSizeW dflags)) var
+emitPrimOp dflags res@[] WriteMutVarOp [mutv,var]
+   = do -- Without this write barrier, other CPUs may see this pointer before
+        -- the writes for the closure it points to have occurred.
+        emitPrimCall res MO_WriteBarrier []
+        emitStore (cmmOffsetW dflags mutv (fixedHdrSizeW dflags)) var
         emitCCall
                 [{-no results-}]
                 (CmmLit (CmmLabel mkDirty_MUT_VAR_Label))