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>
Wed, 5 Oct 2016 19:27:23 +0000 (19:27 +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 55b42646ab7964fe370294e8b242dc134785a7be..25ac2e4ab6fde8f2b4e1d6c164461b1c2454f495 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))