Skip to content
  • Simon Peyton Jones's avatar
    Re-engineer the binder-swap transformation · f299ed57
    Simon Peyton Jones authored
    The binder-swap transformation is implemented by the occurrence
    analyser -- see Note [Binder swap] in OccurAnal. However it had
    a very nasty corner in it, for the case where the case scrutinee
    was a GlobalId.  This led to trouble and hacks, and ultimately
    to #16296.
    
    This patch re-engineers how the occurrence analyser implements
    the binder-swap, by actually carrying out a substitution rather
    than by adding a let-binding.  It's all described in
    Note [The binder-swap substitution].
    
    I did a few other things along the way
    
    * Fix a bug in StgCse, which could allow a loop breaker to be CSE'd
      away.  See Note [Care with loop breakers] in StgCse.  I think it can
      only show up if occurrence analyser sets up bad loop breakers, but
      still.
    
    * Better commenting in SimplUtils.prepareAlts
    
    * A little refactoring in CoreUnfold; nothing significant
      e.g. rename CoreUnfold.mkTopUnfolding to mkFinalUnfolding
    
    * Renamed CoreSyn.isFragileUnfolding to hasCoreUnfolding
    
    * Move mkRuleInfo to CoreFVs
    
    There's a 4.6% metric decrease here:
    
    Metric Decrease:
        T9961
    f299ed57