[GHC] #13589: Possible inconsistency in CSE's treatment of NOINLINE
GHC
ghc-devs at haskell.org
Tue Apr 18 21:19:42 UTC 2017
#13589: Possible inconsistency in CSE's treatment of NOINLINE
-------------------------------------+-------------------------------------
Reporter: bgamari | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
While debugging #13535 I noticed the following inconsistency in CSE:
`Note [CSE for INLINE and NOINLINE]` states that we need to take care when
adding expressions bound to binders with inline pragmas to the `CSEnv`. To
see why, consider the following,
{{{#!hs
{-# NOINLINE bar #-}
bar = <rhs> -- Same rhs as foo
foo = <rhs>
}}}
Given this program, we need to avoid producing `foo = bar` since doing so
would mean that we would lose the ability to inline `foo`'s original RHS.
The note then goes on to give the following rule,
> We should not add
>
> {{{<rhs> :-> bar}}}
>
> to the CSEnv if `bar` has any constraints on when it can inline;
> that is, if its 'activation' not always active. Otherwise we
> might replace `<rhs>` by `bar`, and then later be unable to see that it
> really was `<rhs>`.
This rule is implemented in `noCSE` with,
{{{#!hs
not (isAlwaysActive (idInlineActivation id))
}}}
However, it's quite unclear to me that this rule avoids the issue we set
out to solve. Afterall, `NOINLINE bar` is always active, but it still
means that rewriting `foo` to `foo=bar` would lose us the ability to see
`foo`'s original RHS.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13589>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list