Avoiding CAF's

Neil Mitchell ndmitchell at gmail.com
Mon May 21 06:36:48 EDT 2007


> >    case Main.$wccall GHC.Prim.realWorld# of wild_X28 { (# ds_d2ad,
> > ds1_d2ac #) ->
> >
> > i.e. it has had an artificial box put around the answer. It may be
> > impossible to eliminate this, but if it is, I'd like to try.
> There's no actual box here.  The ccall returns an unboxed tuple with two
> components, one of which has void type (State# RealWorld), so it has no runtime
> representation.  The other component will be stored/returned in a register.
> Make sure your ccalls are annotated with unsafe, if you're not already.

That is good news. They are already unsafe.

> > I realise all of this trickery is against the spirit of a pure
> > functional language, and is making assumptions that are not required
> > to remain true. Right now I just want the fastest possible benchmarks
> > though.
> Ok, but suppose you get some good results - what's the point?  None of this is
> guaranteed to work tomorrow.  Why not aim for a robust translation into Core
> that preserves the semantics?  It can't be that hard to pass around a State#
> RealWorld, can it?

Yhc introduces all the necessary machinery to thread state through
properly - so it starts off semantics correct. I then apply semantics
preserving transformations, which means that the code still includes a
threaded state - its just really hard to see where it went.

Since I seem to have ended up passing an extra Int around as a dummy
state, to stop GHC from CAF'ing stuff, it does seem to make more sense
to use the GHC state from the beginning.



More information about the Glasgow-haskell-users mailing list