Stricness of floor etc

Ian Lynagh igloo@earth.li
Tue, 18 Mar 2003 14:00:41 +0000


On Tue, Mar 18, 2003 at 10:22:52AM -0000, Simon Marlow wrote:
> 
> > floor1 :: forall b. (GHC.Real.Integral b) =>
> >           Double -> b
> >             __S L
> 
> This floor is the dictionary selector, and for various (complicated
> looking) reasons it is lazy in its dictionary argument.

Aha! Thanks.

> > Of course a strict floor (Double to Int and Integer) is what 
> > I'm really
> > hoping for (without having to specify it explicitly with $! 
> > in my code).
> 
> There are specialised versions of floor for Double -> Int and Double ->
> Integer.  You *ought* to get good code out if you call floor at one of
> these types.  If not, please send us the example.

Well, with the following module, with the strictnesses in comments, it
seems to me that floor is lazy even when explicitly given the type
Double -> Int - am I confused again? It also looks to me like addition
of unboxed Ints is also treated as being lazy.

    import GHC.Base

    foo :: Int# -> Int# -> Int#
    foo = (+#)                              -- __S LL

    bar :: Int -> Int -> Int
    bar = (+)                               -- __S U(L)U(L)m

    baz :: Integer -> Integer -> Integer
    baz = (+)                               -- __S SS

    quux :: Double -> Int
    quux x = floor x                        -- __S L

-ddump-simpl gives the following for quux:

Str.quux = \ x :: GHC.Float.Double ->
             case GHC.Float.properFraction2
                    @ GHC.Base.Int GHC.Real.$fIntegralInt x
             of wild { (n, r) ->
             case r of wild1 { GHC.Float.D# x1 ->
             case GHC.Prim.<## x1 0.0 of wild2 {
               GHC.Base.True ->
                 case n of wild11 { GHC.Base.I# x11 ->
                 GHC.Base.I# (GHC.Prim.-# x11 1)
                 };
               GHC.Base.False -> n
             }
             }
             }


Thanks
Ian