[GHC] #855: Improvements to SpecConstr
GHC
ghc-devs at haskell.org
Tue Feb 27 18:32:48 UTC 2018
#855: Improvements to SpecConstr
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: (none)
Type: task | Status: new
Priority: normal | Milestone: ⊥
Component: Compiler | Version: 6.4.2
Resolution: | Keywords: SpecConstr
Operating System: Unknown/Multiple | Architecture:
Type of failure: Runtime | Unknown/Multiple
performance bug | Test Case: N/A
Blocked By: | Blocking: 915
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by sgraf):
Long story short, I had success with the following
[https://github.com/sgraf812/ghc/compare/master...sgraf812:stream-fusion
diff]. Currently, it optimizes `ex1` to this code:
{{{
-- RHS size: {terms: 39, types: 21, coercions: 0, joins: 3/3}
Main.$wex1 [InlPrag=NOINLINE] :: GHC.Prim.Int# -> GHC.Prim.Int#
[GblId, Arity=1, Caf=NoCafRefs, Str=<S,U>, Unf=OtherCon []]
Main.$wex1
= \ (ww_s4pl :: GHC.Prim.Int#) ->
joinrec {
$s$wgo_s4rk
:: GHC.Prim.Int# -> GHC.Prim.Int# -> GHC.Prim.Int# ->
GHC.Prim.Int#
[LclId[JoinId(3)], Arity=3, Str=<L,A><S,U><S,U>]
$s$wgo_s4rk _ [Occ=Dead]
(sc1_s4ri :: GHC.Prim.Int#)
(sc2_s4rh :: GHC.Prim.Int#)
= jump $s$wgo2_s4rc sc1_s4ri sc2_s4rh;
$s$wgo1_s4rg
:: GHC.Prim.Int# -> GHC.Prim.Int# -> GHC.Prim.Int# ->
GHC.Prim.Int#
[LclId[JoinId(3)], Arity=3, Str=<S,U><S,U><S,U>]
$s$wgo1_s4rg (sc_s4rf :: GHC.Prim.Int#)
(sc1_s4re :: GHC.Prim.Int#)
(sc2_s4rd :: GHC.Prim.Int#)
= jump $s$wgo_s4rk sc_s4rf sc1_s4re (GHC.Prim.+# sc2_s4rd
sc_s4rf);
$s$wgo2_s4rc [Occ=LoopBreaker]
:: GHC.Prim.Int# -> GHC.Prim.Int# -> GHC.Prim.Int#
[LclId[JoinId(2)], Arity=2, Str=<S,U><S,U>, Unf=OtherCon []]
$s$wgo2_s4rc (sc_s4rb :: GHC.Prim.Int#) (sc1_s4ra ::
GHC.Prim.Int#)
= case GHC.Prim.<# sc_s4rb ww_s4pl of {
__DEFAULT -> sc1_s4ra;
1# ->
jump $s$wgo1_s4rg
(GHC.Prim.*# sc_s4rb sc_s4rb) (GHC.Prim.+# sc_s4rb 1#)
sc1_s4ra
}; } in
jump $s$wgo2_s4rc 1# 0#
}}}
Which is just a stone throw (or rather an inlining pass) away from the
`goal`!
For the examples `ex{2,3}` with increasing nesting level, things don't
look so bright yet. Also I got some cleanup work to do tomorrow.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/855#comment:19>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list