diff options
author | Johan Tibell <johan.tibell@gmail.com> | 2011-05-19 17:34:20 +0200 |
---|---|---|
committer | Johan Tibell <johan.tibell@gmail.com> | 2011-05-30 20:12:05 +0200 |
commit | 18691d440f90a3dff4ef538091c886af505e5cf5 (patch) | |
tree | f133c7e64149bfe2c7c5d7553429b51e66c67ca8 /compiler/codeGen | |
parent | 622c3cfe2b3ebde891981544c0eea525eaa55e6f (diff) | |
download | haskell-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')
-rw-r--r-- | compiler/codeGen/CgUtils.hs | 16 |
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) } |