From 94cbe022cbe18c2ae8da829d39c0896d615f8f1c Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Wed, 6 Dec 2006 07:18:45 +0000 Subject: [PATCH] Improve dependency analysis; makes more dictionaries inlinable 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 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/compiler/simplCore/OccurAnal.lhs b/compiler/simplCore/OccurAnal.lhs index 8b3d45e..fc9104f 100644 --- a/compiler/simplCore/OccurAnal.lhs +++ b/compiler/simplCore/OccurAnal.lhs @@ -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 -- 1.7.10.4