[commit: ghc] master: Remove StgRubbishArg and CmmArg (9684dbb)

git at git.haskell.org git at git.haskell.org
Wed Aug 10 16:48:54 UTC 2016


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

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

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

commit 9684dbb1d776a8e086f8db4191b3bcf826867dda
Author: Ömer Sinan Ağacan <omeragacan at gmail.com>
Date:   Wed Aug 10 16:47:47 2016 +0000

    Remove StgRubbishArg and CmmArg
    
    The idea behind adding special "rubbish" arguments was in unboxed sum types
    depending on the tag some arguments are not used and we don't want to move some
    special values (like 0 for literals and some special pointer for boxed slots)
    for those arguments (to stack locations or registers). "StgRubbishArg" was an
    indicator to the code generator that the value won't be used. During Stg-to-Cmm
    we were then not generating any move or store instructions at all.
    
    This caused problems in the register allocator because some variables were only
    initialized in some code paths. As an example, suppose we have this STG: (after
    unarise)
    
        Lib.$WT =
            \r [dt_sit]
                case
                    case dt_sit of {
                      Lib.F dt_siv [Occ=Once] ->
                          (#,,#) [1# dt_siv StgRubbishArg::GHC.Prim.Int#];
                      Lib.I dt_siw [Occ=Once] ->
                          (#,,#) [2# StgRubbishArg::GHC.Types.Any dt_siw];
                    }
                of
                dt_six
                { (#,,#) us_giC us_giD us_giE -> Lib.T [us_giC us_giD us_giE];
                };
    
    This basically unpacks a sum type to an unboxed sum with 3 fields, and then
    moves the unboxed sum to a constructor (`Lib.T`).
    
    This is the Cmm for the inner case expression (case expression in the scrutinee
    position of the outer case):
    
        ciN:
            ...
            -- look at dt_sit's tag
            if (_ciT::P64 != 1) goto ciS; else goto ciR;
        ciS: -- Tag is 2, i.e. Lib.F
            _siw::I64 = I64[_siu::P64 + 6];
            _giE::I64 = _siw::I64;
            _giD::P64 = stg_RUBBISH_ENTRY_info;
            _giC::I64 = 2;
            goto ciU;
        ciR: -- Tag is 1, i.e. Lib.I
            _siv::P64 = P64[_siu::P64 + 7];
            _giD::P64 = _siv::P64;
            _giC::I64 = 1;
            goto ciU;
    
    Here one of the blocks `ciS` and `ciR` is executed and then the execution
    continues to `ciR`, but only `ciS` initializes `_giE`, in the other branch
    `_giE` is not initialized, because it's "rubbish" in the STG and so we don't
    generate an assignment during code generator. The code generator then panics
    during the register allocations:
    
        ghc-stage1: panic! (the 'impossible' happened)
          (GHC version 8.1.20160722 for x86_64-unknown-linux):
                LocalReg's live-in to graph ciY {_giE::I64}
    
    (`_giD` is also "rubbish" in `ciS`, but it's still initialized because it's a
    pointer slot, we have to initialize it otherwise garbage collector follows the
    pointer to some random place. So we only remove assignment if the "rubbish" arg
    has unboxed type.)
    
    This patch removes `StgRubbishArg` and `CmmArg`. We now always initialize
    rubbish slots. If the slot is for boxed types we use the existing `absentError`,
    otherwise we initialize the slot with literal 0.
    
    Reviewers: simonpj, erikd, austin, simonmar, bgamari
    
    Reviewed By: erikd
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D2446


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

9684dbb1d776a8e086f8db4191b3bcf826867dda
 compiler/cmm/CLabel.hs                       |  4 +-
 compiler/cmm/CmmExpr.hs                      |  6 ---
 compiler/cmm/CmmLayoutStack.hs               |  2 +-
 compiler/cmm/CmmParse.y                      |  8 ++--
 compiler/cmm/CmmUtils.hs                     |  6 +--
 compiler/cmm/MkGraph.hs                      | 71 +++++++++-------------------
 compiler/cmm/PprCmmExpr.hs                   |  9 ----
 compiler/codeGen/StgCmm.hs                   |  2 +-
 compiler/codeGen/StgCmmBind.hs               |  2 +-
 compiler/codeGen/StgCmmCon.hs                |  2 +-
 compiler/codeGen/StgCmmEnv.hs                | 28 +++--------
 compiler/codeGen/StgCmmExpr.hs               | 14 +++---
 compiler/codeGen/StgCmmForeign.hs            |  6 +--
 compiler/codeGen/StgCmmHeap.hs               | 20 ++++----
 compiler/codeGen/StgCmmLayout.hs             | 28 +++++------
 compiler/codeGen/StgCmmMonad.hs              | 17 ++-----
 compiler/codeGen/StgCmmPrim.hs               | 25 +++++-----
 compiler/codeGen/StgCmmUtils.hs              | 22 ++++-----
 compiler/coreSyn/MkCore.hs                   |  5 +-
 compiler/prelude/PrelNames.hs                |  3 +-
 compiler/simplStg/UnariseStg.hs              | 15 ++++--
 compiler/stgSyn/StgLint.hs                   |  1 -
 compiler/stgSyn/StgSyn.hs                    |  8 +---
 rts/StgMiscClosures.cmm                      |  3 --
 testsuite/tests/unboxedsums/all.T            |  1 +
 testsuite/tests/unboxedsums/unboxedsums12.hs | 19 ++++++++
 26 files changed, 130 insertions(+), 197 deletions(-)

Diff suppressed because of size. To see it, use:

    git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 9684dbb1d776a8e086f8db4191b3bcf826867dda


More information about the ghc-commits mailing list