[GHC] #9688: Improve the interaction between CSE and the join point transformation
GHC
ghc-devs at haskell.org
Mon Oct 13 09:16:52 UTC 2014
#9688: Improve the interaction between CSE and the join point transformation
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner:
Type: feature | Status: new
request | Milestone:
Priority: normal | Version: 7.9
Component: Compiler | Keywords: CSE
Resolution: | Architecture: Unknown/Multiple
Operating System: | Difficulty: Unknown
Unknown/Multiple | Blocked By:
Type of failure: Runtime | Related Tickets:
performance bug |
Test Case: |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
Indeed! It looks like a classic code-specialisation question to me. In
`digitToIntMaybe` you use some code `isHexDigit` that just happens to use
the same tests as the RHS, `digitToInt`. Moreover there are three ways for
`isHexDigit` to succeed. If you duplicate the RHS into those three
outcomes you'll get the result you want; this amounts to inlining
`$j_s2BC`. But that entails code duplication -- and might gain nothing
whatsoever.
Or, to put it another way, if the user wrote the above `Core`, complete
with the local function `$j_s2BC`, would you expect it to be optimised?
It would be cool if so. But I don't yet see how to achieve that at
reasonable cost.
To put it another way, if you wrote this in C:
{{{
if blah then x = e1 else x = e2
if similar-blah then s1 else s2
}}}
you'd usually expect to test `blah`, assign to `x`, and then test
`similar-blah` and do `s1` or `s2`. But it might be better to duplicate
(i.e. specialise) the first `if` into the branches:
{{{
if similar-blah then {
if blah then x=e1 else x=e2
s1
} else {
if blah then x=e1 else x=e2
s2
}
}}}
and now the inner `if` might be optimised away entirely.
These are not simple choices. By representing them as simple inlining
choices ("shall I inline `$j_s2Bc`?") GHC piggy backs on a lot of careful
heuristics for inlining. But, I agree, it does not always work well.
I have taken time to explain here, in the hope that someone can do better!
Simon
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9688#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list