[GHC] #10401: state hack-related regression

#10401: state hack-related regression
-------------------------------------+-------------------------------------
Reporter: rwbarton | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: Runtime
Unknown/Multiple | performance bug
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Revisions: |
-------------------------------------+-------------------------------------
Consider the following program `exp.hs`:
{{{
import Control.Monad
import Debug.Trace
expensive :: String -> String
expensive x = trace "$$$" x
{-# NOINLINE expensive #-}
main :: IO ()
main = do
str <- fmap expensive getLine
replicateM_ 3 $ print str
}}}
When run as `echo hi | ./exp`, it might print either
{{{
$$$
"hi"
"hi"
"hi"
}}}
or
{{{
$$$
"hi"
$$$
"hi"
$$$
"hi"
}}}
depending on the compiler version and optimization settings.
In 7.8.4, building with `-O2` produces the second (bad) output, while
building with `-O2 -fno-state-hack` produces the first output, not
surprisingly.
However in 7.10.1 and in HEAD both `-O2` and `-O2 -fno-state-hack` produce
the second output.
It seems this difference in behavior between 7.8.4 and 7.10.1 may be due
to the following difference in the unfolding for IO's fmap. In 7.8.4
{{{
ba867929df0910f70431843781ad014d
$fFunctorIO2 :: (a -> b)
-> GHC.Types.IO a
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld, b #)
{- Arity: 3, HasNoCafRefs,
Strictness:

#10401: state hack-related regression -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by nomeata): The difference you marked is a result of changeset:c001bde73e38904ed161b0b61b240f99a3b6f48d/ghc. But I believe it is not the cause of the problem, as the state hack would, if I understand it correctly, assume `State# RealWorld` to be one-shot independent of whether that annotation is present in the unfolding or not. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10401#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10401: state hack-related regression -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by rwbarton): But the ticket is mostly about the behavior of 7.10.1 with `-O2 -fno- state-hack`. Does that change things? (Probably should have been clearer about this.) In 7.8 we have `-fno-state-hack` as an escape hatch for when the state hack heuristic goes wrong. But we can't expect people to rebuild all their dependencies including `base` with `-fno-state-hack`, and disabling optimizations completely is not very satisfactory either. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10401#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#10401: state hack-related regression -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): See #1168, the master ticket. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10401#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC