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