public void clustering(List<Instruction> instList) {
    // for all phi instructions "x = phi(y1,y2)"
    for (Instruction inst : instList) {
      if (inst.getOperator() == Instruction.phi) {
        // cluster = {x},
        Cluster phiCluster = this.findCluster(VariableManager.getSSAByVersion(inst.getId()));
        if (phiCluster != null) {

          this.mergeCluster(phiCluster, inst.getOperand1());

          this.mergeCluster(phiCluster, inst.getOperand2());
        }
      }
    }

    this.updateInterferenceGraph();
  }
  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;
  }