2 /* --------------------------------------------------------------------------
3 * Free variable analysis
5 * Copyright (c) The University of Nottingham and Yale University, 1994-1997.
6 * All rights reserved. See NOTICE for details and conditions of use etc...
7 * Hugs version 1.4, December 1997
11 * $Date: 1999/04/27 10:06:52 $
12 * ------------------------------------------------------------------------*/
21 /* --------------------------------------------------------------------------
23 * ------------------------------------------------------------------------*/
25 static List freeVarsAlt Args((List, StgCaseAlt));
26 static List freeVarsPrimAlt Args((List, StgPrimAlt));
27 static List freeVarsExpr Args((List, StgExpr));
28 static List freeVarsAtom Args((List, StgAtom));
29 static List freeVarsVar Args((List, StgVar));
31 /* --------------------------------------------------------------------------
32 * Free variable analysis
33 * ------------------------------------------------------------------------*/
35 static List freeVarsAtom( List acc, StgAtom a)
39 return freeVarsVar(acc,a);
40 /* Note that NAMEs have no free vars. */
46 static List freeVarsVar( List acc, StgVar v)
48 if (cellIsMember(v,acc)) {
55 List freeVarsBind( List acc, StgVar v )
57 StgRhs rhs = stgVarBody(v);
59 switch (whatIs(rhs)) {
61 mapAccum(freeVarsAtom,fvs,stgConArgs(rhs));
64 fvs = freeVarsExpr(fvs,rhs);
67 /* fvs = rev(fvs); */ /* todo might cause less stack rearrangement? */
69 mapAccum(freeVarsVar,acc,fvs); /* copy onto acc */
73 static List freeVarsAlt( List acc, StgCaseAlt alt )
75 if (isDefaultAlt(alt)) {
76 acc = freeVarsExpr(acc,stgDefaultBody(alt));
77 return deleteCell(acc,stgDefaultVar(alt));
79 acc = freeVarsExpr(acc,stgCaseAltBody(alt));
80 return diffList(acc,stgCaseAltVars(alt));
84 static List freeVarsPrimAlt( List acc, StgPrimAlt alt )
86 List vs = stgPrimAltVars(alt);
87 acc = freeVarsExpr(acc,stgPrimAltBody(alt));
88 return diffList(acc,vs);
91 static List freeVarsExpr( List acc, StgExpr e )
95 mapAccum(freeVarsBind,acc,stgLetBinds(e));
96 return diffList(freeVarsExpr(acc,stgLetBody(e)),stgLetBinds(e));
98 return diffList(freeVarsExpr(acc,stgLambdaBody(e)),stgLambdaArgs(e));
100 mapAccum(freeVarsAlt,acc,stgCaseAlts(e));
101 return freeVarsExpr(acc,stgCaseScrut(e));
103 mapAccum(freeVarsPrimAlt,acc,stgPrimCaseAlts(e));
104 return freeVarsExpr(acc,stgPrimCaseScrut(e));
106 mapAccum(freeVarsAtom,acc,stgPrimArgs(e));
107 /* primop is not a var */
110 /* Doing fun first causes slightly less stack rearrangement. */
111 acc = freeVarsExpr(acc,stgAppFun(e));
112 mapAccum(freeVarsAtom,acc,stgAppArgs(e));
115 return freeVarsVar(acc, e);
117 return acc; /* Names are never free vars */
122 internal("freeVarsExpr");
126 /*-------------------------------------------------------------------------*/