/** Merge the congruence classes containing vertices v1 and v2.; */ public void mergeClasses(OPT_ValueGraphVertex v1, OPT_ValueGraphVertex v2) { if (DEBUG) { System.out.println("@@@@ mergeClasses called with v1 = " + v1 + " ; v2 = " + v2); } int val1 = v1.getValueNumber(); int val2 = v2.getValueNumber(); if (val1 == val2) return; OPT_GVCongruenceClass class1 = (OPT_GVCongruenceClass) B.get(val1); while (true) { OPT_GVCongruenceClass class2 = (OPT_GVCongruenceClass) B.get(val2); Iterator i = class2.iterator(); if (!i.hasNext()) break; OPT_ValueGraphVertex v = (OPT_ValueGraphVertex) i.next(); if (DEBUG) System.out.println("@@@@ moving vertex " + v + " from class " + val2 + " to class " + val1); class1.addVertex(v); class2.removeVertex(v); v.setValueNumber(val1); } // Null out entry for val2 B.set(val2, null); }
/** * Partition a congruence class. * * @param partition the class to partition */ private void partitionClass(OPT_GVCongruenceClass partition) { // store a reference to the first node in c, which will serve // as a representative for this class Iterator i = partition.iterator(); OPT_ValueGraphVertex first = (OPT_ValueGraphVertex) i.next(); ArrayList newClasses = new ArrayList(); // now check each other node in c, to see if it matches the // representative ArrayList toRemove = new ArrayList(); for (; i.hasNext(); ) { OPT_ValueGraphVertex v = (OPT_ValueGraphVertex) i.next(); if (!checkCongruence(first, v)) { // NOT CONGRUENT!! split the partition. first check if // v fits in any other newly created congruence classes int index = findCongruenceMatch(newClasses, v); if (index > -1) { // MATCH FOUND!! place v in newClasses[index] OPT_GVCongruenceClass match = (OPT_GVCongruenceClass) B.get(index); match.addVertex(v); v.setValueNumber(match.getValueNumber()); } else { // NO MATCH FOUND!! create a new congruence class // find the appropriate label for the new congruence class // and create a new congruence class with this label OPT_GVCongruenceClass c = createCongruenceClass(v); newClasses.add(c); c.addVertex(v); v.setValueNumber(c.getValueNumber()); } // mark v as to be removed from partition // (Can't remove it yet while iterating over the set); toRemove.add(v); } } // remove necessary vertices for (Iterator it = toRemove.iterator(); it.hasNext(); ) { OPT_ValueGraphVertex v = (OPT_ValueGraphVertex) it.next(); partition.removeVertex(v); } // if needed place the original partition back on the work list if ((newClasses.size() > 0) && (partition.size() > 1)) { workList.push(partition); } // place any new congruence classes with size > 1 on the worklist // also place any classes which might indirectly be affected for (int j = 0; j < newClasses.size(); j++) { OPT_GVCongruenceClass c = (OPT_GVCongruenceClass) newClasses.get(j); if (c.size() > 1) workList.push(c); addDependentClassesToWorklist(c); } }