Performance of pattern checker on OptCoercions

Richard Eisenberg eir at cis.upenn.edu
Fri Dec 11 15:59:22 UTC 2015


If I understand correctly, you're saying that the problem is due to my use of guards, not anything with fancy types. If that's correct, then this sort of thing might be a trap anyone could stumble into. (The code in OptCoercion is fairly routine for Haskell.) It seems like disabling checking guards by default may be best, but I'd love a flag (not with -Wall) to enable it optionally.

Richard

On Dec 11, 2015, at 6:27 AM, George Karachalias <george.karachalias at gmail.com> wrote:

> Hello Ben,
> 
> On Fri, Dec 11, 2015 at 11:58 AM, Ben Gamari <ben at well-typed.com> wrote:
> 
> Hi George,
> 
> Richard has encountered a bit of a performance cliff when merging his
> no-kinds work. In particular OptCoercions now results in multiple
> gigabytes of memory consumption during compilation due to the pattern
> checker. The problem seems to be the opt_trans_rule binding, which has
> numerous equations, each of which has patterns of various complexities
> and guards. Might this be another case where disabling the pattern
> checker is unavoidable?
> 
> I am afraid so. I have just responded to the ticket about it. The essence is the
> difference between `f` and `g` below:
> 
> f x = case x of
>   []      -> ...
>   (_:_) -> ...
> 
> g y | []      <- y = ...
>       | (_:_) <- y = ...
> 
> `f` will generate an empty uncovered set while g will generate:
> 
> uncovered =
>   { x |> { x ~ [], x ~ (_:_) }
>   , x |> { x ~ (_:_), x ~ [] } }
> 
> which is also semantically empty but this cannot be detected until we call the
> term oracle on it to see the inconsistency. Since pattern guards can pattern match
> against any variable whilst case expressions match a single expression (`x` above)
> I can not make the check treat them the same.
> 
> From what I see, until now the pattern guards in opt_trans_co involved mostly
> pattern matching with Maybe which has only two constructors. I can easily assume
> that this is the reason we did not have such a problem until now. So many guards
> are already a challenge for the pattern match checker but maybe changing this (by
> this I mean to not use pattern guards on types with many constructors because this
> is the most expensive thing for the whole check) is enough to make GHC bootstrap.
> 
> I hope this helps, I am really confident that this is the cause of the problem.
> Nevertheless, I will look into it more to see if I can find another source.
> 
> George
> 
> -- 
> things you own end up owning you

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20151211/ace00b31/attachment.html>


More information about the ghc-devs mailing list