package de.gaalop.tba.cfgImport.optimization;
import de.gaalop.cfg.ControlFlowGraph;
import de.gaalop.cfg.Node;
import de.gaalop.cfg.SequentialNode;
import de.gaalop.tba.UseAlgebra;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
/**
* Facade class for the unused assignments optimization
* @author Christian Steinmetz
*/
public class OptUnusedAssignmentsRemoval implements OptimizationStrategyWithModifyFlag {
@Override
public boolean transform(ControlFlowGraph graph, UseAlgebra usedAlgebra) {
// traverse the graph in the opposite direction
NodeCollectorControlFlowVisitor v = new NodeCollectorControlFlowVisitor();
graph.accept(v);
LinkedList<Node> nodeList = v.getNodeList();
// list output blades
HashMap<String, LinkedList<Integer>> outputBlades = new HashMap<String, LinkedList<Integer>>();
for (String output : graph.getPragmaOutputVariables()) {
String[] parts = output.split("\\$");
LinkedList<Integer> list;
if (outputBlades.containsKey(parts[0])) {
list = outputBlades.get(parts[0]);
} else {
list = new LinkedList<Integer>();
outputBlades.put(parts[0], list);
}
list.add(Integer.parseInt(parts[1]));
}
Iterator<Node> descendingIterator = nodeList.descendingIterator();
CFGVisitorUsedVariables cfgVariableVisitor = new CFGVisitorUsedVariables(outputBlades, usedAlgebra);
while (descendingIterator.hasNext()) {
Node cur = descendingIterator.next();
cur.accept(cfgVariableVisitor);
}
// remove all nodes that are marked for removal
for (SequentialNode node : cfgVariableVisitor.getNodeRemovals()) {
graph.removeNode(node);
}
boolean changedGraph = !cfgVariableVisitor.getNodeRemovals().isEmpty();
// collect zero assignments
ZeroAssignmentsCollector collector = new ZeroAssignmentsCollector();
graph.accept(collector);
// remove all nodes that are marked for removal
for (SequentialNode node : collector.getToRemove()) {
graph.removeNode(node);
}
UpdateLocalVariableSet.updateVariableSets(graph);
return changedGraph;
}
}