}
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)) {