
#9718: Avoid TidyPgm predicting what CorePrep will do -------------------------------------+------------------------------------- Reporter: simonpj | Owner: (none) Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.3 Resolution: | Keywords: CodeGen, CAFs Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by osa1): I now built GHC with some debug prints to see what's going on. Here are some numbers: - The new analysis never returns `MayHaveCafRefs` for a binder that previous passes assigned `NoCafRefs`. - There are 9604 binders for which the new analysis returned `NoCafRefs`, but they were assigned `MayHaveCafRefs` by previous passes. I looked at a few of the definitions that were assigned `NoCafRefs` by the new analysis but were previously `MayHaveCafRefs`. Here are a few examples: (see also the example in comment:19) ---- utils/hpc/HpcMarkup.hs: {{{ sat_s7Je :: GHC.Types.Int [LclId] = CCS_DONT_CARE GHC.Types.I#! [68#]; }}} (I don't know why this was previously `MayHaveCafRefs`) ---- libraries/base/GHC/Conc/Sync.hs {{{ sat_s8GJ :: forall a. GHC.Conc.Sync.STM a -> GHC.Conc.Sync.STM a -> GHC.Conc.Sync.STM a [LclId] = \r [eta_B3 eta_B2 void_0E] catchRetry# [eta_B3 eta_B2 GHC.Prim.void#]; }}} This itself is not a CAF. Only free variable is `GHC.Prim.void#` (we don't consider `catchRetry#` as a free variable because it's a primop) which is defined like this {{{ voidPrimId = pcMiscPrelId voidPrimIdName voidPrimTy (noCafIdInfo `setUnfoldingInfo` evaldUnfolding -- Note [evaldUnfoldings] `setNeverLevPoly` voidPrimTy) }}} So this is not CAFFY (again, I don't know why this was previously `MayHaveCafRefs`). ---- I also checked a few other definitions, one interesting binder that was previously `MayHaveCafRefs` and is now `NoCafRefs` is this foreign import: {{{ foreign import ccall unsafe "static stdlib.h &free" c_free_finalizer :: FunPtr (Ptr Word8 -> IO ()) }}} Once again I have no idea why this was previously `MayHaveCafRefs`... -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9718#comment:20 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler