[vector] #47: Fusion broken with ghc7-rc2

vector vector at projects.haskell.org
Mon Nov 1 18:43:26 EDT 2010


#47: Fusion broken with ghc7-rc2
---------------------+------------------------------------------------------
Reporter:  choener   |       Owner:          
    Type:  defect    |      Status:  new     
Priority:  critical  |   Milestone:          
 Version:  0.7       |    Keywords:  ghc7-rc2
---------------------+------------------------------------------------------
 Hi,

 maybe it is too late but GHCi, version 7.0.0.20101028 (ghc7 rc2) seems to
 badly break fusion.

 Consider this program:
 {{{
 module Main where

 import qualified Data.Vector.Unboxed as VU



 mk :: Int -> VU.Vector Int
 mk k = {-# CORE "VUmk" #-} VU.enumFromN 1 k
 {-# INLINE mk #-}

 join1 :: Int -> VU.Vector Int
 join1 k = {-# CORE "VUjoin" #-} VU.zipWith (\k l -> k+l) (VU.map (\k ->
 k+1) $ mk k) (VU.map (\k -> k*5) $ mk k)
 {-# INLINE join1 #-}

 join2 :: Int -> VU.Vector Int
 join2 k = {-# CORE "VUjoin2" #-} VU.map (\k -> k+1) $ mk k
 {-# INLINE join2 #-}

 main = do
   print $ {-# CORE "VUsum1" #-} VU.sum $ join1 20
   print $ {-# CORE "VUsum2" #-} VU.sum $ join2 20
   print $ {-# CORE "VUsum3" #-} VU.sum $ VU.map (\k -> k+1) $ VU.enumFromN
 (1 :: Int) 20
 }}}

 where I wanted to see if 'join1' produces good code -- if yes then I could
 split some calculations up more easily.

 What ghc 6.12.3 produces is this:
 {{{
 main_$s$wfoldlM'_loop1 =
   \ (sc_s1Oe :: Int#)
     (sc1_s1Of :: Int#)
     (sc2_s1Og :: Int#) ->
     case ># sc_s1Oe 0 of _ {
       False -> sc2_s1Og;
       True ->
         main_$s$wfoldlM'_loop1
           (-# sc_s1Oe 1)
           (+# sc1_s1Of 1)
           (+# sc2_s1Og (+# sc1_s1Of 1))
     }

 main3 :: String
 GblId

 main3 =
   case __core_note "VUsum2"
        (case main_$s$wfoldlM'_loop1 20 1 0 of ww_s1MG { __DEFAULT ->
         I# ww_s1MG
         })
   of _ { I# ww_a1Iu ->
   $wshowSignedInt 0 ww_a1Iu ([] @ Char)
   }
 }}}

 So far, so good. Now comes rc2:

 {{{
 main3 =
   case __core_note "VUsum2"
        (case (__core_note "VUmk"
               (runSTRep
                  @ (Data.Vector.Unboxed.Base.Vector Int) main4))
              `cast` (trans
                        Data.Vector.Unboxed.Base.TFCo:R:VectorInt
                        Data.Vector.Unboxed.Base.NTCo:R:VectorInt
                      :: Data.Vector.Unboxed.Base.Vector Int
                           ~
                         Data.Vector.Primitive.Vector Int)
         of _ { Data.Vector.Primitive.Vector ipv_s2oo ipv1_s2op ipv2_s2oq
 ->
         letrec {
           $s$wfoldlM'_loop_s2Bw [Occ=LoopBreaker]
             :: Int# -> Int# -> Int#

           $s$wfoldlM'_loop_s2Bw =
             \ (sc_s2yG :: Int#) (sc1_s2yH :: Int#) ->
               case >=# sc_s2yG ipv1_s2op of _ {
                 False ->
                   $s$wfoldlM'_loop_s2Bw
                     (+# sc_s2yG 1)
                     (+#
                        sc1_s2yH
                        (+#
                           (indexIntArray# ipv2_s2oq (+# ipv_s2oo sc_s2yG))
                           1));
                 True -> sc1_s2yH
               }; } in
         case $s$wfoldlM'_loop_s2Bw 0 0 of ww_s2vB { __DEFAULT ->
         I# ww_s2vB
         }
         })
   of _ { I# ww_a2r6 ->
   $wshowSignedInt 0 ww_a2r6 ([] @ Char)
   }
 }}}

 This seems rather bad ;-)

 I'd like to hear that it's my fault and I should better learn how to use
 ghc.

-- 
Ticket URL: <http://trac.haskell.org/vector/ticket/47>
vector <http://trac.haskell.org/vector>
Package vector


More information about the vector mailing list