Esempio n. 1
0
  /** 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);
              }
            }
          }
        }
      }
    }
  }