package de.gaalop.algebra; import de.gaalop.visitors.DFGTraversalVisitor; import de.gaalop.cfg.AssignmentNode; import de.gaalop.cfg.ControlFlowGraph; import de.gaalop.cfg.EmptyControlFlowVisitor; import de.gaalop.dfg.MultivectorComponent; import de.gaalop.dfg.Variable; import java.util.HashSet; import java.util.LinkedList; /** * This class provide a method for updating the variable-sets in a graph * @author Christian Steinmetz */ public class UpdateLocalVariableSet extends EmptyControlFlowVisitor { private HashSet<String> inputVariables = new HashSet<String>(); private HashSet<String> defined = new HashSet<String>(); private DFGTraversalVisitor dfgVisitor = new DFGTraversalVisitor() { @Override public void visit(Variable node) { if (!defined.contains(node.getName())) inputVariables.add(node.getName()); super.visit(node); } @Override public void visit(MultivectorComponent node) { if (!defined.contains(node.getName())) inputVariables.add(node.getName()); super.visit(node); } }; private UpdateLocalVariableSet() { } @Override public void visit(AssignmentNode node) { node.getValue().accept(dfgVisitor); defined.add(node.getVariable().getName()); super.visit(node); } /** * Updates the variable-sets in a graph * @param graph The graph */ public static void updateVariableSets(ControlFlowGraph graph) { UpdateLocalVariableSet visitor = new UpdateLocalVariableSet(); graph.accept(visitor); LinkedList<Variable> iVar = new LinkedList<Variable>(graph.getInputVariables()); LinkedList<Variable> lVar = new LinkedList<Variable>(graph.getLocalVariables()); //clear for (Variable inputVar: iVar) graph.removeInputVariable(inputVar); for (Variable defVar: lVar) graph.removeLocalVariable(defVar); //add for (String inputVar: visitor.inputVariables) graph.addInputVariable(new Variable(inputVar)); for (String defVar: visitor.defined) graph.addLocalVariable(new Variable(defVar)); } }