Use toplevel instances to solve superclasses where possible
This patch introduces a new flag `fsolveconstantdicts` which makes the constraint solver solve super class constraints with available dictionaries if possible. The flag is enabled by `O1`. The motivation of this patch is that the compiler can produce more efficient code if the constraint solver used toplevel instance declarations to solve constraints that are currently solved givens and their superclasses. In particular, as it currently stands, the compiler imposes a performance penalty on the common usecase where superclasses are bundled together for user convenience. The performance penalty applies to constraint synonyms as well. This example illustrates the issue: ``` {# LANGUAGE ConstraintKinds, MultiParamTypeClasses, FlexibleContexts #} module B where class M a b where m :: a > b type C a b = (Num a, M a b) f :: C Int b => b > Int > Int f _ x = x + 1 ``` Output without the patch, notice that we get the instance for `Num Int` by using the class selector `p1`. ``` f :: forall b_arz. C Int b_arz => b_arz > Int > Int f = \ (@ b_a1EB) ($d(%,%)_a1EC :: C Int b_a1EB) _ (eta1_B1 :: Int) > + @ Int (GHC.Classes.$p1(%,%) @ (Num Int) @ (M Int b_a1EB) $d(%,%)_a1EC) eta1_B1 B.f1 ``` Output with the patch, nicely optimised code! ``` f :: forall b. C Int b => b > Int > Int f = \ (@ b) _ _ (x_azg :: Int) > case x_azg of { GHC.Types.I# x1_a1DP > GHC.Types.I# (GHC.Prim.+# x1_a1DP 1#) } ``` Reviewers: simonpj, bgamari, austin Reviewed By: simonpj Subscribers: mpickering, rwbarton, thomie Differential Revision: https://phabricator.haskell.org/D2714 GHC Trac Issues: #12791, #5835
Showing

mentioned in issue #12817

mentioned in commit 3d654115

mentioned in issue #13943 (closed)
Please register or sign in to comment