[GHC] #13353: foldr/nil rule not applied consistently
GHC
ghc-devs at haskell.org
Wed Mar 1 09:27:24 UTC 2017
#13353: foldr/nil rule not applied consistently
-------------------------------------+-------------------------------------
Reporter: nomeata | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Compile-time | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
> So it seems that after splitting the function into two pieces, it is
small enough(?) so that both pieces inline?
Yes that is galling I agree.
* Part of the trouble is that strictness analysis does a deep semantic
analysis, pulls all the evals to the top, inlines them unconditionally,
leaving behind a worker that may now be a lot smaller. The `sizeExpr`
code in `CoreUnfold` is necessarily much simpler.
* The discount we award for a scrutinised argument is computed in
`size_up` here:
{{{
alts_size (SizeIs tot tot_disc tot_scrut)
-- Size of all alternatives
(SizeIs max _ _)
-- Size of biggest alternative
= SizeIs tot (unitBag (v, 20 + tot - max)
`unionBags` tot_disc) tot_scrut
}}}
For a single-alternative case (and you have a tuple arg here) `tot` =
`max`, so there's fixed discount of 20. You could make that into a
controllable flag and try varying it.
* Idea. If a function ''starts'' with `case x of blah` (even if wrapped
in lets) we know that the strictness analyser will find it strict in x.
So we know it'll generate a wrapper, and the wrapper will inline. So in
the end it'll be as if that case cost nothing at all. It would not be
hard to make `sizeExpr` simply count zero for the cost of such cases;
including nested. (Certainly for single-alternative ones.)
Worth a try?
Simon
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13353#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list