[GHC] #16254: INLINABLE pragma and newtype wrappers prevent inlining
GHC
ghc-devs at haskell.org
Tue Jan 29 15:04:50 UTC 2019
#16254: INLINABLE pragma and newtype wrappers prevent inlining
-------------------------------------+-------------------------------------
Reporter: monoidal | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.6.3
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets: #5327
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
In #5327, we allowed case-of-known constructor to see through bindings
that were marked as INLINABLE and used newtypes. However, this works only
if the newtype does not have a wrapper. The following code, which is the
same as T5237 except for the extra type parameters in Size, does not cause
the optimization to fire.
{{{
{-# LANGUAGE GADTs, ExplicitForAll #-}
module T16254 where
newtype Size a b where
Size :: forall b a. Int -> Size a b
{-# INLINABLE val2 #-}
val2 = Size 17
f n = case val2 of Size s -> s + s > n
}}}
The reason is that `exprIsConApp_maybe` sees `$WSize (I# 17#)`, which is
an application with a nontrivial argument. In general, this could cause
duplication of work, but in this case we're dealing with a newtype
wrapper, so this is safe.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16254>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list