Advertisement
Ladies_Man

opt3 seems to be working at least 4 3 vertices

Oct 8th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.58 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class optlab3 {
  4.  
  5.     Map<Vertex, Set<Vertex>> dominanceFrontier;
  6.     List<Vertex> postOrder;
  7.     Vertex root;
  8.  
  9.     private void generateDFGlobal() {
  10.  
  11.         postOrder.forEach(x -> {
  12.             dominanceFrontier.put(x, new HashSet<Vertex>());
  13.             x.succs.forEach(succ -> {
  14.                 if (x != succ.immediateDom) {
  15.                     dominanceFrontier.get(x).add(succ);
  16.                     System.out.println("added");
  17.                 }
  18.             });
  19.             x.children.forEach(child -> {
  20.                 if (null != dominanceFrontier.get(child)) {
  21.                     dominanceFrontier.get(child).forEach(y -> {
  22.                         if (x != y.immediateDom)
  23.                             dominanceFrontier.get(x).add(y);
  24.                     });
  25.                 }
  26.             });
  27.         });
  28.     }
  29.  
  30.     private Set<Vertex> generateDFSet(Set<Vertex> vertexSet) {
  31.  
  32.         Set<Vertex> res = new HashSet<Vertex>();
  33.         vertexSet.forEach(v -> res.addAll(dominanceFrontier.get(v)));
  34.  
  35.         return res;
  36.     }
  37.  
  38.     private Set<Vertex> generateDFPSet(Set<Vertex> vertexSet) {
  39.  
  40.         Set<Vertex> res = new HashSet<Vertex>();
  41.         Set<Vertex> DFP = generateDFSet(vertexSet);
  42.         boolean change;
  43.  
  44.         do {
  45.             change = false;
  46.  
  47.             DFP.addAll(vertexSet);
  48.             DFP = generateDFSet(DFP);
  49.  
  50.             if (DFP != res) {
  51.                 DFP = res;
  52.                 change = true;
  53.             }
  54.         } while (change);
  55.  
  56.         return res;
  57.     }
  58.  
  59.     private int whichPred(Vertex bottomVertexToBeSearchedWithin,
  60.                           Vertex topVertexToBeSearhedFor) {
  61.  
  62.         return bottomVertexToBeSearchedWithin.precs.indexOf(topVertexToBeSearhedFor);
  63.     }
  64.  
  65.     private void traverse(Vertex v, Var p, List<Integer> stack, int counter) {
  66.         /*
  67.         v.statements.forEach(stmt -> {
  68.             if (!stmt.isPhi)
  69.                 stmt.renameRhsVar(p.name, stack.get(stack.size() - 1));
  70.             if (stmt.isAss && stmt.lhsIs(p)) {
  71.                 stmt.renameLhsVar(counter);
  72.                 stack.add(counter);
  73.                 //counter++
  74.             }
  75.         });*/
  76.         //int counter = stack.get(stack.size() - 1);
  77.  
  78.         for (Stmt stmt : v.statements) {
  79.             if (!stmt.isPhi)
  80.                 stmt.renameRhsVar(p.name, stack.get(stack.size() - 1));
  81.             if (stmt.isAss && stmt.lhsIs(p)) {
  82.                 stmt.renameLhsVar(p.name, counter);
  83.                 stack.add(counter);
  84.                 counter++;
  85.             }
  86.         }
  87.  
  88.         v.succs.forEach(succ -> {
  89.             int j = whichPred(succ, v);
  90.             succ.phis.forEach(phiStmt -> {
  91.                 Var operand = phiStmt.rhs.vars.get(j);
  92.                 operand.index = stack.get(stack.size() - 1);
  93.                 phiStmt.rhs.vars.set(j, operand);
  94.             });
  95.         });
  96.  
  97.         //v.children.forEach(child -> traverse(child, p, stack, counter));
  98.         for (Vertex child : v.children)
  99.             traverse(child, p, stack, counter);
  100.  
  101.         v.statements.forEach(stmt -> {
  102.             if (stmt.lhs.name.equals(p.name))
  103.                 stack.remove(stack.size() - 1);
  104.         });
  105.     }
  106.  
  107.     private void renameVar(Var p) {
  108.  
  109.         List<Integer> stack = new ArrayList<Integer>();
  110.         stack.add(0);
  111.         int counter = 0;
  112.  
  113.         traverse(root, p, stack, counter);
  114.     }
  115.  
  116.  
  117.     private List<Stmt> initStmts(String statment) {
  118.         return null;
  119.     }
  120.  
  121.     private void buildCFGSample1() {
  122.  
  123.         //   [A]
  124.         //  /   \
  125.         // [B]  [C]
  126.         //  \   /
  127.         //   [D]
  128.         //    |
  129.         //   [E]
  130.  
  131.         Vertex a = new Vertex("a");
  132.         Vertex b = new Vertex("b");
  133.         Vertex c = new Vertex("c");
  134.         Vertex d = new Vertex("d");
  135.         Vertex e = new Vertex("e");
  136.  
  137.         this.postOrder.add(b);
  138.         this.postOrder.add(c);
  139.         this.postOrder.add(a);
  140.  
  141.         //=================== A ===================
  142.         Var leftPartA1 = new Var("x", "=");
  143.         Expr rightPartA1 = new Expr();
  144.         rightPartA1.vars.add(new Var("5", ";"));
  145.         Expr rightPartA2 = new Expr();
  146.         rightPartA2.vars.add(new Var("x", "-"));
  147.         rightPartA2.vars.add(new Var("3", ";"));
  148.         Expr rightPartA3 = new Expr();
  149.         rightPartA3.vars.add(new Var("1", ";"));
  150.  
  151.         a.statements.add(new AssStmt(leftPartA1, rightPartA1));
  152.         a.statements.add(new AssStmt(new Var("x", "="), rightPartA2));
  153.         a.statements.add(new AssStmt(new Var("y", "="), rightPartA3));
  154.         a.children.add(b);
  155.         a.children.add(c);
  156.         a.succs.add(b);
  157.         a.succs.add(c);
  158.         a.immediateDom = null;
  159.  
  160.         //=================== B ===================
  161.         Var leftPartB = new Var("t", "=");
  162.         Expr rightPartB1 = new Expr();
  163.         rightPartB1.vars.add(new Var("x", "*"));
  164.         rightPartB1.vars.add(new Var("2", ";"));
  165.         Expr rightPartB2 = new Expr();
  166.         rightPartB2.vars.add(new Var("y", ";"));
  167.  
  168.         b.statements.add(new AssStmt(new Var("y", "="), rightPartB1));
  169.         b.statements.add(new AssStmt(new Var("w", "="), rightPartB2));
  170.         b.precs.add(a);
  171.         b.immediateDom = a;
  172.  
  173.         //=================== C ===================
  174.         Expr rightPartC1 = new Expr();
  175.         rightPartC1.vars.add(new Var("x", "-"));
  176.         rightPartC1.vars.add(new Var("3", ";"));
  177.  
  178.         c.statements.add(new AssStmt(new Var("y", "="), rightPartC1));
  179.         c.precs.add(b);
  180.         c.immediateDom = a;
  181.  
  182.  
  183.         //renameVar(a, new Var("x", ""));
  184.         //renameVar(a, new Var("y", ""));
  185.         root = a;
  186.     }
  187.  
  188.     public static void main(String args[]) {
  189.  
  190.         optlab3 CFG = new optlab3();
  191.         CFG.postOrder = new ArrayList<Vertex>();
  192.         CFG.dominanceFrontier = new HashMap<Vertex, Set<Vertex>>();
  193.  
  194.         CFG.buildCFGSample1();
  195.         CFG.generateDFGlobal();
  196.  
  197.         CFG.renameVar(new Var("x", ""));
  198.         CFG.renameVar(new Var("y", ""));
  199.         CFG.renameVar(new Var("w", ""));
  200.  
  201.         CFG.printDominanceFrontier();
  202.  
  203.     }
  204.  
  205.  
  206.  
  207.     private void printDominanceFrontier() {
  208.         String s = "->";
  209.         for (Vertex v : dominanceFrontier.keySet()) {
  210.             s += v.toString() + " :[";
  211.             Set<Vertex> tmpSet = dominanceFrontier.get(v);
  212.             for (Vertex v1 : tmpSet)
  213.                 s += v1.toString();
  214.             s += "];\n";
  215.         }
  216.         System.out.println(s);
  217.     }
  218. }
  219.  
  220.  
  221.  
  222. ->A={stmts=[x_0 =5_0 ; , x_1 =x_0 - 3_0 ; , y_0 =1_0 ; ]} :[];
  223. C={stmts=[y_1 =x_1 - 3_0 ; ]} :[];
  224. B={stmts=[y_1 =x_1 * 2_0 ; , w_0 =y_1 ; ]} :[];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement