[commit: ghc] wip/all-inlinable: Always expose unfoldings for overloaded functions. (4d0fc4e)
git at git.haskell.org
git at git.haskell.org
Mon Jan 9 10:44:44 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/all-inlinable
Link : http://ghc.haskell.org/trac/ghc/changeset/4d0fc4e79d3a182a5d4f3f973ea174ece01ca95b/ghc
>---------------------------------------------------------------
commit 4d0fc4e79d3a182a5d4f3f973ea174ece01ca95b
Author: Matthew Pickering <matthewtpickering at gmail.com>
Date: Sat Aug 6 22:17:09 2016 +0100
Always expose unfoldings for overloaded functions.
Summary:
Users expect their overloaded functions to be specialised at call sites,
however, this is only the case if they are either lucky and GHC chooses to
include the unfolding or they mark their definition with an INLINABLE pragma.
This leads to library authors marking all their functions with `INLINABLE` (or
more accurately `INLINE`) so they ensure that downstream consumers pay no cost
for their abstraction.
A more sensible default is to do this job for the library author and give more
predictable guarantees about specialisation.
Empirically, I compiled a selection of 1150 packages with (a similar) patch applied. The total size of the interface files before the patch was 519mb and after 634mb. On modern machines, I think this increase is justified for the result.
Reviewers: simonpj, austin, bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D2929
>---------------------------------------------------------------
4d0fc4e79d3a182a5d4f3f973ea174ece01ca95b
compiler/main/TidyPgm.hs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/compiler/main/TidyPgm.hs b/compiler/main/TidyPgm.hs
index 8f2e334..82dd71c 100644
--- a/compiler/main/TidyPgm.hs
+++ b/compiler/main/TidyPgm.hs
@@ -58,6 +58,7 @@ import ErrUtils (Severity(..))
import Outputable
import SrcLoc
import qualified ErrUtils as Err
+import TcType ( isOverloadedTy )
import Control.Monad
import Data.Function
@@ -726,6 +727,7 @@ addExternal expose_all id = (new_needed_ids, show_unfold)
never_active = isNeverActive (inlinePragmaActivation (inlinePragInfo idinfo))
loop_breaker = isStrongLoopBreaker (occInfo idinfo)
bottoming_fn = isBottomingSig (strictnessInfo idinfo)
+ is_overloaded = isOverloadedTy (idType id)
-- Stuff to do with the Id's unfolding
-- We leave the unfolding there even if there is a worker
@@ -737,7 +739,8 @@ addExternal expose_all id = (new_needed_ids, show_unfold)
|| isStableSource src -- Always expose things whose
-- source is an inline rule
-
+ || is_overloaded -- Always expose overloaded things so that
+ -- they can be specialised at call sites.
|| not (bottoming_fn -- No need to inline bottom functions
|| never_active -- Or ones that say not to
|| loop_breaker -- Or that are loop breakers
More information about the ghc-commits
mailing list