boolean (EqClass eqClass, DfaMemoryStateImpl other) { if (eqClass.size() <= 1) return false; List<EqClass> groups = splitEqClass(eqClass, other); if (groups.size() == 1) return false; IntList addedClasses = new IntArrayList(); int origIndex = myIdToEqClassesIndices.get(eqClass.get(0)); for (EqClass group : groups) { addedClasses.add(storeClass(group)); } int[] addedClassesArray = addedClasses.toIntArray(); myDistinctClasses.splitClass(origIndex, addedClassesArray); myEqClasses.set(origIndex, null); DfaVariableValue from = eqClass.getCanonicalVariable(); boolean otherClassChanged = false; if (from != null && !from.getDependentVariables().isEmpty()) { List<DfaVariableValue> vars = new ArrayList<>(myVariableTypes.keySet()); for (int classIndex : addedClassesArray) { DfaVariableValue to = myEqClasses.get(classIndex).getCanonicalVariable(); if (to == null || to == from || to.getDepth() > from.getDepth()) continue; for (DfaVariableValue var : vars) { DfaVariableValue target = replaceQualifier(var, from, to); if (target != var) { recordVariableType(target, getDfType(var)); } } for (int valueId : myIdToEqClassesIndices.keySet().toIntArray()) { DfaValue value = myFactory.getValue(valueId); DfaVariableValue var = ObjectUtils.tryCast(value, DfaVariableValue.class); if (var == null || var.getQualifier() != from) continue; DfaVariableValue target = var.withQualifier(to); boolean united = uniteClasses(var, target); assert united; otherClassChanged = true; } } } checkInvariants(); return otherClassChanged; }