#16039: 'GHC.Magic.noinline <var>' should not float out -------------------------------------+------------------------------------- Reporter: heisenbug | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.8.1 Component: Compiler | Version: 8.2.1 Keywords: FloatOut | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: #15155 Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- While working on #15155, I discovered that the magic function `GHC.Magic.noinline` tricked the float-out transformation into performing undesirable operations: Looking at the Core produced: {{{#!hs { ghc-prim-0.5.3:GHC.Types.I# x_azMX [Dmd=<S,U>] -> case x_azMX of { __DEFAULT -> jump $j_sMly; 3674937295934324920# -> src<compiler/typecheck/TcTyClsDecls.hs:3561:9-35> check_ty_roles_sLb3 (src<compiler/typecheck/TcTyClsDecls.hs:3561:24-26> env_aqfK) (src<compiler/typecheck/TcTyClsDecls.hs:3561:28-31> role_aqfL) (ghc-prim-0.5.3:GHC.Magic.noinline @ Kind liftedTypeKind) } } }}} After simplification we end up with a toplevel variable basically redirecting to an imported variable. {{{#!hs -- RHS size: {terms: 2, types: 1, coercions: 0, joins: 0/0} lvl330_r12qn :: Kind [GblId] lvl330_r12qn = ghc-prim-0.5.3:GHC.Magic.noinline @ Kind liftedTypeKind }}} This would cause `IND_STATIC`s when eventually emitted as assembly. IIRC `GHC.Magic.noinline` was introduced with GHC v8.2. This probably regressed the float-out optimisation. I have a patch to reclassify `noinline <some-var>` as cheap, so that it won't be floated out. N.B.: for more details, see: https://github.com/ghc/ghc/pull/224 -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16039> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler