[GHC] #683: RULES for recursive functions don't work properly

GHC trac at galois.com
Tue Feb 7 12:03:49 EST 2006


#683: RULES for recursive functions don't work properly
-------------------------+--------------------------------------------------
    Reporter:  simonpj   |        Owner:  simonpj
        Type:  bug       |       Status:  new    
    Priority:  normal    |    Milestone:  6.6    
   Component:  Compiler  |      Version:  6.4.1  
    Severity:  normal    |     Keywords:         
          Os:  Unknown   |   Difficulty:  Unknown
Architecture:  Unknown   |  
-------------------------+--------------------------------------------------
someone mentioned to me that this expression:

   mapM_ action [n..m]

 isn't being optimised properly, so I thought I'd look into it.  Sure
 enough, we don't get down to a simple loop like we should, although the
 F/B transformation is happening (see ~simonmar/scratch/mapm.hs).  The
 problem is that GHC.Enum.eftIntFB isn't being inlined, it's defined like
 this:

 {-# INLINE [0] eftIntFB #-}
 eftIntFB :: (Int -> r -> r) -> r -> Int# -> Int# -> r
 eftIntFB c n x y | x ># y    = n
                  | otherwise = go x
                  where
                    go x = I# x `c` if x ==# y then n else go (x +# 1#)

 but, strangely, the inlining doesn't appear in the interface:

 eftIntFB :: (GHC.Base.Int -> r -> r) -> r -> GHC.Prim.Int# ->
 GHC.Prim.Int# -> r
   {- Arity: 4 HasNoCafRefs Strictness: LLLL -}

 This is becuase the RULE make eftIntFB look recursive, so its inlining
 isnt' exposed.  Bad, bad.

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


More information about the Glasgow-haskell-bugs mailing list