Don't try to inline non-normalizeable top level functions.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Wed, 19 Aug 2009 10:32:00 +0000 (12:32 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Wed, 19 Aug 2009 10:32:00 +0000 (12:32 +0200)
Since we do normalization before inlining, we should only try this with
functions that can be normalized.

cλash/CLasH/Normalize.hs

index 38ee353ac4225fe49dc3b8e85c7c248de7f66f6e..1f5ee427069751c0d7d56d4ecb563c5fad978c8e 100644 (file)
@@ -324,10 +324,11 @@ inlinetoplevel, inlinetopleveltop :: Transform
 -- Any system name is candidate for inlining. Never inline user-defined
 -- functions, to preserver structure.
 inlinetoplevel expr@(Var f) | not $ isUserDefined f = do
+  norm <- isNormalizeable f
   -- See if this is a top level binding for which we have a body
   body_maybe <- Trans.lift $ getGlobalBind f
-  case body_maybe of
-    Just body -> do
+  if norm && Maybe.isJust body_maybe
+    then do
       -- Get the normalized version
       norm <- Trans.lift $ getNormalized f
       if needsInline norm 
@@ -335,9 +336,9 @@ inlinetoplevel expr@(Var f) | not $ isUserDefined f = do
           change norm
         else
           return expr
-    -- No body, this is probably a local variable or builtin or external
-    -- function.
-    Nothing -> return expr
+    else
+      -- No body or not normalizeable.
+      return expr
 -- Leave all other expressions unchanged
 inlinetoplevel expr = return expr
 inlinetopleveltop = everywhere ("inlinetoplevel", inlinetoplevel)