> > These extraneous assignments will be killed off by the removeUnused
> > pass if they are truly unused in the rest of the program.
>> If you add the assignments as global statements in the argument to
> Ssa.shrinkFucntion, won't they just not appear in the output
> (i.e. "blocks")?
No, you misunderstand what I was proposing. Instead of:
Ssa.Exp.Tuple vs =>
if Vector.equals(vars, vs, Var.equals)
then ()
else Error.bug "shrinker didn't simplify right"
have
Ssa.Exp.Tuple vs =>
if Vector.length vars = Vector.length vs
then vs
else Error.bug "shrinker didn't simplify right"
and
val rebinds =
Vector.keepAllMapi
(vs, fn (i, v) =>
if Var.equals (v, Vector.sub (vars, i))
then NONE
else SOME (Ssa.Statement.T
{exp = Ssa.Exp.Var v,
ty = Vector.sub (tys, i),
var = SOME (Vector.sub (vars, i))}))
That is, if we see that the shrinker determined that a variable was equal
to another variable, simply rebind the eliminated variable.