[project @ 2001-03-20 12:37:25 by simonpj]
authorsimonpj <unknown>
Tue, 20 Mar 2001 12:37:25 +0000 (12:37 +0000)
committersimonpj <unknown>
Tue, 20 Mar 2001 12:37:25 +0000 (12:37 +0000)
-------------------------------------
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.

ghc/compiler/prelude/PrimOp.lhs

index e5c1727..f96617d 100644 (file)
@@ -363,7 +363,7 @@ See also @primOpIsCheap@ (below).
 primOpOkForSpeculation :: PrimOp -> Bool
        -- See comments with CoreUtils.exprOkForSpeculation
 primOpOkForSpeculation op 
-  = primOpIsCheap op && not (primOpCanFail op)
+  = not (primOpHasSideEffects op || primOpOutOfLine op || primOpCanFail op)
 \end{code}
 
 
@@ -376,8 +376,9 @@ than once.  Evaluation order is unaffected.
 
 \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