Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: GHC <trac <at> galois.com>
Subject: [GHC] #2255: Improve SpecConstr for free variables
Newsgroups: gmane.comp.lang.haskell.glasgow.bugs
Date: Thursday 1st May 2008 07:43:46 UTC (over 8 years ago)
#2255: Improve SpecConstr for free variables
-----------------------------------------+----------------------------------
    Reporter:  simonpj                   |       Owner:         
        Type:  run-time performance bug  |      Status:  new    
    Priority:  normal                    |   Milestone:  _|_    
   Component:  Compiler                  |     Version:  6.8.2  
    Severity:  normal                    |    Keywords:         
  Difficulty:  Unknown                   |    Testcase:         
Architecture:  Unknown                   |          Os:  Unknown
-----------------------------------------+----------------------------------
 This ticket records a suggestion for improving `SpecConstr`, so we don't
 lose it. The original `SpecConstr` transformation is described in
 "[http://research.microsoft.com/%7Esimonpj/papers/spec-constr
Call pattern
 specialisation for Haskell]".  Consider this program
 {{{
    f x = let g y = ...case x of { z:zs -> e1; [] -> e2 } ...
           in
           ...case x of
                 z:zs -> if ... then g 3 else g 4
                 []   -> ...
 }}}
 Here 'x' is free in 'g', but x's value is known at g's call sites.  It's
 not enough just to know "x is a cons" inside g; we must also have access
 to z,zs.  So perhaps the thing to do is to imagine lambda-lifting 'g' to
 become 'gl' thus:
 {{{
   gl x y = ...case x of { z:zs -> e1; [] -> e2 } ...

   f x = ...case x of
                 z:zs -> if ... then gl x 3 else gl x 4
                 []   -> ...
 }}}
 Now the `SpecConstr` transformation will apply nicely.  And it's arguably
 a bad shortcoming that currently the mere act of lambda lifting can
affect
 how effective `SpecConstr` is.

 Of course, we only want to lambda-lift wrt the parameters that'll be
 specialised, so this transformation probably wants to be done at the same
 time as the rest of `SpecConstr`. I don't have much idea of how hard
 that'd be, but it's a nice idea.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2255>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
 
CD: 39ms