[GHC] #7796: improve dead code elimination in CorePrep

GHC cvs-ghc at haskell.org
Fri Mar 29 12:59:50 CET 2013


#7796: improve dead code elimination in CorePrep
---------------------------------------------+------------------------------
  Reporter:  nfrisby                         |          Owner:  nfrisby         
      Type:  bug                             |         Status:  closed          
  Priority:  normal                          |      Milestone:                  
 Component:  Compiler                        |        Version:  7.6.2           
Resolution:  fixed                           |       Keywords:                  
        Os:  Unknown/Multiple                |   Architecture:  Unknown/Multiple
   Failure:  None/Unknown                    |     Difficulty:  Unknown         
  Testcase:  simplCore/should_compile/T7796  |      Blockedby:                  
  Blocking:                                  |        Related:  #4962 #5433     
---------------------------------------------+------------------------------
Changes (by simonpj):

  * testcase:  => simplCore/should_compile/T7796
  * difficulty:  => Unknown


Old description:

> #4962 is about generating code for (and allocating at runtime!) bindings
> that are kept alive only by RULEs even though the RULEs are useless
> downstream of .hi file generation.
>
> Simon Marlow's patch for #5433 switched to a custom dead code eliminator,
> since the "(case) binder swap" in OccurAnal was creating breaking some
> code generator invariants.
>
> However, that custom dead code generator doesn't do a dependency
> analysis, so a letrec like this
>
> {{{
> let f = [g] \r [...] -> ...
>     g = [g] \r [...] -> ...
> in ... g ...
> }}}
>
> is sent to the code generator ''without dropping'' `f`.
>
> A patch to use a dependency analysis in CorePrep's dead code eliminator
> improves allocation for several nofib programs (largest: cryptarithm2,
> knights, fem).
>
> {{{
>             Min          -0.0%     -4.2%     -7.7%     -7.7%     -5.9%
>             Max          +0.0%     +0.0%     +4.3%     +4.3%    +14.3%
>  Geometric Mean          -0.0%     -0.1%     -0.2%     -0.2%     +0.2%
> }}}

New description:

 #4962 is about generating code for (and allocating at runtime!) bindings
 that are kept alive only by RULEs even though the RULEs are useless
 downstream of .hi file generation.

 Simon Marlow's patch for #5433 switched to a custom dead code eliminator,
 since the "(case) binder swap" in !OccurAnal was creating breaking some
 code generator invariants.

 However, that custom dead code generator doesn't do a dependency analysis,
 so a letrec like this

 {{{
 let f = [g] \r [...] -> ...
     g = [g] \r [...] -> ...
 in ... g ...
 }}}

 is sent to the code generator ''without dropping'' `f`.

 A patch to use a dependency analysis in !CorePrep's dead code eliminator
 improves allocation for several nofib programs (largest: cryptarithm2,
 knights, fem).

 {{{
             Min          -0.0%     -4.2%     -7.7%     -7.7%     -5.9%
             Max          +0.0%     +0.0%     +4.3%     +4.3%    +14.3%
  Geometric Mean          -0.0%     -0.1%     -0.2%     -0.2%     +0.2%
 }}}

--

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



More information about the ghc-tickets mailing list