Preserve specialisations despite CSE
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 5 Sep 2018 14:54:48 +0000 (15:54 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 5 Sep 2018 16:25:57 +0000 (17:25 +0100)
commit3addf72a6f40747cff213653382eb4476bdb53da
tree2dda31bb6858711f32c40769a49b6d842e1530e5
parent1152a3bee1aef3e24a03e0c2e4e5272ca926f7ab
Preserve specialisations despite CSE

Trac #15445 showed that, as a result of CSE, a function with an
automatically generated specialisation RULE could be inlined
before the RULE had a chance to fire.

This patch attaches a NOINLINE[2] activation to the Id, during
CSE, to stop this happening.

See Note [Delay inlining after CSE]

---- Historical note ---

This patch is simpler and more direct than an earlier
version:

  commit 2110738b280543698407924a16ac92b6d804dc36
  Author: Simon Peyton Jones <simonpj@microsoft.com>
  Date:   Mon Jul 30 13:43:56 2018 +0100

  Don't inline functions with RULES too early

We had to revert this patch because it made GHC itself slower.

Why? It delayed inlining of /all/ functions with RULES, and that was
very bad in TcFlatten.flatten_ty_con_app

* It delayed inlining of liftM
* That delayed the unravelling of the recursion in some dictionary
  bindings.
* That delayed some eta expansion, leaving
     flatten_ty_con_app = \x y. let <stuff> in \z. blah
* That allowed the float-out pass to put sguff between
  the \y and \z.
* And that permanently stopped eta expasion of the function,
  even once <stuff> was simplified.

-- End of historical note ---
compiler/simplCore/CSE.hs
testsuite/tests/numeric/should_compile/T14465.stdout
testsuite/tests/numeric/should_compile/T7116.stdout
testsuite/tests/simplCore/should_compile/T15445.hs [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/T15445.stderr [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/T15445a.hs [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/all.T