Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- public class optlab3 {
- Map<Vertex, Set<Vertex>> dominanceFrontier;
- Map<Var, Set<Vertex>> varToUsageVertices;
- Set<Var> uniqueVaribales;
- Set<Vertex> postOrder;
- Vertex root;
- List<Integer> stack;
- int counter;
- private boolean compareVertexSets(Set<Vertex> a, Set<Vertex> b) {
- return a.size() == b.size();
- }
- private void postOrder(Vertex v) {
- v.succs.forEach(this::postOrder);
- postOrder.add(v);
- }
- private void generatePostOrder(Vertex root) {
- System.out.println("Post order:");
- postOrder(root);
- postOrder.forEach(v -> System.out.print(v.name.toUpperCase() + " "));
- System.out.println();
- }
- private void generateVarToUsageVertices() {
- this.postOrder.forEach(v -> {
- v.statements.forEach(stmt -> {
- Set<Vertex> additionalSet = varToUsageVertices.containsKey(stmt.lhs) ?
- varToUsageVertices.get(stmt.lhs) : new HashSet<Vertex>();
- additionalSet.add(v);
- varToUsageVertices.put(stmt.lhs, additionalSet);
- });
- });
- System.out.println("Var to UsageVertices:");
- for (Var v : varToUsageVertices.keySet()) {
- Set<Vertex> vSet = varToUsageVertices.get(v);
- String s = "";
- for (Vertex x : vSet)
- s += x.name.toUpperCase() + " ";
- System.out.println("var: " + v.name + ": [" + s + "]");
- }
- System.out.println();
- }
- private void generateDFGlobal() {
- postOrder.forEach(x -> {
- dominanceFrontier.put(x, new HashSet<Vertex>());
- x.succs.forEach(succ -> {
- if (x != succ.immediateDom) {
- dominanceFrontier.get(x).add(succ);
- System.out.println("added succ " + succ.name);
- }
- });
- x.children.forEach(child -> {
- if (null != dominanceFrontier.get(child)) {
- dominanceFrontier.get(child).forEach(y -> {
- if (x != y.immediateDom) {
- dominanceFrontier.get(x).add(y);
- System.out.println("added child " + y.name);
- }
- });
- }
- });
- });
- System.out.println("Dominance Frontier:");
- for (Vertex v : postOrder) {
- Set<Vertex> vSet = dominanceFrontier.get(v);
- String s = "";
- for (Vertex x : vSet)
- s += x.name.toUpperCase() + " ";
- System.out.println("vert: " + v.name.toUpperCase() + ": [" + s + "]");
- }
- System.out.println();
- }
- private Set<Vertex> generateDFSet(Set<Vertex> vertexSet) {
- Set<Vertex> res = new HashSet<>();
- vertexSet.forEach(x -> res.addAll(dominanceFrontier.get(x)));
- String src = "";
- for (Vertex x : vertexSet)
- src += x.name.toUpperCase() + " ";
- System.out.println("DF-Set for [" + src + "]:");
- String s = "";
- for (Vertex x : res)
- s += x.name.toUpperCase() + " ";
- System.out.println("[" + s + "]");
- return res;
- }
- private Set<Vertex> generateDFPSet(Set<Vertex> vertexSet) {
- Set<Vertex> res = new HashSet<Vertex>();
- Set<Vertex> DFP = generateDFSet(vertexSet);
- boolean change;
- do {
- change = false;
- DFP.addAll(vertexSet);
- DFP = generateDFSet(DFP);
- if (!compareVertexSets(DFP, res)) {
- res = new HashSet<>(DFP);
- change = true;
- }
- } while (change);
- return res;
- }
- private void placePhi() {
- for (Var k : varToUsageVertices.keySet()) {
- System.out.println(k.name + ":");
- Set<Vertex> phiSet = generateDFPSet(varToUsageVertices.get(k));
- for (Vertex x : phiSet) {
- System.out.println("placing PHI");
- PhiStmt phi = new PhiStmt(x, k);
- x.phis.add(phi);
- x.prependStmt(phi);
- }
- }
- }
- private int whichPred(Vertex childVertexToBeSearchedWithin,
- Vertex ancestorVertexToBeSearhedFor) {
- return childVertexToBeSearchedWithin.precs.indexOf(ancestorVertexToBeSearhedFor);
- }
- String currTrav, prevTrav;
- private void traverse(Vertex v, Var p) {
- currTrav = v.name;
- //if (currTrav.equals(prevTrav)) return;
- System.out.println("\nTRV " + v.name.toUpperCase() +
- " [" + p.name + ", s: " + stack + ", ctr: " + counter + "]:");
- //System.out.println("curr: " + currTrav + " prev: " + prevTrav);
- for (Stmt stmt : v.statements) {
- System.out.println(" stmt: " + stmt);
- if (!stmt.isPhi) {
- System.out.print(" Rhs: " + stmt + " \t-> ");
- stmt.renameRhsVar(p.name, stack.get(stack.size() - 1));
- System.out.println(stmt);
- }
- if (stmt.isAss && stmt.lhs.equals(p)) {
- System.out.print(" Lhs: " + stmt + " \t-> ");
- stmt.renameLhsVar(p.name, counter);
- stack.add(counter);
- counter++;
- System.out.println(stmt + " ctr++");
- }
- }
- System.out.println("s: " + stack + ", ctr: " + counter);
- v.succs.forEach(succ -> {
- int j = whichPred(succ, v);
- if (-1 != j) {
- System.out.println(" " + j + " = whichPred(" + succ.name + ", " + v.name + ")");
- System.out.println(" phis:");
- succ.phis.forEach(phiStmt -> {
- if (p.equals(phiStmt.lhs)) {
- System.out.print(" " + phiStmt + " \t-> ");
- phiStmt.updateRhsVarVersion(stack.get(stack.size() - 1), j);
- System.out.println(phiStmt);
- }
- });
- }
- });
- prevTrav = v.name;
- v.children.forEach(child -> traverse(child, p));
- v.statements.forEach(stmt -> {
- if (stmt.lhs.equals(p))
- stack.remove(stack.size() - 1);
- });
- }
- private void renameSingleVar(Var p) {
- stack.clear();
- stack.add(0);
- counter = 0;
- traverse(root, p);
- }
- private void renameVars() {
- this.varToUsageVertices.keySet().forEach(this::renameSingleVar);
- }
- /*
- // [A]
- // / \
- // [B] [C]
- // \ /
- // [D]
- */
- private void buildCFGSample2() {
- Vertex a = new Vertex("a");
- Vertex b = new Vertex("b");
- Vertex c = new Vertex("c");
- Vertex d = new Vertex("d");
- root = a;
- //=================== A ===================
- Var leftPartA1 = new Var("x", "=");
- Expr rightPartA1 = new Expr();
- rightPartA1.vars.add(new Var("5"));
- Expr rightPartA2 = new Expr();
- rightPartA2.vars.add(new Var("x", "-"));
- rightPartA2.vars.add(new Var("3"));
- Expr rightPartA3 = new Expr();
- rightPartA3.vars.add(new Var("1"));
- a.statements.add(new AssStmt(leftPartA1, rightPartA1));
- a.statements.add(new AssStmt(new Var("x", "="), rightPartA2));
- a.statements.add(new AssStmt(new Var("y", "="), rightPartA3));
- a.statements.add(new BranchStmt(new Var("x"), "<", new Var("3"), b, c));
- a.children.add(b);
- a.children.add(d);
- a.children.add(c);
- a.succs.add(b);
- a.succs.add(c);
- a.succs.add(d);
- a.immediateDom = null;
- //=================== B ===================
- Var leftPartB = new Var("t", "=");
- Expr rightPartB1 = new Expr();
- rightPartB1.vars.add(new Var("x", "*"));
- rightPartB1.vars.add(new Var("2"));
- Expr rightPartB2 = new Expr();
- rightPartB2.vars.add(new Var("y"));
- b.statements.add(new AssStmt(new Var("y", "="), rightPartB1));
- b.statements.add(new AssStmt(new Var("w", "="), rightPartB2));
- b.precs.add(a);
- b.succs.add(d);
- b.immediateDom = a;
- //=================== C ===================
- Expr rightPartC1 = new Expr();
- rightPartC1.vars.add(new Var("x", "-"));
- rightPartC1.vars.add(new Var("3", "+"));
- rightPartC1.vars.add(new Var("y", "*"));
- rightPartC1.vars.add(new Var("y"));
- Expr rightPartC2 = new Expr();
- rightPartC2.vars.add(new Var("z", "+"));
- rightPartC2.vars.add(new Var("9"));
- Expr rightPartC3 = new Expr();
- rightPartC3.vars.add(new Var("y"));
- c.statements.add(new AssStmt(new Var("y", "="), rightPartC1));
- c.statements.add(new AssStmt(new Var("x", "="), rightPartC2));
- c.statements.add(new AssStmt(new Var("x", "="), rightPartC3));
- c.precs.add(b);
- c.succs.add(d);
- c.immediateDom = a;
- //=================== D ===================
- Expr rightPartD1 = new Expr();
- rightPartD1.vars.add(new Var("x", "-"));
- rightPartD1.vars.add(new Var("y"));
- Expr rightPartD2 = new Expr();
- rightPartD2.vars.add(new Var("x", "+"));
- rightPartD2.vars.add(new Var("y"));
- Expr rightPartD1Phi1 = new Expr();
- rightPartD1Phi1.vars.add(new Var("y"));
- d.statements.add(new AssStmt(new Var("w", "="), rightPartD1));
- d.statements.add(new AssStmt(new Var("z", "="), rightPartD2));
- d.precs.add(b);
- d.precs.add(c);
- d.immediateDom = a;
- generatePostOrder(a);
- }
- /*
- // /[ A ]\
- // / | \
- // / | \
- // [B] [C] [D]
- // \ | /
- // \ | /
- // \[ E ]/
- */
- private void buildCFGSample3() {
- Vertex a = new Vertex("a");
- Vertex b = new Vertex("b");
- Vertex c = new Vertex("c");
- Vertex d = new Vertex("d");
- Vertex e = new Vertex("e");
- root = a;
- //=================== A ===================
- Expr rightPartA1 = new Expr();
- rightPartA1.vars.add(new Var("5"));
- Expr rightPartA2 = new Expr();
- rightPartA2.vars.add(new Var("x", "-"));
- rightPartA2.vars.add(new Var("3"));
- Expr rightPartA3 = new Expr();
- rightPartA3.vars.add(new Var("1"));
- a.statements.add(new AssStmt(new Var("x", "="), rightPartA1));
- a.statements.add(new AssStmt(new Var("w", "="), rightPartA2));
- a.statements.add(new AssStmt(new Var("y", "="), rightPartA3));
- a.statements.add(new BranchStmt(new Var("y"), "<", new Var("3"), b, c));
- a.children.add(b);
- a.children.add(c);
- a.children.add(d);
- a.children.add(e);
- a.succs.add(b);
- a.succs.add(c);
- a.succs.add(d);
- a.succs.add(e);
- //=================== B ===================
- Expr rightPartB1 = new Expr();
- rightPartB1.vars.add(new Var("x", "*"));
- rightPartB1.vars.add(new Var("(2", "-"));
- rightPartB1.vars.add(new Var("y", "+"));
- rightPartB1.vars.add(new Var("x", ")"));
- Expr rightPartB2 = new Expr();
- rightPartB2.vars.add(new Var("y"));
- b.statements.add(new AssStmt(new Var("y", "="), rightPartB1));
- b.statements.add(new AssStmt(new Var("w", "="), rightPartB2));
- b.precs.add(a);
- b.succs.add(e);
- b.immediateDom = a;
- //=================== C ===================
- Expr rightPartC1 = new Expr();
- rightPartC1.vars.add(new Var("x", "-"));
- rightPartC1.vars.add(new Var("3", "+"));
- rightPartC1.vars.add(new Var("y", "*"));
- rightPartC1.vars.add(new Var("y"));
- Expr rightPartC2 = new Expr();
- rightPartC2.vars.add(new Var("z", "+"));
- rightPartC2.vars.add(new Var("9"));
- Expr rightPartC3 = new Expr();
- rightPartC3.vars.add(new Var("y"));
- //c.statements.add(new AssStmt(new Var("y", "="), rightPartC1));
- c.statements.add(new AssStmt(new Var("w", "="), rightPartC2));
- //c.statements.add(new AssStmt(new Var("x", "="), rightPartC3));
- c.precs.add(a);
- c.succs.add(e);
- c.immediateDom = a;
- //=================== D ===================
- Expr rightPartD1 = new Expr();
- rightPartD1.vars.add(new Var("x", "-"));
- rightPartD1.vars.add(new Var("3"));
- Expr rightPartD2 = new Expr();
- rightPartD2.vars.add(new Var("x", "+"));
- rightPartD2.vars.add(new Var("y))"));
- Expr rightPartD3 = new Expr();
- rightPartD3.vars.add(new Var("z", "-"));
- rightPartD3.vars.add(new Var("3", "*"));
- rightPartD3.vars.add(new Var("(5", "+"));
- rightPartD3.vars.add(new Var("w", "+"));
- rightPartD3.vars.add(new Var("y", ")"));
- d.statements.add(new AssStmt(new Var("w", "="), rightPartD1));
- d.statements.add(new AssStmt(new Var("y", "="), rightPartD2));
- d.statements.add(new AssStmt(new Var("w", "="), rightPartD3));
- d.precs.add(a);
- d.succs.add(e);
- d.immediateDom = a;
- //=================== E ===================
- Expr rightPartE1 = new Expr();
- rightPartE1.vars.add(new Var("y"));
- Expr rightPartE2 = new Expr();
- rightPartE2.vars.add(new Var("x", "*"));
- rightPartE2.vars.add(new Var("w"));
- e.statements.add(new AssStmt(new Var("x", "="), rightPartE1));
- e.statements.add(new AssStmt(new Var("z", "="), rightPartE2));
- e.precs.add(b);
- e.precs.add(c);
- e.precs.add(d);
- e.immediateDom = a;
- generatePostOrder(a);
- }
- public static void main(String args[]) {
- optlab3 CFG = new optlab3();
- CFG.buildCFGSample3();
- CFG.generateDFGlobal();
- CFG.generateVarToUsageVertices();
- CFG.printBaseBlocks();
- CFG.placePhi();
- CFG.renameVars();
- CFG.printGraph(3);
- CFG.printBaseBlocks();
- }
- private optlab3() {
- this.postOrder = new LinkedHashSet<>();
- this.dominanceFrontier = new HashMap<Vertex, Set<Vertex>>();
- this.uniqueVaribales = new HashSet<Var>();
- this.varToUsageVertices = new HashMap<Var, Set<Vertex>>();
- this.stack = new ArrayList<Integer>();
- }
- private void printGraph(int n) {
- String str = "No graph representation";
- switch (n) {
- case 1:
- str = "\n" +
- " [A]\n" +
- " / \\\n" +
- " [B] [C]";
- break;
- case 2:
- str = "\n" +
- " [A]\n" +
- " / \\\n" +
- " [B] [C]\n" +
- " \\ /\n" +
- " [D]";
- break;
- case 3:
- str = "\n" +
- " /[ A ]\\\n" +
- " / | \\\n" +
- " / | \\\n" +
- " [B] [C] [D]\n" +
- " \\ | /\n" +
- " \\ | /\n" +
- " \\[ E ]/";
- break;
- default:
- break;
- }
- System.out.println(str);
- }
- private void printBaseBlocks() {
- System.out.println("\n->");
- dominanceFrontier.keySet().forEach(System.out::println);
- }
- }
- import java.util.*;
- /**
- * Created by anthony on 02.10.16.
- */
- class Vertex implements Comparable<Vertex>{
- String name;
- List<Vertex> precs;
- Set<Vertex> succs; //potomki v CFG
- Set<Vertex> children; //potomki v DOM tree
- Vertex immediateDom; //the one and only and blizhaishiy
- List<Stmt> statements;
- List<Stmt> phis;
- public void prependStmt(Stmt s) {
- List<Stmt> tmp = new ArrayList<>(statements);
- this.statements = new ArrayList<>();
- this.statements.add(s);
- this.statements.addAll(tmp);
- }
- Vertex(String name) {
- this.precs = new ArrayList<Vertex>();
- this.succs = new HashSet<Vertex>();
- this.children = new HashSet<Vertex>();
- this.statements = new ArrayList<Stmt>();
- this.phis = new ArrayList<Stmt>();
- this.name = name;
- this.immediateDom = null;
- }
- @Override
- public int compareTo(Vertex o) {
- return this.name.compareTo(o.name);
- }
- @Override
- public int hashCode() {
- return name.hashCode() < 0 ? -name.hashCode() : name.hashCode();
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- return ((Vertex)o).name.equals(this.name);
- }
- @Override
- public String toString() {
- String stmts = "\n ";
- for (Stmt s : statements)
- stmts += "\t" + s.toString() + "\n";
- stmts = stmts.substring(0, stmts.length() - 2);
- return name.toUpperCase() + ": {" + stmts + "}\n";
- }
- }
- /**
- * Created by anthony on 02.10.16.
- */
- public class AssStmt extends Stmt{
- AssStmt(Var lhs, Expr rhs) {
- this.lhs = lhs;
- this.rhs = rhs;
- this.isPhi = false;
- this.isAss = true;
- }
- @Override
- public String toString() {
- String s = lhs.toString();
- for (Var v : rhs.vars) s += v.toString();
- return s;
- }
- @Override
- public boolean updateRhsVarVersion(int version, int indexInRhs) {
- return false;
- }
- }
- /**
- * Created by anthony on 02.10.16.
- */
- public class PhiStmt extends Stmt{
- //i-th argument corresponds to i-th node of ancestors set
- PhiStmt(Vertex v, Var p) {
- this.lhs = p;
- this.rhs = new Expr();
- this.isPhi = true;
- this.isAss = true;
- v.precs.forEach(prec -> this.rhs.vars.add(p));
- System.out.println(this.rhs.vars.size() + " vars were added into phi");
- }
- @Override
- public boolean updateRhsVarVersion(int version, int indexInRhs) {
- if (this.rhs.vars.size() <= indexInRhs || -1 == indexInRhs)
- return false;
- Var t = new Var(this.rhs.vars.get(indexInRhs).name);
- t.version = version;
- this.rhs.vars.set(indexInRhs, t);
- return true;
- }
- @Override
- public String toString() {
- String s = lhs.toString() + "Ф( ";
- for (Var v : rhs.vars)
- s += v.name + "_" + v.version + " | ";
- s = s.substring(0, s.length() - 2) + ")";
- return s;
- }
- }
- import java.util.ArrayList;
- /**
- * Created by anthony on 02.10.16.
- */
- public class BranchStmt extends Stmt{
- private String condition;
- private Vertex positive;
- private Vertex negative;
- @Override
- public void renameRhsVar(String varName, int varVersion) {
- //this.lhs = new Var(varName, varVersion);
- this.lhs.version = varVersion;
- }
- @Override
- public boolean updateRhsVarVersion(int version, int indexInRhs) {
- return false;
- }
- BranchStmt(Var left, String condition, Var right, Vertex positive, Vertex negative) {
- this.lhs = new Var(left.name);
- this.rhs = new Expr();
- this.rhs.vars.add(right);
- this.negative = negative;
- this.positive = positive;
- this.isPhi = false;
- this.isAss = false;
- this.condition = condition;
- }
- @Override
- public String toString() {
- String s = this.lhs.name + "_" + this.lhs.version + " " + this.condition + " " + this.rhs.vars.get(0).name +
- " ? " + positive.name.toUpperCase() + " : " + negative.name.toUpperCase() + " ";
- return s;
- }
- }
- /**
- * Created by anthony on 02.10.16.
- */
- public abstract class Stmt {
- Var lhs;
- Expr rhs;
- boolean isPhi;
- boolean isAss;
- public void renameRhsVar(String varName, int varVersion) {
- int i = 0;
- for (Var v : this.rhs.vars) {
- if (varName.equals(v.name)) {
- Var t = new Var(varName, varVersion);
- t.sign = v.sign;
- this.rhs.vars.set(i, t);
- }
- i++;
- }
- }
- public boolean renameLhsVar(String varName, int varVersion) {
- if (varName.equals(this.lhs.name)) {
- Var t = new Var(varName, varVersion);
- t.sign = "=";
- this.lhs = t;
- return true;
- }
- return false;
- }
- public abstract boolean updateRhsVarVersion(int version, int indexInRhs);
- }
- /**
- * Created by anthony on 02.10.16.
- */
- public class Var {
- String name;
- int version;
- String sign;
- String rightPar;
- Var(String name, int version) {
- this.rightPar = name.contains(")") ? ")+" : "";
- this.name = name.contains(")") ? name.substring(0, 1) : name;
- this.version = version;
- this.sign = "";
- }
- Var(String name, String sign) {
- this.rightPar = name.contains(")") ? ")+" : "";
- this.name = name.contains(")") ? name.substring(0, 1) : name;
- this.version = !"".equals(name) ? 0 : -1;
- this.sign = sign;
- }
- Var(String name) {
- this.rightPar = name.contains(")") ? ")+" : "";
- this.name = name.contains(")") ? name.substring(0, 1) : name;
- this.version = !"".equals(name) ? 0 : -1;
- this.sign = "";
- }
- private boolean isNumeric(String s) {
- return s.matches("[-+()]?\\d*\\.?\\d+");
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- return ((Var)o).name.equals(this.name);
- }
- @Override
- public int hashCode() {
- return (name.hashCode() < 0) ? -name.hashCode() : name.hashCode();
- }
- @Override
- public String toString() {
- String nameAndIndex = this.isNumeric(this.name) ? this.name : this.name + "_" + this.version + rightPar;
- return nameAndIndex + " " + this.sign + " ";
- }
- }
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Created by anthony on 02.10.16.
- */
- public class Expr {
- public List<Var> vars;
- Expr() {
- this.vars = new ArrayList<Var>();
- //this.vars.add(new Var("", ";"));
- }
- /*
- void append(Var vs) {
- Var enderVS = vars.get(vars.size() - 1);
- vars.set(vars.size() - 1, vs);
- vars.add(enderVS);
- }
- public Var getLast() {
- return vars.size() > 1 ? vars.get(vars.size() - 1) : null;
- }
- List<Var> getVars() {
- List<Var> clearList = new ArrayList<>(this.vars);
- clearList.remove(this.vars.size() - 1);
- return clearList;
- }
- Var getVarByIndex(int version) {
- return vars.size() > 1 ? vars.get(version) : null;
- }
- void setVarByIndex(int version, Var v) {
- this.vars.set(version, v);
- }
- */
- @Override
- public String toString() {
- String e = "";
- for (Var v : vars)
- e += v.toString();
- return e;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment