Ejemplo n.º 1
0
  private void search(BasicBlock X) {

    for (Statement stmt : X.getStatements()) {
      Expression rhs = stmt.getRHS();
      if (!(rhs instanceof PhiFunction)) {
        for (Variable V : rhs.variables()) {
          int i = Top(V);
          rhs = rhs.replaceVariable(V, new SsaVariable(V, i));
        }
        stmt = X.replaceStatement(stmt, stmt.withRHS(rhs));
      }

      if (stmt instanceof Assignment) {
        Assignment assignment = (Assignment) stmt;
        if (assignment.getLHS() instanceof Variable) {
          Variable V = (Variable) assignment.getLHS();
          int i = C.get(V);
          X.replaceStatement(assignment, assignment.withLHS(new SsaVariable(V, i)));
          S.get(V).push(i);
          C.put(V, i + 1);
        }
      }
    }

    for (BasicBlock Y : cfg.getSuccessors(X)) {
      int j = whichPred(Y, X);
      for (Assignment A : Lists.newArrayList(Y.phiAssignments())) {
        PhiFunction rhs = (PhiFunction) A.getRHS();
        Variable V = rhs.getArgument(j);
        int i = Top(V);
        rhs = rhs.replaceVariable(j, i);
        Y.replaceStatement(A, new Assignment(A.getLHS(), rhs));
        // replace the j-th operand V in RHS(F) by V_i where i = Top(S(V))
      }
    }
    for (BasicBlock Y : dtree.getChildren(X)) {
      search(Y);
    }
    for (Assignment A : X.assignments()) {
      if (A.getLHS() instanceof SsaVariable) {
        SsaVariable lhs = (SsaVariable) A.getLHS();
        S.get(lhs.getInner()).pop();
      }
    }
  }