/** Inserts PHI functions at the beginning of basic blocks. */ private void insertPhiFunctions() { // See Figure 11 // http://www.cs.utexas.edu/~pingali/CS380C/2010/papers/ssaCytron.pdf int iterCount = 0; Map<BasicBlock, Integer> hasAlready = Maps.newHashMap(); Map<BasicBlock, Integer> work = Maps.newHashMap(); for (BasicBlock X : cfg.getLiveBasicBlocks()) { hasAlready.put(X, 0); work.put(X, 0); } Queue<BasicBlock> W = Lists.newLinkedList(); for (Variable V : cfg.variables()) { iterCount = iterCount + 1; for (BasicBlock X : Iterables.filter(cfg.getLiveBasicBlocks(), CfgPredicates.containsAssignmentTo(V))) { work.put(X, iterCount); W.add(X); } while (!W.isEmpty()) { BasicBlock X = W.poll(); for (BasicBlock Y : dtree.getFrontier(X)) { if (X != cfg.getExit()) { if (hasAlready.get(Y) < iterCount) { Y.insertPhiFunction(V, cfg.getPredecessors(Y).size()); // place (V <- phi(V,..., V)) at Y hasAlready.put(Y, iterCount); if (work.get(Y) < iterCount) { work.put(Y, iterCount); W.add(Y); } } } } } } }