StgCase - are LiveVars and SRT fields going to be used?

Ömer Sinan Ağacan omeragacan at gmail.com
Sat Feb 6 23:39:46 UTC 2016


I submitted https://phabricator.haskell.org/D1889 which hopefully
fixes this properly.

2016-02-05 21:50 GMT-05:00 Ömer Sinan Ağacan <omeragacan at gmail.com>:
> Simon, I broke the debug build with that commit. I actually validated locally
> before committing, but apparently the default validate settings doesn't define
> DEBUG, so the new assertion implementation was not tested. (Why validate
> doesn't define DEBUG by default???)
>
> The fastest way to reproduce the bug is to use these validate settings:
>
>     DYNAMIC_GHC_PROGRAMS = NO
>     GhcLibWays = v
>     GhcStage1HcOpts += -DDEBUG
>
> I did some debugging. Here's an example definition that causes the assertion
> failure:
>
>       unpackCString#
>       unpackCString# [InlPrag=NOINLINE] :: Addr# -> [Char]
>       [GblId,
>        Arity=1,
>        Caf=NoCafRefs,
>        Str=DmdType <S,U>,
>        Unf=OtherCon []] =
>           \r [addr_seX]
>               let {
>                 unpack_seY [Occ=LoopBreaker] :: Int# -> [Char]
>                 [LclId, Arity=1, Str=DmdType <S,U>, Unf=OtherCon []] =
>                     sat-only \r [nh_seZ]
>                         case indexCharOffAddr# [addr_seX nh_seZ] of ch_sf0 {
>                           __DEFAULT ->
>                               let {
>                                 sat_sf3 [Occ=Once] :: [Char]
>                                 [LclId, Str=DmdType] =
>                                     \u []
>                                         case +# [nh_seZ 1#] of sat_sf2 {
>                                           __DEFAULT -> unpack_seY sat_sf2;
>                                         }; } in
>                               let {
>                                 sat_sf1 [Occ=Once] :: Char
>                                 [LclId, Str=DmdType] =
>                                     NO_CCS C#! [ch_sf0];
>                               } in  : [sat_sf1 sat_sf3];
>                           '\NUL'# -> [] [];
>                         };
>               } in  unpack_seY 0#;
>
> Here the IdInfo says this doesn't have CAF refs, but `sat_sf3` is updatable, so
> in our assertion we say that this has a CAF. In the implementation I basically
> followed your description:
>
> "
> - If the binding is an updatable thunk, it has CAF refs.
>
> - Otherwise it has CAF reffs iff any of its free Ids (including imported ones)
>   has mayHaveCafRefs in its IdInfo. Actually you can probably ignore the "free"
>   part and just check if any Id has mayHaveCafRefs set.
> "
>
> The first case is why we say "yes" to stgBindHasCafRefs. But I don't quite
> understand why we say every updatable thunk has CAFs. I think this is only the
> case with top-level updatable thunks, right? If no, then maybe the problem is
> not with the assertion but rather with the CorePrep step that sets IdInfos? Any
> ideas?
>
> Thanks..
>
> 2016-02-01 20:19 GMT-05:00 Ömer Sinan Ağacan <omeragacan at gmail.com>:
>> https://phabricator.haskell.org/D1880
>>
>> 2016-02-01 18:04 GMT-05:00 Simon Peyton Jones <simonpj at microsoft.com>:
>>> Those fields are dead, now that the Cmm pass deals with it.  We left it in while making the transition, but they can go now.  Go ahead!
>>>
>>> (Lots of code should disappear along with them!)
>>>
>>> Simon
>>>
>>> | -----Original Message-----
>>> | From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Ömer Sinan
>>> | Agacan
>>> | Sent: 01 February 2016 22:06
>>> | To: ghc-devs <ghc-devs at haskell.org>
>>> | Subject: StgCase - are LiveVars and SRT fields going to be used?
>>> |
>>> | Hi all,
>>> |
>>> | This is how case expression in STG currently defined:
>>> |
>>> |
>>> |   | StgCase
>>> |         (GenStgExpr bndr occ)
>>> |         (GenStgLiveVars occ)
>>> |         (GenStgLiveVars occ)
>>> |         bndr
>>> |         SRT
>>> |         AltType
>>> |         [GenStgAlt bndr occ]
>>> |
>>> |
>>> | The GenStgLiveVars and SRT fields are never used anywhere in the compiler
>>> | (except the printer). So the question is, I'm assuming those were used at
>>> | some
>>> | point, but are they going to be used in the future? Or can I just delete
>>> | those?
>>> |
>>> | As a proof of concept, I just compiled GHC using this:
>>> |
>>> |
>>> |   | StgCase
>>> |         (GenStgExpr bndr occ)
>>> |         bndr
>>> |         AltType
>>> |         [GenStgAlt bndr occ]
>>> |
>>> |
>>> | Normally this is not a big deal, but I'm doing lots of STG-to-STG
>>> | transformations nowadays, and I have to keep those field updated which is
>>> | annoying as those are never going to be used (I can't even know if I'm doing
>>> | it
>>> | right), or leave those `undefined` which is not a good practice.
>>> | _______________________________________________
>>> | ghc-devs mailing list
>>> | ghc-devs at haskell.org
>>> | https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.haskell.
>>> | org%2fcgi-bin%2fmailman%2flistinfo%2fghc-
>>> | devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7c12ca56c8fc514f477f7f08
>>> | d32b53f4bc%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=LPiupNbUJ9OGL9cmbP%2f
>>> | PAs2JSdxqlxk%2bGbXuYTHFbzg%3d


More information about the ghc-devs mailing list