private void connectPhiFuncs(Set<SSA> liveJoin, BasicBlock joinBlock) {
   for (SSA result : joinBlock.getPhiManager().getPhiResults()) {
     liveJoin.remove(result);
     Cluster resultCluster = this.getCluster(result);
     for (SSA x : liveJoin) {
       Cluster xCluster = this.getCluster(x);
       // add edge i <-> x
       xCluster.connectWith(resultCluster);
     }
   }
 }
  private void updateInterferenceGraph() {
    for (Cluster cluster : clusters) {
      for (Cluster otherCluster : clusters) {

        if (cluster.interfere(otherCluster)
            && cluster != otherCluster
            && !otherCluster.getNeighborClusters().contains(cluster)) {
          cluster.connectWith(otherCluster);
        }
      }
    }
  }
  private Set<SSA> buildIGFromBlock(BasicBlock curBB, Set<SSA> live) {
    List<Instruction> instList = curBB.getInstructions();
    for (int i = instList.size() - 1; i >= 0; i--) {
      Instruction inst = instList.get(i);
      // ignore phi function
      if (inst.getOperator() == Instruction.phi) {
        return live;
      }
      if (inst.getOperator() == Instruction.subroutine) {
        live = this.buildIGRecursive(inst.getOperand2().block, live);
        continue;
      }
      List<SSA> results = VariableManager.getSSAsByVersion(inst.getId());
      // live = live - {i}
      live.removeAll(results);
      live.remove(null);
      // for all x belong to live do

      for (SSA result : results) {
        Cluster resultCluster = this.getCluster(result);
        for (SSA x : live) {
          Cluster xCluster = this.getCluster(x);
          // add edge i <-> x
          xCluster.connectWith(resultCluster);
        }
      }

      // live = live + {j, k}
      if (inst.getOperand1() != null) {
        SSA j = inst.getOperand1().ssa;
        if (j != null) {
          live.add(j);
        }
      }

      if (inst.getOperand2() != null) {
        SSA k = inst.getOperand2().ssa;
        if (k != null) {
          live.add(k);
        }
      }
    }
    return live;
  }