INLINE_FUSED pragma in Haskell

haskell, inline, optimization, vector, vectorization

Solution

The definitions mean that `INLINE_FUSED` is the same as `INLINE [1]`; `INLINE_INNER` is the same as `INLINE [0]`. The `[1]` and `[0]` are standard ghc for ordering the phases of inlining. See the discussion under the heading 7.13.5.5. Phase control in http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html

`vector` needs to control the stages at which `ghc` inlines various definitions. First it wants all uses of the functions `stream` and `unstream` to be exposed, so that (above all) `stream.unstream` can be replaced by `id`, and similarly in other cases, according to the (rewrite) RULE pragmas distributed throughout.

Typical vector to vector functions are written as `unstream . f . stream`, where f is a Stream to Stream function. `unstream` builds an actual vector in memory from a `Stream`; `stream` reads a real vector into a `Stream`. The object of the game is to reduce the number of actual vectors built. So the composition of three vector to vector functions

 f_vector . g_vector . h_vector

is really

 unstream . f_stream . stream . unstream . g_stream . stream . unstream . h_stream . stream

which his rewritten to

 unstream . f_stream . g_stream . h_stream . stream

and so on. So we write one new vector instead of three.

The rules for `transform` are a little fancier than this, but belong with the same subtle system of ordering:

 transform f g (unstream s) = unstream (Bundle.inplace f g s)
 transform f1 g1 (transform f2 g2 p) = transform (f1 . f2) (g1 . g2) p

in https://github.com/haskell/vector/blob/master/Data/Vector/Generic/New.hs#L76

so you can see how something inlined in the form:

unstream . h_stream . stream . transform f1 g1 . transform f2 g2 
                    . unstream . j_stream . stream $ input_vector

would be rewritten.

Problem

I am going over the vector library and noticed a `{-# INLINE_FUSED transform #-}` and I was wondering what it does? I see it defined in `vector.h` but nowhere else.

Original source