Skip to content

Re-engineer the binder-swap transformation

Simon Peyton Jones requested to merge wip/T16296 into master

Re-engineer the binder-swap transformation

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

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

Merge request reports