(merge_ranges): In (+,-) case, treat subset specially
authorJim Wilson <wilson@gcc.gnu.org>
Tue, 12 Nov 1996 18:19:42 +0000 (10:19 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 12 Nov 1996 18:19:42 +0000 (10:19 -0800)
if lower bounds are the same.

From-SVN: r13127

gcc/fold-const.c

index b3f43657d2ceeb9e2621d4ff2384502fb95d5eba..1ddfd4782089a9ea3ccd209309fad7a32781c2ff 100644 (file)
@@ -2963,16 +2963,20 @@ merge_ranges (pin_p, plow, phigh, in0_p, low0, high0, in1_p, low1, high1)
     {
       /* If they don't overlap, the result is the first range.  If the
         second range is a subset of the first, we can't describe this as
-        a single range unless both ranges end at the same place, in which
-        case we can ignore the fact that it's a subset.  Otherwise, we go
-        from the start of the first range to just before the start of the
-        second.  */
+        a single range unless both ranges end at the same place.  If both
+        ranges also start in the same place, then the result is false.
+        Otherwise, we go from the start of the first range to just before
+        the start of the second.  */
       if (no_overlap)
        in_p = 1, low = low0, high = high0;
       else if (subset
               && integer_zerop (range_binop (EQ_EXPR, integer_type_node,
                                              high0, 1, high1, 0)))
        return 0;
+      else if (subset
+              && integer_onep (range_binop (EQ_EXPR, integer_type_node,
+                                            low0, 0, low1, 0)))
+       in_p = 0, low = high = 0;
       else
        {
          in_p = 1, low = low0;