[commit: ghc] wip/spj-tc-branch3: Another major constraint-solver refactoring (6e6d93b)

git at git.haskell.org git at git.haskell.org
Thu Nov 24 09:12:39 UTC 2016


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/spj-tc-branch3
Link       : http://ghc.haskell.org/trac/ghc/changeset/6e6d93b8b713339dc5f74e8f93e35d0d94014d63/ghc

>---------------------------------------------------------------

commit 6e6d93b8b713339dc5f74e8f93e35d0d94014d63
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date:   Tue Oct 25 17:41:45 2016 +0100

    Another major constraint-solver refactoring
    
    This patch takes further my refactoring of the constraint
    solver, which I've been doing over the last couple of months
    in consultation with Richard.
    
    It fixes a number of tricky bugs that made the constraint
    solver actually go into a loop, including
    
      Trac #12526
      Trac #12444
      Trac #12538
    
    The main changes are these
    
    * Flatten unification variables (fmvs/fuvs) appear on the LHS
      of a tvar/tyvar equality; thus
               fmv ~ alpha
      and not
               alpha ~ fmv
    
      See Note [Put flatten unification variables on the left]
      in TcUnify.  This is implemented by TcUnify.swapOverTyVars.
    
    * Don't reduce a "loopy" CFunEqCan where the fsk appears on
      the LHS:
          F t1 .. tn ~ fsk
      where 'fsk' is free in t1..tn.
      See Note [FunEq occurs-check principle] in TcInteract
    
      This neatly stops some infinite loops that people reported;
      and it allows us to delete some crufty code in reduce_top_fun_eq.
      And it appears to be no loss whatsoever.
    
      As well as fixing loops, ContextStack2 and T5837 both terminate
      when they didn't before.
    
    * Previously we generated "derived shadow" constraints from
      Wanteds, but we could (and sometimes did; Trac #xxxx) repeatedly
      generate a derived shadow from the same Wanted.
    
      A big change in this patch is to have two kinds of Wanteds:
         [WD] behaves like a pair of a Wanted and a Derived
         [W]  behaves like a Wanted only
      See CtFlavour and ShadowInfo in TcRnTypes, and the ctev_nosh
      field of a Wanted.
    
      This turned out to be a lot simpler.  A [WD] gets split into a
      [W] and a [D] in TcSMonad.maybeEmitShaodow.
    
      See TcSMonad Note [The improvement story and derived shadows]
    
    * Rather than have a separate inert_model in the InertCans, I've
      put the derived equalities back into inert_eqs.  We weren't
      gaining anything from a separate field.
    
    * Previously we had a mode for the constraint solver in which it
      would more aggressively solve Derived constraints; it was used
      for simplifying the context of a 'deriving' clause, or a 'default'
      delcaration, for example.
    
      But the complexity wasn't worth it; now I just make proper Wanted
      constraints.  See TcMType.cloneWC
    
    * Don't generate injectivity improvement for Givens; see
      Note [No FunEq improvement for Givens] in TcInteract
    
    * solveSimpleWanteds leaves the insolubles in-place rather than
      returning them.  Simpler.
    
    I also did lots of work on comments.


>---------------------------------------------------------------

6e6d93b8b713339dc5f74e8f93e35d0d94014d63
 compiler/iface/ToIface.hs                          |    2 +
 compiler/typecheck/TcCanonical.hs                  |    2 +-
 compiler/typecheck/TcErrors.hs                     |   21 +-
 compiler/typecheck/TcExpr.hs                       |    1 +
 compiler/typecheck/TcFlatten.hs                    |  307 +++---
 compiler/typecheck/TcInteract.hs                   |  777 ++++++++------
 compiler/typecheck/TcMType.hs                      |   25 +-
 compiler/typecheck/TcRnTypes.hs                    |  264 +++--
 compiler/typecheck/TcRules.hs                      |   21 +-
 compiler/typecheck/TcSMonad.hs                     | 1134 +++++++++-----------
 compiler/typecheck/TcSimplify.hs                   |  146 +--
 compiler/typecheck/TcType.hs                       |   18 +
 compiler/typecheck/TcUnify.hs                      |   45 +-
 .../tests/indexed-types/should_compile/T10226.hs   |   57 +
 .../tests/indexed-types/should_compile/T10634.hs   |   15 +
 .../tests/indexed-types/should_compile/T12526.hs   |   70 ++
 .../tests/indexed-types/should_compile/T12538.hs   |   40 +
 .../indexed-types/should_compile/T12538.stderr     |   13 +
 .../indexed-types/should_compile/T3017.stderr      |    2 +-
 .../tests/indexed-types/should_compile/T4338.hs    |   35 +-
 testsuite/tests/indexed-types/should_compile/all.T |    2 +
 .../tests/indexed-types/should_fail/T2544.stderr   |   24 +-
 .../tests/indexed-types/should_fail/T2627b.stderr  |    4 +-
 .../tests/indexed-types/should_fail/T3330c.stderr  |    6 +-
 .../tests/indexed-types/should_fail/T4179.stderr   |    6 +-
 .../tests/indexed-types/should_fail/T6123.stderr   |    6 +-
 testsuite/tests/indexed-types/should_fail/T7786.hs |   16 +-
 .../tests/indexed-types/should_fail/T7786.stderr   |   43 +-
 .../tests/indexed-types/should_fail/T8227.stderr   |   13 +-
 .../partial-sigs/should_compile/T10403.stderr      |   15 -
 testsuite/tests/perf/compiler/T5837.hs             |   29 +-
 testsuite/tests/perf/compiler/T5837.stderr         |   91 --
 testsuite/tests/perf/compiler/all.T                |    7 +-
 testsuite/tests/polykinds/T12444.hs                |   65 ++
 testsuite/tests/polykinds/T12444.stderr            |   16 +
 testsuite/tests/polykinds/T9222.stderr             |    6 +-
 testsuite/tests/polykinds/all.T                    |    1 +
 .../tests/typecheck/should_compile/Improvement.hs  |   12 +-
 testsuite/tests/typecheck/should_compile/T6018.hs  |   32 +
 .../tests/typecheck/should_compile/T6018.stderr    |    8 +-
 .../tests/typecheck/should_fail/ContextStack2.hs   |    2 +
 .../typecheck/should_fail/ContextStack2.stderr     |   13 -
 testsuite/tests/typecheck/should_fail/Makefile     |    5 +
 testsuite/tests/typecheck/should_fail/T5691.stderr |   10 +-
 testsuite/tests/typecheck/should_fail/T5853.stderr |   28 +-
 testsuite/tests/typecheck/should_fail/T8450.stderr |   10 +-
 testsuite/tests/typecheck/should_fail/T9260.stderr |   11 +-
 testsuite/tests/typecheck/should_fail/all.T        |    2 +-
 48 files changed, 1876 insertions(+), 1602 deletions(-)

Diff suppressed because of size. To see it, use:

    git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 6e6d93b8b713339dc5f74e8f93e35d0d94014d63


More information about the ghc-commits mailing list