Beef up cmmMiniInline a tiny bit
[ghc-hetmet.git] / compiler / cmm / CmmOpt.hs
index 8326a48..8163073 100644 (file)
@@ -116,27 +116,18 @@ cmmMiniInlineStmts uses (stmt@(CmmAssign (CmmLocal (LocalReg u _)) expr) : stmts
 cmmMiniInlineStmts uses (stmt:stmts)
   = stmt : cmmMiniInlineStmts uses stmts
 
+lookForInline u expr (stmt : rest)
+  | Just 1 <- lookupUFM (countUses stmt) u, ok_to_inline
+  = Just (inlineStmt u expr stmt : rest)
+
+  | ok_to_skip
+  = case lookForInline u expr rest of
+           Nothing    -> Nothing
+           Just stmts -> Just (stmt:stmts)
+
+  | otherwise 
+  = Nothing
 
--- Try to inline a temporary assignment.  We can skip over assignments to
--- other tempoararies, because we know that expressions aren't side-effecting
--- and temporaries are single-assignment.
-lookForInline u expr (stmt@(CmmAssign (CmmLocal (LocalReg u' _)) rhs) : rest)
-  | u /= u' 
-  = case lookupUFM (countUses rhs) u of
-       Just 1 -> Just (inlineStmt u expr stmt : rest)
-       _other -> case lookForInline u expr rest of
-                    Nothing    -> Nothing
-                    Just stmts -> Just (stmt:stmts)
-
-lookForInline u expr (CmmNop : rest)
-  = lookForInline u expr rest
-
-lookForInline _ _ [] = Nothing
-
-lookForInline u expr (stmt:stmts)
-  = case lookupUFM (countUses stmt) u of
-       Just 1 | ok_to_inline -> Just (inlineStmt u expr stmt : stmts)
-       _other -> Nothing
   where
        -- we don't inline into CmmCall if the expression refers to global
        -- registers.  This is a HACK to avoid global registers clashing with
@@ -147,6 +138,16 @@ lookForInline u expr (stmt:stmts)
                     CmmCall{} -> hasNoGlobalRegs expr
                     _ -> True
 
+   -- We can skip over assignments to other tempoararies, because we
+   -- know that expressions aren't side-effecting and temporaries are
+   -- single-assignment.
+    ok_to_skip = case stmt of
+                 CmmNop -> True
+                 CmmAssign (CmmLocal (LocalReg u' _)) rhs | u' /= u -> True
+                 CmmAssign g@(CmmGlobal _) rhs -> not (g `regUsedIn` expr)
+                 _other -> False
+
+
 inlineStmt :: Unique -> CmmExpr -> CmmStmt -> CmmStmt
 inlineStmt u a (CmmAssign r e) = CmmAssign r (inlineExpr u a e)
 inlineStmt u a (CmmStore e1 e2) = CmmStore (inlineExpr u a e1) (inlineExpr u a e2)