public Value merge(final Value v, final Value w) {
        SourceValue dv = (SourceValue) v;
        SourceValue dw = (SourceValue) w;
        if (dv.insns instanceof SmallSet && dw.insns instanceof SmallSet) {
            Set s = ((SmallSet) dv.insns).union((SmallSet) dw.insns);
            if (s == dv.insns && dv.size == dw.size) {
                return v;
            } else {
                return new SourceValue(Math.min(dv.size, dw.size), s);
            }
        }
        if (dv.size != dw.size || !dv.insns.containsAll(dw.insns)) {
            Set s = new HashSet();
            s.addAll(dv.insns);
            s.addAll(dw.insns);
            return new SourceValue(Math.min(dv.size, dw.size), s);
        }
        return v;
    }