-------------------------------------
Be less keen about inlining primops
-------------------------------------
Marcin pointed out that it's bad to take
let x = a +# (b *# c)
in
x + f x + g x
and inline x to get
(a +# (b *# c)) +
f (a +# (b *# c)) +
g (a +# (b *# c))
Yet that's just what we were doing. The offending clause is
in PrimOp.primOpIsCheap, which regards some primop applications
as 'cheap' (and hence freely duplicable).
For now, I've made it return False. Let's see what that does.
primOpOkForSpeculation :: PrimOp -> Bool
-- See comments with CoreUtils.exprOkForSpeculation
primOpOkForSpeculation op
- = primOpIsCheap op && not (primOpCanFail op)
+ = not (primOpHasSideEffects op || primOpOutOfLine op || primOpCanFail op)
\end{code}
\begin{code}
primOpIsCheap :: PrimOp -> Bool
- -- See comments with CoreUtils.exprOkForSpeculation
-primOpIsCheap op = not (primOpHasSideEffects op || primOpOutOfLine op)
+primOpIsCheap op = False
+ -- March 2001: be less eager to inline PrimOps
+ -- Was: not (primOpHasSideEffects op || primOpOutOfLine op)
\end{code}
primOpIsDupable