private void run() {
    SsaBasicBlock firstBlock = ssaMeth.getEntryBlock();
    addBlockToWorklist(firstBlock);

    /* Empty all the worklists by propagating our values */
    while (!cfgWorklist.isEmpty()
        || !cfgPhiWorklist.isEmpty()
        || !ssaWorklist.isEmpty()
        || !varyingWorklist.isEmpty()) {
      while (!cfgWorklist.isEmpty()) {
        int listSize = cfgWorklist.size() - 1;
        SsaBasicBlock block = cfgWorklist.remove(listSize);
        simulateBlock(block);
      }

      while (!cfgPhiWorklist.isEmpty()) {
        int listSize = cfgPhiWorklist.size() - 1;
        SsaBasicBlock block = cfgPhiWorklist.remove(listSize);
        simulatePhiBlock(block);
      }

      while (!varyingWorklist.isEmpty()) {
        int listSize = varyingWorklist.size() - 1;
        SsaInsn insn = varyingWorklist.remove(listSize);

        if (!executableBlocks.get(insn.getBlock().getIndex())) {
          continue;
        }

        if (insn instanceof PhiInsn) {
          simulatePhi((PhiInsn) insn);
        } else {
          simulateStmt(insn);
        }
      }
      while (!ssaWorklist.isEmpty()) {
        int listSize = ssaWorklist.size() - 1;
        SsaInsn insn = ssaWorklist.remove(listSize);

        if (!executableBlocks.get(insn.getBlock().getIndex())) {
          continue;
        }

        if (insn instanceof PhiInsn) {
          simulatePhi((PhiInsn) insn);
        } else {
          simulateStmt(insn);
        }
      }
    }

    replaceConstants();
    replaceBranches();
  }
Simulates a statement and set the result lattice value.

@param insn instruction to simulate
android/android_framework/dex-maker/src/main/java/com/android/dx/ssa/SCCP.java