[GHC] #13014: Seemingly unnecessary marking of a SpecConstr specialization as a loopbreaker
GHC
ghc-devs at haskell.org
Wed Dec 21 19:58:22 UTC 2016
#13014: Seemingly unnecessary marking of a SpecConstr specialization as a
loopbreaker
-------------------------------------+-------------------------------------
Reporter: nfrisby | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Resolution: | Keywords: SpecConstr
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 nfrisby):
Replying to [comment:9 simonpj]:
> Can you be more specific about "try very hard"? The thing is, as far as
I can see, it ''is'' loop breaker, as my comment shows. That is, not
marking it as such would allow arbitrary inlining.
My basic thought is that `DEEP_SPEC` is to `SPEC` as `SPECIALIZE INLINE`
is to `SPECIALIZE`. (Thus, `SPEC_INLINE` might be a better/more consistent
name than `DEEP_SPEC`.)
The hypothetical power user would intentionally choose `DEEP_SPEC` instead
of `SPEC` specifically to allow arbitrary inlining. With `SPEC` (i.e.
normal `-fspec-constr`), GHC assumes the burden of ensuring that the
specialization cannot lead to an infinite loop. By choosing `DEEP_SPEC`,
the user intentionally transfers this burden from GHC to themselves. The
docs for `DEEP_SPEC` would include a warning similar to those already
present for `SPECIALIZE INLINE` ("Warning: you can make GHC diverge by
using SPECIALISE INLINE on an ordinarily-recursive function") and `RULES`
("GHC makes no attempt to make sure that the rules are confluent or
terminating. For example: ... This rule will cause the compiler to go into
an infinite loop.").
`DEEP_SPEC` would be a tool for the power user who wrote the `f` and `boo`
functions you came up with and ''did'' want GHC to inline `f` 7 times so
that `boo` was identified as `0` at compile-time.
In terms of mechanism, I don't have enough command of `OccAnal` to be much
more specific. My basic idea is that it wouldn't mark the specializations
as a loopbreaker unless 1) the specialization ''directly calls itself by
name'' or 2) for whatever reason, `OccAnal` has no other choice. In other
words, GHC would only mark a `DEEP_SPEC` specialization as a loopbreaker
if it concluded that not doing so would ''always'' lead to an infinite
inlining --- "possibly infinite inlining" would no longer be cause enough
to mark a particular specialization as a loopbreaker.
I'll mention one last time that I do not have a real-world motivation for
this new behavior in-hand. It doesn't seem like an obviously bad idea
(buoyed by saying "power user" and "warnings in the docs"). But it's also
not obviously better than all currently existing choices for this
hypothetical power user! I just haven't thought about this long enough
yet.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13014#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list