Improve dependency analysis; makes more dictionaries inlinable
authorsimonpj@microsoft.com <unknown>
Wed, 6 Dec 2006 07:18:45 +0000 (07:18 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 6 Dec 2006 07:18:45 +0000 (07:18 +0000)
I recentl changed the scoring system used by dependency analysis for
recursive bindings, that it used the *form* of the RHS of a binding,
rather than just its type. In doing so I inadvertently made recursive
dictionary bindings unravel less well, because I'd missed the case
of  c = /\a. C (...) (...)

This patch fixes the problem.  A good example is the instance for
Monad (ST s) or Show (ST s a) in GHC.ST.  It's vital for these
dictionaries to be inlinable.

compiler/simplCore/OccurAnal.lhs

index 8b3d45e..fc9104f 100644 (file)
@@ -328,8 +328,13 @@ reOrderCycle bndrs (bind : binds)
        -- But we won't because constructor args are marked "Many".
 
        -- Cheap and cheerful; the simplifer moves casts out of the way
+       -- The lambda case is important to spot x = /\a. C (f a)
+       -- which comes up when C is a dictionary constructor and
+       -- f is a default method.  
+       -- Example: the instance for Show (ST s a) in GHC.ST
     is_con_app (Var v)    = isDataConWorkId v
     is_con_app (App f _)  = is_con_app f
+    is_con_app (Lam b e) | isTyVar b = is_con_app e
     is_con_app (Note _ e) = is_con_app e
     is_con_app other      = False