#4978: Continuation passing style loop doesn't compile into a loop
---------------------------------+------------------------------------------
    Reporter:  tibbe             |        Owner:              
        Type:  bug               |       Status:  new         
    Priority:  normal            |    Milestone:              
   Component:  Compiler          |      Version:  7.0.1       
    Keywords:                    |     Testcase:              
   Blockedby:                    |   Difficulty:              
          Os:  Unknown/Multiple  |     Blocking:              
Architecture:  Unknown/Multiple  |      Failure:  None/Unknown
---------------------------------+------------------------------------------

Comment(by simonpj):

 So HEAD (and 7.0.2) does a much better job here.  It has a simple arity
 analyser that (somewhat to my surprise) is clever enough to spot that
 `test2` really has arity 3.  Your earlier example was in fact nastier,
 because `test4`'s arity depended on its parameter `k`, which isn't the
 case with your new example.

 Anyway try HEAD of 7.0.2.

 {{{
 T4978a.test2 [Occ=LoopBreaker]
   :: [GHC.Word.Word8]
      -> (T4978a.Buffer -> [Data.ByteString.Internal.ByteString])
      -> T4978a.Buffer
      -> [Data.ByteString.Internal.ByteString]
 [GblId, Arity=3, Str=DmdType SC(S)L]
 T4978a.test2 =
   \ (ds_dQG :: [GHC.Word.Word8])
     (eta_B1 :: T4978a.Buffer -> [Data.ByteString.Internal.ByteString])
     (eta1_X2 :: T4978a.Buffer) ->
     case ds_dQG of _ {
       [] -> eta_B1 eta1_X2;
       : x1_ax6 xs1_ax7 ->
         case eta1_X2
         of _ { T4978a.Buffer rb_dQL rb1_dQM rb2_dQN rb3_dQO rb4_dQP ->
         case GHC.Prim.<=# 1 rb4_dQP of _ {
           GHC.Bool.False ->
             lvl1_rYs
             `cast` (CoUnsafe
                       T4978a.Builder [Data.ByteString.Internal.ByteString]
                     :: T4978a.Builder ~
 [Data.ByteString.Internal.ByteString]);
           GHC.Bool.True ->
             case x1_ax6 of _ { GHC.Word.W8# x2_aWt ->
             case GHC.Prim.writeWord8OffAddr#
                    @ GHC.Prim.RealWorld
                    (GHC.Prim.plusAddr# rb_dQL (GHC.Prim.+# rb2_dQN
 rb3_dQO))
                    0
                    x2_aWt
                    GHC.Prim.realWorld#
             of s2_aWv { __DEFAULT ->
             case GHC.Prim.touch#
                    @ GHC.ForeignPtr.ForeignPtrContents rb1_dQM s2_aWv
             of _ { __DEFAULT ->
             T4978a.test2
               xs1_ax7
               eta_B1
               (T4978a.Buffer
                  rb_dQL
                  rb1_dQM
                  rb2_dQN
                  (GHC.Prim.+# rb3_dQO 1)
                  (GHC.Prim.-# rb4_dQP 1))
             }
             }
             }
         }
         }
     }
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4978#comment:4>
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