summaryrefslogtreecommitdiff
path: root/compiler/codeGen/CgUtils.hs
diff options
context:
space:
mode:
authorJohan Tibell <johan.tibell@gmail.com>2011-05-19 17:34:20 +0200
committerJohan Tibell <johan.tibell@gmail.com>2011-05-30 20:12:05 +0200
commit18691d440f90a3dff4ef538091c886af505e5cf5 (patch)
treef133c7e64149bfe2c7c5d7553429b51e66c67ca8 /compiler/codeGen/CgUtils.hs
parent622c3cfe2b3ebde891981544c0eea525eaa55e6f (diff)
downloadhaskell-18691d440f90a3dff4ef538091c886af505e5cf5.tar.gz
Make assignTemp_ less pessimistic
assignTemp_ is intended to make sure that the expression gets assigned to a temporary in case that's needed in order to avoid a register getting trashed due to a function call.
Diffstat (limited to 'compiler/codeGen/CgUtils.hs')
-rw-r--r--compiler/codeGen/CgUtils.hs16
1 files changed, 10 insertions, 6 deletions
diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs
index 4df7c77914..63d99a629f 100644
--- a/compiler/codeGen/CgUtils.hs
+++ b/compiler/codeGen/CgUtils.hs
@@ -601,13 +601,17 @@ assignTemp e
; stmtC (CmmAssign (CmmLocal reg) e)
; return (CmmReg (CmmLocal reg)) }
--- | Assign the expression to a temporary register and return an
--- expression referring to this register.
+-- | If the expression is trivial and doesn't refer to a global
+-- register, return it. Otherwise, assign the expression to a
+-- temporary register and return an expression referring to this
+-- register.
assignTemp_ :: CmmExpr -> FCode CmmExpr
-assignTemp_ e = do
- reg <- newTemp (cmmExprType e)
- stmtC (CmmAssign (CmmLocal reg) e)
- return (CmmReg (CmmLocal reg))
+assignTemp_ e
+ | isTrivialCmmExpr e && hasNoGlobalRegs e = return e
+ | otherwise = do
+ reg <- newTemp (cmmExprType e)
+ stmtC (CmmAssign (CmmLocal reg) e)
+ return (CmmReg (CmmLocal reg))
newTemp :: CmmType -> FCode LocalReg
newTemp rep = do { uniq <- newUnique; return (LocalReg uniq rep) }