Map<Variable, Integer> varUses = new HashMap<Variable, Integer>();
for (IRBasicBlock<T> b : this) {
for (Quad<T> q : b.getQuads()) {
if (!q.isDeadCode()) {
if (q instanceof AssignQuad) {
AssignQuad aq = (AssignQuad) q;
Variable v = aq.getLHS();
if (!varUses.containsKey(v)) {
varUses.put(v, 0);
}
}
Operand<T>[] refs = q.getReferencedOps();
if (refs != null) {
for (Operand<T> ref : refs) {
if (ref instanceof Variable) {
Variable<T> v = (Variable<T>) ref;
Integer c = varUses.get(v);
if (c == null) {
c = 0;
}
c++;
varUses.put(v, c);
}
}
}
}
}
}
boolean loop;
do {
loop = false;
for (Map.Entry<Variable, Integer> u : varUses.entrySet()) {
if (u.getValue() == 0 && !u.getKey().getAssignQuad().isDeadCode()) {
AssignQuad dq = u.getKey().getAssignQuad();
dq.setDeadCode(true);
Operand<T>[] refs = dq.getReferencedOps();
if (refs != null) {
for (Operand<T> ref : refs) {
if (ref instanceof Variable) {
Variable<T> r = (Variable<T>) ref;
Integer c = varUses.get(r);