[GHC] #13720: INLINE pragma semantics changed since 8.0.2
GHC
ghc-devs at haskell.org
Thu May 18 13:26:58 UTC 2017
#13720: INLINE pragma semantics changed since 8.0.2
-------------------------------------+-------------------------------------
Reporter: mpickering | 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:
-------------------------------------+-------------------------------------
It now seems that unfoldings for INLINE things are optimised slightly.
This causes different interactions with `RULES` than before.
{{{#!hs
module A where
{-# INLINE f #-}
f x = h x
h x = x
{-# RULES "h x" forall x . h x = error "REWRITE" #-}
}}}
{{{#!hs
module B where
import A
qux = f 5
}}}
Then running
{{{
> ghc-8.0.2 B.hs -O2 -fforce-recomp -ddump-simpl | grep qux -A5
qux :: Integer
[GblId, Str=DmdType x]
qux =
error ....
}}}
{{{
> ghc-8.2.0.20170507 B.hs -O2 -fforce-recomp -ddump-simpl | grep qux -A5
qux :: Integer
[GblId,
Caf=NoCafRefs,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 100 0}]
qux = 5
}}}
Inspecting the unfoldings, we see that 8.2 optimises the unfoldings to
inline `h` before the rule can apply.
{{{
d61439f58ce9c5a268304423a43b9b44
f :: p -> p
{- Arity: 1, HasNoCafRefs, Strictness: <S,1*U>,
Inline: (sat-args=1),
Unfolding: InlineRule (1, False, True) (\ @ p (x :: p) -> x) -}
}}}
Is this new behaviour intentional? It seems possible that it will break
some programs which use rewrite rules.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13720>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list