[GHC] #10844: CallStack should not be inlined

GHC ghc-devs at haskell.org
Thu Oct 15 18:14:03 UTC 2015


#10844: CallStack should not be inlined
-------------------------------------+-------------------------------------
        Reporter:  nomeata           |                Owner:  gridaphobe
            Type:  task              |               Status:  patch
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  Phab:D1259
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by gridaphobe):

 I'm not very impressed with the performance metrics on Phab:D1259
 ([https://gist.github.com/gridaphobe/0657f02571e6df4588f7 nofib diff]),
 and I have a small example that I think may illustrate the problem.

 {{{
 foo x = "foo" ++ x

 boo = "foo"
 }}}

 Compare what ghc-master does

 {{{
 % ghc -O -fforce-recomp -ddump-simpl -dsuppress-all Foo.hs
 [1 of 1] Compiling Foo              ( Foo.hs, Foo.o )

 ==================== Tidy Core ====================
 Result size of Tidy Core = {terms: 8, types: 8, coercions: 0}

 boo
 boo = unpackCString# "foo"#

 foo
 foo = \ x_amS -> unpackAppendCString# "foo"# x_amS
 }}}

 to what my branch does

 {{{
 % ./inplace/bin/ghc-stage2 -O -fforce-recomp -ddump-simpl -dsuppress-all
 Foo.hs
 [1 of 1] Compiling Foo              ( Foo.hs, Foo.o )

 ==================== Tidy Core ====================
 Result size of Tidy Core = {terms: 8, types: 9, coercions: 0}

 -- RHS size: {terms: 2, types: 0, coercions: 0}
 boo
 boo = unpackCString# "foo"#

 -- RHS size: {terms: 4, types: 3, coercions: 0}
 foo
 foo = \ x_anI -> ++ boo x_anI
 }}}

 Lifting the boxed string literal to a top-level binder prevents ghc from
 rewriting the `++` to `unpackAppendCString#`. Why? Because `boo` is a
 `String` not an `Addr#`, so applying the rewrite would require inlining
 the `"foo"#` string literal, which ghc does not want to do.

 What we really want (I think) is to make a top-level binder for `"foo"# ::
 Addr#`, so we'd end up with something like

 {{{
 foo# = "foo"#

 boo = unpackCString# foo#

 foo = \ x_amS -> unpackAppendCString# foo# x_amS
 }}}

 Concretely, I propose that the desugarer-specific `mkStringExpr` function
 create '''two''' top-level binders, one for the `Addr#` and one for the
 `String`. That should let us share the unboxed string '''and''' the boxed
 string.


 Does this seem reasonable? Or is my sample program simply a non-issue?

 (Sorry to keep jumping back and forth between phab and trac, but this
 seemed to fit better on the ticket than on the diff.)

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10844#comment:13>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list