[GHC] #10005: Operations on string literals won't be inlined
GHC
ghc-devs at haskell.org
Mon Jan 26 13:05:53 UTC 2015
#10005: Operations on string literals won't be inlined
-------------------------------------+-------------------------------------
Reporter: fread2281 | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.4
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Compile-time | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
-------------------------------------+-------------------------------------
Comment (by simonpj):
We wanted literal strings to be good producers, so that `map f "wubble"`
would work without generating and then pattern matching on the
intermediate string.
That is why `"foo"` desugars to
{{{
build (unpackFoldrCString# "foo"#)
}}}
This seems reasonable.
Now `head` has this rule:
{{{
"head/build" forall (g::forall b.(a->b->b)->b->b) .
head (build g) = g (\x _ -> x) badHead
}}}
(goal: make `head` a good consumer), and that rule fires on `head "foo"`
giving the result in comment:1.
It is a bit stupid, but I don't see an immediate way out. One alternative
would be to kill off the `head/build` rule. After all, most `fold/build`
rules save an entire traversal of the list whereas this one saves the
allocation and pattern match on a single cons cell. So the win is much
smaller.
If someone would like to
* Switch off RULES `head/build` and `head/augment` (in `GHC.List`)
* See what performance difference, if any, happens in `nofib`
* Track down any increases
that would be a splendid thing.
More radical would be to nuke the entire `unpackFoldrCString` ideaa, so
that literal strings are not good producers. But I think that would
probably be bad.
Simon
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10005#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list