• simonpj@microsoft.com's avatar
    Tidy up the treatment of dead binders · 7e8cba32
    simonpj@microsoft.com authored
    This patch does a lot of tidying up of the way that dead variables are
    handled in Core.  Just the sort of thing to do on an aeroplane.
    
    * The tricky "binder-swap" optimisation is moved from the Simplifier
      to the Occurrence Analyser.  See Note [Binder swap] in OccurAnal.
      This is really a nice change.  It should reduce the number of
      simplifier iteratoins (slightly perhaps).  And it means that
      we can be much less pessimistic about zapping occurrence info
      on binders in a case expression.  
    
    * For example:
    	case x of y { (a,b) -> e }
      Previously, each time around, even if y,a,b were all dead, the
      Simplifier would pessimistically zap their OccInfo, so that we
      can't see they are dead any more.  As a result virtually no 
      case expression ended up with dead binders.  This wasn't Bad
      in itself, but it always felt wrong.
    
    * I added a check to CoreLint to check that a dead binder really
      isn't used.  That showed up a couple of bugs in CSE. (Only in
      this sense -- they didn't really matter.)
      
    * I've changed the PprCore printer to print "_" for a dead variable.
      (Use -dppr-debug to see it again.)  This reduces clutter quite a
      bit, and of course it's much more useful with the above change.
    
    * Another benefit of the binder-swap change is that I could get rid of
      the Simplifier hack (working, but hacky) in which the InScopeSet was
      used to map a variable to a *different* variable. That allowed me
      to remove VarEnv.modifyInScopeSet, and to simplify lookupInScopeSet
      so that it doesn't look for a fixpoint.  This fixes no bugs, but 
      is a useful cleanup.
    
    * Roman pointed out that Id.mkWildId is jolly dangerous, because
      of its fixed unique.  So I've 
    
         - localied it to MkCore, where it is private (not exported)
    
         - renamed it to 'mkWildBinder' to stress that you should only
           use it at binding sites, unless you really know what you are
           doing
    
         - provided a function MkCore.mkWildCase that emodies the most
           common use of mkWildId, and use that elsewhere
    
       So things are much better
    
    * A knock-on change is that I found a common pattern of localising
      a potentially global Id, and made a function for it: Id.localiseId
    7e8cba32
CoreUtils.lhs 58.2 KB