From 18691d440f90a3dff4ef538091c886af505e5cf5 Mon Sep 17 00:00:00 2001 From: Johan Tibell Date: Thu, 19 May 2011 17:34:20 +0200 Subject: [PATCH] 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. --- compiler/codeGen/CgUtils.hs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs index 4df7c77..63d99a6 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) } -- 1.7.10.4