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(); } } }