[GHC] #10528: compile time performance regression with OverloadedStrings and Text
GHC
ghc-devs at haskell.org
Fri Jul 24 17:05:20 UTC 2015
#10528: compile time performance regression with OverloadedStrings and Text
-------------------------------------+-------------------------------------
Reporter: jakewheat | Owner: bgamari
Type: bug | Status: new
Priority: high | Milestone: 7.10.3
Component: Compiler | Version: 7.10.2-rc2
Resolution: | Keywords:
Operating System: Linux | Architecture:
Type of failure: Compile-time | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
-------------------------------------+-------------------------------------
Comment (by bgamari):
In the simplifier pass right before the two compilers diverse the code
looks something like,
{{{
(c_d32a
(Data.Text.pack
(GHC.Base.build
@ GHC.Types.Char
(\ (@ b) ->
GHC.CString.unpackFoldrCString#
@ b "bpchar"#)))
(c_d32a
(Data.Text.pack
(GHC.Base.build
@ GHC.Types.Char
(\ (@ b) ->
GHC.CString.unpackFoldrCString#
@ b "bytea"#)))
}}}
Into this `GHC.Base.build` is inlined,
{{{
Considering inlining: build
arg infos [ValueArg]
interesting continuation RuleArgCtxt
some_benefit True
is exp: True
is work-free: True
guidance ALWAYS_IF(arity=1,unsat_ok=False,boring_ok=False)
ANSWER = YES
Inlining done: GHC.Base.build
Inlined fn: \ (@ a)
(g [Occ=Once!] :: forall b. (a -> b -> b) -> b -> b) ->
g @ [a] (GHC.Types.: @ a) (GHC.Types.[] @ a)
}}}
and then `pack`,
{{{
Considering inlining: pack
arg infos [NonTrivArg]
interesting continuation BoringCtxt
some_benefit True
is exp: True
is work-free: True
guidance ALWAYS_IF(arity=0,unsat_ok=False,boring_ok=False)
ANSWER = YES
Inlining done: Data.Text.pack
Inlined fn: \ (x [Occ=Once] :: GHC.Base.String) ->
Data.Text.Internal.Fusion.unstream
(Data.Text.Internal.Fusion.Common.map
Data.Text.Internal.safe
(Data.Text.Internal.Fusion.Common.streamList @
GHC.Types.Char x))
}}}
which I believe is then supposed to cause this rule to fire,
{{{
{-# RULES "TEXT literal" forall a.
unstream (S.map safe (S.streamList (GHC.unpackCString# a)))
= unpackCString# a #-}
}}}
Yet this appears not to happen in 7.10.2.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10528#comment:11>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list