DfType (DfaCallArguments args, DfaMemoryState state) { DfaValue[] arguments = args.myArguments; if (arguments.length != 2) return DfType.TOP; RelationType relation = state.getRelation(arguments[0], arguments[1]); if (relation == null) { LongRangeSet left = DfLongType.extractRange(state.getDfType(arguments[0])); LongRangeSet right = DfLongType.extractRange(state.getDfType(arguments[1])); if (left.isEmpty() || right.isEmpty()) return DfType.BOTTOM; if (left.max() < right.min()) { relation = RelationType.LT; } else if (left.max() <= right.min()) { relation = RelationType.LE; } else if (left.min() > right.max()) { relation = RelationType.GT; } else if (left.min() >= right.max()) { relation = RelationType.GE; } else if (!left.intersects(right)) { relation = RelationType.NE; } else if (left.getConstantValue() != null && left.equals(right)) { relation = RelationType.EQ; } } if (relation != null) { return intRangeClamped(LongRangeSet.point(0).fromRelation(relation)); } return DfType.TOP; }