2 /* --------------------------------------------------------------------------
3 * Substitute variables in an expression
5 * The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the
6 * Yale Haskell Group, and the Oregon Graduate Institute of Science and
7 * Technology, 1994-1999, All rights reserved. It is distributed as
8 * free software under the license in the file "License", which is
9 * included in the distribution.
11 * $RCSfile: stgSubst.c,v $
13 * $Date: 1999/10/15 21:40:57 $
14 * ------------------------------------------------------------------------*/
22 /* --------------------------------------------------------------------------
23 * Local function prototypes:
24 * ------------------------------------------------------------------------*/
26 static StgVar substVar ( List sub, StgVar v );
27 static StgAtom substAtom ( List sub, StgAtom a );
28 static void substBind ( List sub, StgVar bind );
29 static void substAlt ( List sub, StgCaseAlt alt );
30 static void substPrimAlt ( List sub, StgPrimAlt alt );
32 /* --------------------------------------------------------------------------
33 * Substitute variables throughout an expression - updating in place.
34 * ------------------------------------------------------------------------*/
36 static StgVar substVar( List sub, StgVar v )
38 Pair p = cellAssoc(v,sub);
46 static StgAtom substAtom ( List sub, StgAtom a )
50 return substVar(sub,a);
56 static Void substBind( List sub, StgVar bind )
58 StgRhs rhs = stgVarBody(bind);
59 switch (whatIs(rhs)) {
61 map1Over(substAtom,sub,stgConArgs(rhs));
64 stgVarBody(bind) = substExpr(sub,rhs);
69 static Void substAlt( List sub, StgCaseAlt alt )
71 if (isDefaultAlt(alt))
72 stgDefaultBody(alt) = substExpr(sub,stgDefaultBody(alt)); else
73 stgCaseAltBody(alt) = substExpr(sub,stgCaseAltBody(alt));
76 static Void substPrimAlt( List sub, StgPrimAlt alt )
78 stgPrimAltBody(alt) = substExpr(sub,stgPrimAltBody(alt));
81 StgExpr substExpr( List sub, StgExpr e )
85 map1Proc(substBind,sub,stgLetBinds(e));
86 stgLetBody(e) = substExpr(sub,stgLetBody(e));
89 stgLambdaBody(e) = substExpr(sub,stgLambdaBody(e));
92 stgCaseScrut(e) = substExpr(sub,stgCaseScrut(e));
93 map1Proc(substAlt,sub,stgCaseAlts(e));
96 stgPrimCaseScrut(e) = substExpr(sub,stgPrimCaseScrut(e));
97 map1Proc(substPrimAlt,sub,stgPrimCaseAlts(e));
100 map1Over(substAtom,sub,stgPrimArgs(e));
103 stgAppFun(e) = substVar(sub,stgAppFun(e));
104 map1Over(substAtom,sub,stgAppArgs(e));
107 map1Over(substAtom,sub,stgConArgs(e));
111 return substVar(sub,e);
113 internal("substExpr");
119 /* A substitution engine more suitable for the optimiser.
120 Doesn't make so many assumptions about what is an atom.
122 StgExpr zubstExpr( List sub, StgExpr e )
127 for (bs=stgLetBinds(e); nonNull(bs); bs=tl(bs))
128 stgVarBody(hd(bs)) = zubstExpr(sub,stgVarBody(hd(bs)));
129 stgLetBody(e) = zubstExpr(sub,stgLetBody(e));
132 stgLambdaBody(e) = zubstExpr(sub,stgLambdaBody(e));
135 stgCaseScrut(e) = zubstExpr(sub,stgCaseScrut(e));
136 map1Proc(zubstExpr,sub,stgCaseAlts(e));
139 stgPrimCaseScrut(e) = zubstExpr(sub,stgPrimCaseScrut(e));
140 map1Proc(zubstExpr,sub,stgPrimCaseAlts(e));
143 stgCaseAltBody(e) = zubstExpr(sub,stgCaseAltBody(e));
146 stgDefaultBody(e) = zubstExpr(sub,stgDefaultBody(e));
149 stgPrimAltBody(e) = zubstExpr(sub,stgPrimAltBody(e));
152 map1Over(zubstExpr,sub,stgPrimArgs(e));
155 stgAppFun(e) = zubstExpr(sub,stgAppFun(e));
156 map1Over(zubstExpr,sub,stgAppArgs(e));
159 map1Over(zubstExpr,sub,stgConArgs(e));
162 return substVar(sub,e);
171 internal("zubstExpr");
178 /*-------------------------------------------------------------------------*/