[GHC] #9718: Avoid TidyPgm predicting what CorePrep will do

GHC ghc-devs at haskell.org
Fri Oct 24 08:06:58 UTC 2014


#9718: Avoid TidyPgm predicting what CorePrep will do
-------------------------------------+-------------------------------------
       Reporter:  simonpj            |                   Owner:
           Type:  bug                |                  Status:  new
       Priority:  normal             |               Milestone:
      Component:  Compiler           |                 Version:  7.8.3
       Keywords:                     |        Operating System:
   Architecture:  Unknown/Multiple   |  Unknown/Multiple
     Difficulty:  Unknown            |         Type of failure:
     Blocked By:                     |  None/Unknown
Related Tickets:                     |               Test Case:
                                     |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------
 At the moment the `TidyPgm` pass is forced to predict, accurately but
 unpleasantly, some aspects of what `CorePrep` and `Core2Stg` will do.
 Reason:

  * Each `Id` in the interface file records (among other things) the
 '''arity''' of the `Id`, and whether it has '''CAF references'''

  * We really only know these two things for sure after `CorePrep`.  The
 conversion from Core to STG makes no structural changes.

  * However the result of `TidyPgm` (which preceded `CorePrep`) is used to
 generate the interface file.  So it has to predict the arity and CAF-ref
 status of each `Id`.

  * This is not good.  It restricts what `CorePrep` can do (notably, it
 must not change the arity of a top-level `Id`), and it leads to unsavoury
 code (e.g. look at the call to `CorePrep.cvtLitInteger` in
 `TidyPgm.cafRefsL`.  It's also dangerous: an inconsistency could lead to a
 crash.

 This is a long-standing problem.  My current thought for how to unravel it
 is this:
  * `TidyPgm` does not attach arity or CAF-ref info.
  * Instead, run `CorePrep` after `TidyPgm`, and generate accurate arity
 and CAF-ref info
  * Then use that auxiliary mapping during the conversion from tidied
 program to `ModIface`.

 I don't think this would be hard.  It would mean that the tidied program
 and the core-prep'd program would have to exist in memory at the same
 time.  An alternative would be to generate the `ModIface` from the tidied
 program ''sans'' arity and CAF-ref info, and then, after `CorePrep` run
 over it to add arity and CAF-ref info.  (You'd have to do this before
 generating the fingerprints.)  The advantage of this is that the
 `ModIface` can be a lot smaller than the code for the entire module.

 A long-standing wart which needs some careful attention.

 Simon

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9718>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list