X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FCmmOpt.hs;h=81630737c6eb48747b4a496f502cb12890690f8d;hb=6e9501c0e3c3bb807981c0378c969d0667a7ce0b;hp=8326a48db4e8e07014f5dcc83b40a23b64568eb7;hpb=cd81cd88f2e6f7972221bf2f6d956a0a63ac2e84;p=ghc-hetmet.git diff --git a/compiler/cmm/CmmOpt.hs b/compiler/cmm/CmmOpt.hs index 8326a48..8163073 100644 --- a/compiler/cmm/CmmOpt.hs +++ b/compiler/cmm/CmmOpt.hs @@ -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)