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; }