From 218397190cbb776544f68b91859a850ed92b85a0 Mon Sep 17 00:00:00 2001
From: simonmar <unknown>
Date: Mon, 22 May 2000 11:38:08 +0000
Subject: [PATCH] [project @ 2000-05-22 11:38:08 by simonmar] be more
 conservative about inlining PrimOp Ids.

---
 ghc/compiler/coreSyn/CoreUtils.lhs | 56 ++++++++++++++++++------------
 1 file changed, 33 insertions(+), 23 deletions(-)

diff --git a/ghc/compiler/coreSyn/CoreUtils.lhs b/ghc/compiler/coreSyn/CoreUtils.lhs
index 583c32aa5c99..4992e535f5ea 100644
--- a/ghc/compiler/coreSyn/CoreUtils.lhs
+++ b/ghc/compiler/coreSyn/CoreUtils.lhs
@@ -43,10 +43,11 @@ import VarEnv
 import Name		( isLocallyDefined, hashName )
 import Literal		( Literal, hashLiteral, literalType )
 import DataCon		( DataCon, dataConRepArity )
-import PrimOp		( primOpOkForSpeculation, primOpIsCheap )
-import Id		( Id, idType, idFlavour, idStrictness, idLBVarInfo, mkWildId,
-			  idArity, idName, idUnfolding, idInfo, isDataConId_maybe
-
+import PrimOp		( primOpOkForSpeculation, primOpIsCheap, 
+			  primOpIsDupable )
+import Id		( Id, idType, idFlavour, idStrictness, idLBVarInfo, 
+			  mkWildId, idArity, idName, idUnfolding, idInfo, 
+			  isDataConId_maybe, isPrimOpId_maybe
 			)
 import IdInfo		( arityLowerBound, InlinePragInfo(..),
 			  LBVarInfo(..),  
@@ -226,21 +227,25 @@ mkIfThenElse guard then_expr else_expr
 %*									*
 %************************************************************************
 
-@exprIsTrivial@	is true of expressions we are unconditionally 
-		happy to duplicate; simple variables and constants,
-		and type applications.
+@exprIsTrivial@ is true of expressions we are unconditionally happy to
+		duplicate; simple variables and constants, and type
+		applications.  Note that primop Ids aren't considered
+		trivial unless 
+
 
 @exprIsBottom@	is true of expressions that are guaranteed to diverge
 
 
 \begin{code}
-exprIsTrivial (Type _)	     = True
-exprIsTrivial (Lit lit)      = True
-exprIsTrivial (Var v) 	     = True
-exprIsTrivial (App e arg)    = isTypeArg arg && exprIsTrivial e
-exprIsTrivial (Note _ e)     = exprIsTrivial e
-exprIsTrivial (Lam b body)   | isTyVar b = exprIsTrivial body
-exprIsTrivial other	     = False
+exprIsTrivial (Var v)
+  | Just op <- isPrimOpId_maybe v      = primOpIsDupable op
+  | otherwise                          = True
+exprIsTrivial (Type _)	      	       = True
+exprIsTrivial (Lit lit)       	       = True
+exprIsTrivial (App e arg)     	       = isTypeArg arg && exprIsTrivial e
+exprIsTrivial (Note _ e)      	       = exprIsTrivial e
+exprIsTrivial (Lam b body) | isTyVar b = exprIsTrivial body
+exprIsTrivial other	      	       = False
 \end{code}
 
 
@@ -692,22 +697,27 @@ exprSize :: CoreExpr -> Int
 	-- A measure of the size of the expressions
 	-- It also forces the expression pretty drastically as a side effect
 exprSize (Var v)       = varSize v 
-exprSize (Lit lit)     = 1
+exprSize (Lit lit)     = lit `seq` 1
 exprSize (App f a)     = exprSize f + exprSize a
 exprSize (Lam b e)     = varSize b + exprSize e
 exprSize (Let b e)     = bindSize b + exprSize e
-exprSize (Case e b as) = exprSize e + varSize b + foldr ((+) . altSize) 0  as
-exprSize (Note n e)    = exprSize e
-exprSize (Type t)      = seqType t `seq`
-			 1
+exprSize (Case e b as) = exprSize e + varSize b + foldr ((+) . altSize) 0 as
+exprSize (Note n e)    = noteSize n + exprSize e
+exprSize (Type t)      = seqType t `seq` 1
+
+noteSize (SCC cc)       = cc `seq` 1
+noteSize (Coerce t1 t2) = seqType t1 `seq` seqType t2 `seq` 1
+noteSize InlineCall     = 1
+noteSize InlineMe       = 1
+noteSize (TermUsg usg)  = usg `seq` 1
 
 exprsSize = foldr ((+) . exprSize) 0 
 
 varSize :: Var -> Int
-varSize b | isTyVar b = 1
-	  | otherwise = seqType (idType b)		`seq`
-			megaSeqIdInfo (idInfo b) 	`seq`
-			1
+varSize b  | isTyVar b = 1
+	   | otherwise = seqType (idType b)		`seq`
+			 megaSeqIdInfo (idInfo b) 	`seq`
+			 1
 
 varsSize = foldr ((+) . varSize) 0
 
-- 
GitLab