60 |
val setVN = setVN |
val setVN = setVN |
61 |
fun varToExp x = getExp(getVN x) |
fun varToExp x = getExp(getVN x) |
62 |
fun bindVarToExp (ENV{avail}, x, e) = ( |
fun bindVarToExp (ENV{avail}, x, e) = ( |
63 |
(*DEBUG**Log.msg(concat["** bindVarToExp: ", IR.Var.toString x, " --> ", E.toString e, "\n"]);*) |
(*DEBUG**)Log.msg(concat["** bindVarToExp: ", IR.Var.toString x, " --> ", E.toString e, "\n"]);(**) |
64 |
setVN(x, x); setExp(x, e); |
setVN(x, x); setExp(x, e); |
65 |
ENV{avail = ValueMap.insert(avail, e, x)}) |
ENV{avail = ValueMap.insert(avail, e, x)}) |
66 |
fun expToVN (ENV{avail}, e) = ValueMap.find(avail, e) |
fun expToVN (ENV{avail}, e) = ValueMap.find(avail, e) |
71 |
if IR.Var.same(x, x') |
if IR.Var.same(x, x') |
72 |
then x |
then x |
73 |
else ( |
else ( |
74 |
(*DEBUG**Log.msg(concat["** rename ", IR.Var.toString x, " to ", IR.Var.toString x', "\n"]);*) |
(*DEBUG**)Log.msg(concat["** rename ", IR.Var.toString x, " to ", IR.Var.toString x', "\n"]);(**) |
75 |
decUse x; incUse x'; |
decUse x; incUse x'; |
76 |
x') |
x') |
77 |
end |
end |
214 |
in |
in |
215 |
case expToVN(env, exp) |
case expToVN(env, exp) |
216 |
of SOME vn => ((* y is redundant, so map it to vn *) |
of SOME vn => ((* y is redundant, so map it to vn *) |
217 |
(* DEBUG ** Log.msg(concat["** redundant assignment: ", IR.assignToString (y, rhs), *) |
(* DEBUG *) Log.msg(concat["** redundant assignment: ", IR.assignToString (y, rhs), (* *) |
218 |
(* DEBUG **"; VN[", IR.Var.toString y, "] = ", IR.Var.toString vn, "\n"]); *) |
(* DEBUG *)"; VN[", IR.Var.toString y, "] = ", IR.Var.toString vn, "\n"]); (* *) |
219 |
ST.tick cntRedundantAssign; |
ST.tick cntRedundantAssign; |
220 |
|
if (ST.count cntRedundantAssign > 50) then raise Fail "too many redundant assignments" else (); |
221 |
setVN(y, vn); |
setVN(y, vn); |
222 |
env) |
env) |
223 |
| NONE => bindVarToExp(env, y, exp) |
| NONE => bindVarToExp(env, y, exp) |