#7360: Case-of-identical-alts optimisation fails abjectly
---------------------------------+------------------------------------------
    Reporter:  simonpj           |       Owner:                  
        Type:  bug               |      Status:  new             
    Priority:  normal            |   Milestone:                  
   Component:  Compiler          |     Version:  7.6.1           
    Keywords:                    |          Os:  Unknown/Multiple
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown    
  Difficulty:  Unknown           |    Testcase:                  
   Blockedby:                    |    Blocking:                  
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by simonpj):

 I'm afraid I don't but let me try here to explain the issues, and you can
 have a go yourself.

 To implement my comment above, here are the changes I have in mind:

  * Remove the 'scrut' arg to `simplAlt` and `addBinderUnfolding`; simplify
 the latter by eliminating the `(Just v)` alternative.

  * Remove the call to `(isNothing scrut`) around line 2072 of
 `Simplify.lhs`

 Then you want to check that things are better. In particular I'd like
 to be confident that we have not thereby increased the number of
 simplifier iterations, or (worse still) claiming that something is
 dead when it isn't.

 So it would be good to run a nofib performance test before and after,
 with -dcore-lint.  That mainly checks runtime performance and
 allocation.  Adding `-ddump-simpl-stats` and looking for the
 `SimplifierDone` figure tells you the number of simplifier iterations,
 which should not increase.  We don't have an automated way to check that.

 Even this isn't ideal.  If we have
 {{{
 case x of y {
    [] -> length y
    (_:_) -> length y }
 }}}
 we won't combine the alteratives because `y` is alive in the alternatives.
 (See teh (necessary) call to `(isDeadBinder case_bndr')` online 2072 of
 `Simplify.lhs`.  This is silly.

 So the next thing I'd try is moving the `Merge Identical ALternatives`
 code from `mkCase1` to `prepareAlts`.  The latter happens ''before''
 the alternatives are simplified, so it'd be fine to simply combine the
 alternatives without messing with the occurrence info on the
 alternative binders at all.

 Again easy to try, but we'd want the same performance testing as
 before.  Would you like to try?

 Simon

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

_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to