[commit: ghc] master: StgCmmPrim: Add missing MO_WriteBarrier (d40d6df)

git at git.haskell.org git at git.haskell.org
Wed Aug 31 17:19:26 UTC 2016


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/d40d6df74a9fca382a84709ac9bc862897fbec18/ghc

>---------------------------------------------------------------

commit d40d6df74a9fca382a84709ac9bc862897fbec18
Author: Ben Gamari <bgamari.foss at gmail.com>
Date:   Tue Aug 30 17:08:05 2016 -0400

    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


>---------------------------------------------------------------

d40d6df74a9fca382a84709ac9bc862897fbec18
 compiler/codeGen/StgCmmPrim.hs | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs
index d3c09c5..2169465 100644
--- a/compiler/codeGen/StgCmmPrim.hs
+++ b/compiler/codeGen/StgCmmPrim.hs
@@ -308,8 +308,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))



More information about the ghc-commits mailing list