Allow unbound Refl binders in a RULE
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 29 Mar 2017 08:00:02 +0000 (09:00 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 29 Mar 2017 08:02:53 +0000 (09:02 +0100)
commit8674883c137401873fd53a6963acd33af651c2af
treee95de3232b884fe9a7cdc973c0d07cce13e2e1a5
parente07211f752b9b98e2bd6957f126bd537d178041a
Allow unbound Refl binders in a RULE

Trac #13410 was failing because we had a RULE with a binder
   (c :: t~t)
and the /occurrences/ of c on the LHS were being optimised to Refl,
leaving a binder that would not be filled in by matching the LHS
of the rule.

I flirted with trying to ensure that occurrences (c :: t~t) are
not optimised to Relf, but that turned out to be fragile; it was
being done, for good reasons, in multiple places, including
  - TyCoRep.substCoVarBndr
  - Simplify.simplCast
  - Corecion.mkCoVarCo

So I fixed it in one place by making Rules.matchN deal happily
with an unbound binder (c :: t~t).  Quite easy.  See "Coercion
variables" in Note [Unbound RULE binders] in Rules.

In addition, I needed to make CoreLint be happy with an bound
RULE binder that is a Relf coercion variable

In debugging this, I was perplexed that occurrences of a variable
(c :: t~t) mysteriously turned into Refl.  I found out how it
was happening, and decided to move it:

* In TyCoRep.substCoVarBndr, do not substitute Refl for a
  binder (c :: t~t).

* In mkCoVarCo do not optimise (c :: t~t) to Refl.

Instead, we do this optimisation in optCoercion (specifically
opt_co4) where, surprisingly, the optimisation was /not/
being done.  This has no effect on what programs compile;
it just moves a relatively-expensive optimisation to optCoercion,
where it seems more properly to belong.  It's actually not clear
to me which is really "better", but this way round is less
surprising.

One small simplifying refactoring

* Eliminate TyCoRep.substCoVarBndrCallback, which was only
  called locally.
compiler/coreSyn/CoreLint.hs
compiler/specialise/Rules.hs
compiler/types/Coercion.hs
compiler/types/OptCoercion.hs
compiler/types/TyCoRep.hs
testsuite/tests/simplCore/should_compile/T13410.hs [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/all.T