// Traverse the instructions in this basic block in reverse order!
// Mark as dead all instructions whose results are not used!
List<Instr> instrs = basicBlock.getInstrs();
ListIterator<Instr> it = instrs.listIterator(instrs.size());
while (it.hasPrevious()) {
Instr i = it.previous();
// System.out.println("DEAD?? " + i);
if (i instanceof ResultInstr) {
Variable v = ((ResultInstr) i).getResult();
Integer dv = problem.getDFVar(v);
// If 'v' is not live at the instruction site, and it has no side effects, mark it dead!
// System.out.println("df var for " + v + " is " + dv);
if (living.get(dv)) {
living.clear(dv);
// System.out.println("NO! LIVE result:" + v);
} else if (i.canBeDeleted(scope)) {
// System.out.println("YES!");
i.markDead();
it.remove();
problem.getScope().getFlags().add(IRFlags.HAS_UNUSED_IMPLICIT_BLOCK_ARG);
} else {
// System.out.println("NO! has side effects! Op is: " + i.getOperation());
}
} else if (i.canBeDeleted(scope)) {
i.markDead();
it.remove();
} else {
// System.out.println("IGNORING! No result!");
}
if (i instanceof ClosureAcceptingInstr) {
Operand o = ((ClosureAcceptingInstr)i).getClosureArg();
if (o != null && o instanceof WrappedIRClosure) {
IRClosure cl = ((WrappedIRClosure)o).getClosure();
LiveVariablesProblem cl_lvp = (LiveVariablesProblem)cl.getDataFlowSolution(problem.getName());
// Collect variables live on entry and merge that info into the current problem.
markAllVariablesLive(problem, living, cl_lvp.getVarsLiveOnScopeEntry());
} else if (scopeBindingHasEscaped) {
// Mark all non-self, non-block local variables live if 'c' is a dataflow barrier!
for (Variable x: problem.getNonSelfLocalVars()) {
living.set(problem.getDFVar(x));
}
}
}
// NOTE: This is unnecessary in the case of calls in scopes where
// the binding has escaped since the if (scopeBindingHasEscapd) check above
// would have handled it. But, extra readability of the DRY-ed version is
// worth the the little bit of extra work.
if (i.canRaiseException()) {
makeOutExceptionVariablesLiving(living);
}
// Do not mark this instruction's operands live if the instruction itself is dead!
if (!i.isDead()) markAllVariablesLive(problem, living, i.getUsedVariables());
}
}