Don't inline == and /=.
authorMatthijs Kooijman <matthijs@stdin.nl>
Wed, 10 Mar 2010 15:23:34 +0000 (16:23 +0100)
committerMatthijs Kooijman <matthijs@stdin.nl>
Wed, 10 Mar 2010 15:23:34 +0000 (16:23 +0100)
This is a hack to prevent problems caused by the derived Eq instances.
This is not a real solution, though.

cλash/CLasH/Normalize.hs

index 4a5ceec9c07683fe1c3fb89c8fca9a1be96621c4..2fc34c606f083c3cf05a83b1e2e666a1042614bb 100644 (file)
@@ -338,6 +338,13 @@ inlinenonreptop = everywhere ("inlinenonrep", inlinebind ((Monad.liftM not) . is
 -- doesn't seem to set all those names as "system names", we apply some
 -- guessing here.
 inlinetoplevel, inlinetopleveltop :: Transform
+-- HACK: Don't inline == and /=. The default (derived) implementation
+-- for /= uses the polymorphic version of ==, which gets a dictionary
+-- for Eq passed in, which contains a reference to itself, resulting in
+-- an infinite loop in transformation. Not inlining == is really a hack,
+-- but for now it keeps things working with the most common symptom of
+-- this problem.
+inlinetoplevel expr@(Var f) | Name.getOccString f `elem` ["==", "/="] = return expr
 -- Any system name is candidate for inlining. Never inline user-defined
 -- functions, to preserve structure.
 inlinetoplevel expr@(Var f) | not $ isUserDefined f = do