[GHC] #15345: Duplication between `CoreSubst` and `SimplEnv` is very unfortunate

GHC ghc-devs at haskell.org
Thu Sep 6 09:57:18 UTC 2018


#15345: Duplication between `CoreSubst` and `SimplEnv` is very unfortunate
-------------------------------------+-------------------------------------
        Reporter:  mpickering        |                Owner:  (none)
            Type:  task              |               Status:  new
        Priority:  normal            |            Milestone:  8.8.1
       Component:  Compiler          |              Version:  8.4.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 > Help me Simon!

 I agree this is vary far from ideal

 * `CoreSubst.substIdBndr` takes a `Subst`
    * It substitutes in the `IdInfo`

 * `CoreOpt.subst_opt_id_bndr` is similar to `CoreSubst.substIdBndr`, but
   * It zaps the `IdInfo`.

 * `SimplEnv.substIdBndr` takes a `SimplEnv`.
    * For `CoVars` it makes a `TCvSubst`, and calls
 `TyCoRep.substCoVarBndr`
    * For `Ids` it calls `SimplEnv.substNonCoVarBndr`, which
        * zaps the `IdInfo` (because the simplifier will simplify and re-
 add it)
        * and for `Ids` it can cope with join points; I'll add a Note to
 explain this.

 * Why are `CoVars` treated differently to other `Ids`?  Because they can
 occur in types, so their bindings must be in the `TCvSubst`.

 Things we could improve relatively easily:

 * `SimplEnv.substIdBndr` does the Id/CoVar split, calling `substCoVarBndr`
 and `substNonCoVarIdBndr` resp.  But `CoreSubst.substIdBndr` assumes a
 non-CoVar Id; the split is done by `CoreSubst.substBndr`.  This is
 inconsistent.

 * `CoreSubst.substIdBndr` should call `CoreSubst.substIdType` rather than
 copying its code.

 * `SimplEnv.substIdType` could probably just call `CoreSubst.substIdType`

 * I suppose that `CoreOpt.subst_opt_id_bndr` could zap the `IdInfo` and
 then call `CoreSubst.substIdBndr`.  Slightly less efficient but more
 modular; and this is not heavily used code.

 Does any of that help?

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


More information about the ghc-tickets mailing list