#4945: Another SpecConstr infelicity
---------------------------------+------------------------------------------
    Reporter:  batterseapower    |       Owner:                         
        Type:  bug               |      Status:  new                    
    Priority:  normal            |   Component:  Compiler               
     Version:  7.0.1             |    Keywords:                         
    Testcase:                    |   Blockedby:                         
          Os:  Unknown/Multiple  |    Blocking:                         
Architecture:  Unknown/Multiple  |     Failure:  Runtime performance bug
---------------------------------+------------------------------------------
 I'm beginning to sound like a broken record, but SpecConstr still doesn't
 seem to be right! The last problem has been fixed, but I've found a new
 one.

 Please observe the output of compiling the attached code with:

 {{{
 ./ghc -fforce-recomp -c -dverbose-core2core -O2 -fno-liberate-case
 STUArray-Rewrite2.hs
 }}}

 In the output of SpecConstr we have a local letrec:

 {{{
 (letrec {
    $wa_s1G7 [Occ=LoopBreaker]
      :: forall s_aJm.
         Data.Array.Base.STUArray
           s_aJm GHC.Types.Int GHC.Types.Int
         -> GHC.Prim.Int#
         -> GHC.Prim.State# s_aJm
         -> (# GHC.Prim.State# s_aJm, () #)
    [LclId, Arity=3, Str=DmdType LLL]
    $wa_s1G7 =
      \ (@ s_aJm)
        (w_s1FS
           :: Data.Array.Base.STUArray
                s_aJm GHC.Types.Int GHC.Types.Int)
        (ww_s1FV :: GHC.Prim.Int#)
        (w_s1FX :: GHC.Prim.State# s_aJm) ->
        case GHC.Prim.># ww_s1FV ww_s1FN
        of wild_Xj [Dmd=Just A] {
          GHC.Types.False ->
            case w_s1FS
            of wild_aTj [Dmd=Just L]
            { Data.Array.Base.STUArray ds1_aTl [Dmd=Just U]
                                       ds2_aTm [Dmd=Just U]
                                       n_aTn [Dmd=Just U(L)]
                                       ds3_aTo [Dmd=Just A] ->
            case n_aTn
            of wild_aTs [Dmd=Just A]
            { GHC.Types.I# x_aTu [Dmd=Just L] ->
            case $wa_s1G0
                   @ s_aJm
                   w_s1FS
                   (GHC.Types.I# ww_s1FV)
                   0
                   (GHC.Prim.-# x_aTu 1)
                   w_s1FX
            of wild_XUw [Dmd=Just A]
            { (# new_s_XUB [Dmd=Just L], r_XUD [Dmd=Just A] #) ->
            $wa_s1G7
              @ s_aJm w_s1FS (GHC.Prim.+# ww_s1FV 1) new_s_XUB
            }
            }
            };
          GHC.Types.True -> (# w_s1FX, GHC.Unit.() #)
        }; } in
  $wa_s1G7)
 }}}

 This is a local recursive loop with an invariant first argument (w_s1FS)
 that is recrutinised every time! This seems deeply uncool.

 This is with HEAD (7.1.20110203, incorporating the patch "Fix typo in
 SpecConstr that made it not work at all")

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

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to