summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÖmer Sinan Ağacan <omeragacan@gmail.com>2020-03-09 18:16:32 +0300
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-03-17 07:38:08 -0400
commit5800ebfeb2fe3e3ed985cdf08a66defea73db71d (patch)
treed00a9a842d351b61b7ad4998c583d71cef6a153c
parentbeffa14771ebd6ba24b20337f29045364621c5fa (diff)
downloadhaskell-5800ebfeb2fe3e3ed985cdf08a66defea73db71d.tar.gz
Don't update ModDetails with CafInfos when opts are disabled
This is consistent with the interface file behavior where we omit HsNoCafRefs annotations with -fomit-interface-pragmas (implied by -O0). ModDetails and ModIface are just different representations of the same thing, so they really need to be in sync. This patch does the right thing and does not need too much explanation, but here's an example of a problem not doing this causes in !2842: -- MyInteger.hs module MyInteger ( MyInteger (MyInteger) , ToMyInteger (toMyInteger) ) where newtype MyInteger = MyInteger Integer class ToMyInteger a where toMyInteger :: a -> MyInteger instance ToMyInteger Integer where toMyInteger = MyInteger {- . succ -} -- Main.hs module Main ( main ) where import MyInteger (MyInteger (MyInteger), toMyInteger) main :: IO () main = do let (MyInteger i) = (id . toMyInteger) (41 :: Integer) print i If I build this with -O0, without this fix, we generate a ModDetails with accurate LFInfo for toMyInteger (MyInteger.$fToMyIntegerInteger) which says that it's a LFReEntrant with arity 1. This means in the use site (Main) we tag the value: R3 = MyInteger.$fToMyIntegerInteger_closure + 1; R2 = GHC.Base.id_closure; R1 = GHC.Base.._closure; Sp = Sp - 16; call stg_ap_ppp_fast(R4, R3, R2, R1) args: 24, res: 0, upd: 24; Now we change the definition by uncommenting the `succ` part and it becomes a thunk: MyInteger.$fToMyIntegerInteger [InlPrag=INLINE (sat-args=0)] :: MyInteger.ToMyInteger GHC.Integer.Type.Integer [GblId[DFunId(nt)]] = {} \u [] $ctoMyInteger_rEA; and its LFInfo is now LFThunk. This change in LFInfo makes a difference in the use site: we can no longer tag it. But becuase the interface fingerprint does not change (because ModIface does not change) we don't rebuild Main and tag the thunk. (1.2% increase in allocations when building T12545 on armv7 because we generate more code without CafInfos) Metric Increase: T12545
-rw-r--r--compiler/GHC/Driver/Pipeline.hs2
-rw-r--r--compiler/main/UpdateCafInfos.hs11
2 files changed, 10 insertions, 3 deletions
diff --git a/compiler/GHC/Driver/Pipeline.hs b/compiler/GHC/Driver/Pipeline.hs
index b9a32d340d..627efeeb41 100644
--- a/compiler/GHC/Driver/Pipeline.hs
+++ b/compiler/GHC/Driver/Pipeline.hs
@@ -1197,7 +1197,7 @@ runPhase (HscOut src_flavour mod_name result) _ dflags = do
final_iface <- liftIO (mkFullIface hsc_env'{hsc_dflags=iface_dflags} partial_iface (Just caf_infos))
let final_mod_details = {-# SCC updateModDetailsCafInfos #-}
- updateModDetailsCafInfos caf_infos mod_details
+ updateModDetailsCafInfos iface_dflags caf_infos mod_details
setIface final_iface final_mod_details
-- See Note [Writing interface files]
diff --git a/compiler/main/UpdateCafInfos.hs b/compiler/main/UpdateCafInfos.hs
index a1287e88c6..dd4881ec6e 100644
--- a/compiler/main/UpdateCafInfos.hs
+++ b/compiler/main/UpdateCafInfos.hs
@@ -7,6 +7,7 @@ module UpdateCafInfos
import GhcPrelude
import GHC.Core
+import GHC.Driver.Session
import GHC.Driver.Types
import Id
import IdInfo
@@ -21,10 +22,16 @@ import Outputable
-- | Update CafInfos of all occurences (in rules, unfoldings, class instances)
updateModDetailsCafInfos
- :: NameSet -- ^ Non-CAFFY names in the module. Names not in this set are CAFFY.
+ :: DynFlags
+ -> NameSet -- ^ Non-CAFFY names in the module. Names not in this set are CAFFY.
-> ModDetails -- ^ ModDetails to update
-> ModDetails
-updateModDetailsCafInfos non_cafs mod_details =
+
+updateModDetailsCafInfos dflags _ mod_details
+ | gopt Opt_OmitInterfacePragmas dflags
+ = mod_details
+
+updateModDetailsCafInfos _ non_cafs mod_details =
{- pprTrace "updateModDetailsCafInfos" (text "non_cafs:" <+> ppr non_cafs) $ -}
let
ModDetails{ md_types = type_env -- for unfoldings