OSDN Git Service

PR c++/36695
[pf3gnuchains/gcc-fork.git] / gcc / tree-vrp.c
index 9d23b24..4b6caca 100644 (file)
@@ -6361,9 +6361,12 @@ vrp_visit_phi_node (gimple phi)
             minimums.  */
          if (cmp_min > 0 || cmp_min < 0)
            {
-             /* If we will end up with a (-INF, +INF) range, set it
-                to VARYING.  */
-             if (vrp_val_is_max (vr_result.max))
+             /* If we will end up with a (-INF, +INF) range, set it to
+                VARYING.  Same if the previous max value was invalid for
+                the type and we'd end up with vr_result.min > vr_result.max.  */
+             if (vrp_val_is_max (vr_result.max)
+                 || compare_values (TYPE_MIN_VALUE (TREE_TYPE (vr_result.min)),
+                                    vr_result.max) > 0)
                goto varying;
 
              if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
@@ -6380,9 +6383,12 @@ vrp_visit_phi_node (gimple phi)
             the previous one, go all the way to +INF.  */
          if (cmp_max < 0 || cmp_max > 0)
            {
-             /* If we will end up with a (-INF, +INF) range, set it
-                to VARYING.  */
-             if (vrp_val_is_min (vr_result.min))
+             /* If we will end up with a (-INF, +INF) range, set it to
+                VARYING.  Same if the previous min value was invalid for
+                the type and we'd end up with vr_result.max < vr_result.min.  */
+             if (vrp_val_is_min (vr_result.min)
+                 || compare_values (TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)),
+                                    vr_result.min) < 0)
                goto varying;
 
              if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))