Kill off complications in CoreFVs
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 7 Apr 2017 16:10:07 +0000 (17:10 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 12 Apr 2017 15:16:12 +0000 (16:16 +0100)
commit751996e90a964026a3f86853338f10c82db6b610
treee1b1771df48d64da1ce5b63601367ac39851c069
parentfc2a96a1ea9cceba596cbd652b44bd830a4191e4
Kill off complications in CoreFVs

When doing type-in-type, Richard introduce some substantial
complications in CoreFVs, gathering types and free variables
of type.  In Trac #13160 we decided that this complication was
unnecessary, so this patch removes it.

Unfortnately I then fell down a twisty rabbit hole.  Roughly:

* An apparently-innocuous change in the AnnApp case of
  fiExpr made the fuction a little bit stricter, so we ended
  up peering into the arguments when we didn't before (namely
  when there are no bindings being floated inwards).  I've
  rejigged it so that it's not fragile any more.

* Peering into the arguments was sometimes expensive, becuase
  exprIsExpandable can be expensive because it looks deeply into
  the expression.

* The combination of the two led to a non-linear explosion
  of work when the argument of a function is a deeep nest
  of constructors.  This bug has been lurking for ages.

  I solved it by replacing exprIsExpandable with exprIsHNF
  + exprIsTrivial; see Note [noFloatInto considerations]

* The code around floating case-expressions turned out to be
  very delicate, because can_fail primops (which we want to
  float inwards) can't be floated outwards; so we have to be
  careful never to float them too far. Note [Floating primops]
  has the details

* I ended up refactoring some rather opaque code in
  sepBindsByDropPoint.

Working all this out meant that I rewrote quite a bit of
code, so it's now a reasonably substantial patch.  But it's
a net improvement.
compiler/coreSyn/CoreFVs.hs
compiler/simplCore/FloatIn.hs