The normal way to make a non-primitive function is to use an ordinary Haskell
function, for example:

myFunc x = x * 4 + 5

However, such functions are inevitably inlined into the program expression
when applied. noInline can be thought of as a way to protect a function
against inlining (but later transformations may choose to inline anyway).

Ideally, it should be posssible to reuse such a function several times, but
at the moment this does not work. Every application of a noInline function
results in a new copy of the function in the core program.