[Bug tree-optimization/39455] [4.3/4.4 Regression] ICE : in compare_values_warnv, at tree-vrp.c:1073

jakub at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Mon Mar 16 09:43:00 GMT 2009



------- Comment #10 from jakub at gcc dot gnu dot org  2009-03-16 09:43 -------
Seems tree-ssa-loop-niter.c has a lot of p+ issues.  The following untested
patch fixes just the number_of_iterations_lt_to_ne bugs and fixes this
testcase:

--- gcc/tree-ssa-loop-niter.c.jj        2009-03-04 20:06:31.000000000 +0100
+++ gcc/tree-ssa-loop-niter.c   2009-03-16 10:30:39.000000000 +0100
@@ -699,8 +699,10 @@ number_of_iterations_lt_to_ne (tree type
         iv0->base <= iv1->base + MOD.  */
       if (!iv0->no_overflow && !integer_zerop (mod))
        {
-         bound = fold_build2 (MINUS_EXPR, type,
+         bound = fold_build2 (MINUS_EXPR, type1,
                               TYPE_MAX_VALUE (type1), tmod);
+         if (POINTER_TYPE_P (type))
+           bound = fold_convert (type, bound);
          assumption = fold_build2 (LE_EXPR, boolean_type_node,
                                    iv1->base, bound);
          if (integer_zerop (assumption))
@@ -708,6 +710,11 @@ number_of_iterations_lt_to_ne (tree type
        }
       if (mpz_cmp (mmod, bnds->below) < 0)
        noloop = boolean_false_node;
+      else if (POINTER_TYPE_P (type))
+       noloop = fold_build2 (GT_EXPR, boolean_type_node,
+                             iv0->base,
+                             fold_build2 (POINTER_PLUS_EXPR, type,
+                                          iv1->base, tmod));
       else
        noloop = fold_build2 (GT_EXPR, boolean_type_node,
                              iv0->base,
@@ -723,6 +730,8 @@ number_of_iterations_lt_to_ne (tree type
        {
          bound = fold_build2 (PLUS_EXPR, type1,
                               TYPE_MIN_VALUE (type1), tmod);
+         if (POINTER_TYPE_P (type))
+           bound = fold_convert (type, bound);
          assumption = fold_build2 (GE_EXPR, boolean_type_node,
                                    iv0->base, bound);
          if (integer_zerop (assumption))
@@ -730,6 +739,13 @@ number_of_iterations_lt_to_ne (tree type
        }
       if (mpz_cmp (mmod, bnds->below) < 0)
        noloop = boolean_false_node;
+      else if (POINTER_TYPE_P (type))
+       noloop = fold_build2 (GT_EXPR, boolean_type_node,
+                             fold_build2 (POINTER_PLUS_EXPR, type,
+                                          iv0->base,
+                                          fold_unary (NEGATE_EXPR,
+                                                      type1, tmod)),
+                             iv1->base);
       else
        noloop = fold_build2 (GT_EXPR, boolean_type_node,
                              fold_build2 (MINUS_EXPR, type1,

but e.g. number_of_iterations_le doesn't look correct at all as well.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39455



More information about the Gcc-bugs mailing list