re PR tree-optimization/32573 (ice for legal code with -O3)
authorJakub Jelinek <jakub@redhat.com>
Thu, 23 Aug 2007 23:29:57 +0000 (01:29 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 23 Aug 2007 23:29:57 +0000 (01:29 +0200)
PR tree-optimization/32573
PR middle-end/32946
* tree-data-ref.c (initialize_data_dependence_relation): Clear
DDR_SUBSCRIPTS, DDR_DIR_VECTS and DDR_DIST_VECTS at the beginning.
(finalize_ddr_dependent): Clear DDR_SUBSCRIPTS after freeing it.
(build_classic_dist_vector): Return false rather than true if
DDR_ARE_DEPENDENT is non-NULL at the beginning.  Return false
if either subscript_dependence_tester_1 or build_classic_dist_vector_1
returned false.  Don't call save_dist_v before calling
build_classic_dist_vector_1.
(free_dependence_relation): Don't guard freeing DDR_SUBSCRIPTS
with NULL DDR_ARE_DEPENDENT.  Also free DDR_DIST_VECTS and/or
DDR_DIR_VECTS vectors.

* gcc.dg/pr32573.c: New test.

From-SVN: r127750

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr32573.c [new file with mode: 0644]
gcc/tree-data-ref.c

index 0fa68c41ba3ff6ed0d433978f2a07c7149df9d61..630a5b61e249584234b5b378dd7008471751b782 100644 (file)
@@ -1,3 +1,19 @@
+2007-08-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/32573
+       PR middle-end/32946
+       * tree-data-ref.c (initialize_data_dependence_relation): Clear
+       DDR_SUBSCRIPTS, DDR_DIR_VECTS and DDR_DIST_VECTS at the beginning.
+       (finalize_ddr_dependent): Clear DDR_SUBSCRIPTS after freeing it.
+       (build_classic_dist_vector): Return false rather than true if
+       DDR_ARE_DEPENDENT is non-NULL at the beginning.  Return false
+       if either subscript_dependence_tester_1 or build_classic_dist_vector_1
+       returned false.  Don't call save_dist_v before calling
+       build_classic_dist_vector_1.
+       (free_dependence_relation): Don't guard freeing DDR_SUBSCRIPTS
+       with NULL DDR_ARE_DEPENDENT.  Also free DDR_DIST_VECTS and/or
+       DDR_DIR_VECTS vectors.
+
 2007-08-23  Brian Sidebotham  <brian.sidebotham@gmail.com>
 
        * configure.ac (leb128): Modify sed statement to work with any binutils
index 5c35247763519b293e2a598b71fdfb79728547b8..9b28b4b9ff463086215a3d4718ddfcffd4854e45 100644 (file)
@@ -1,5 +1,9 @@
 2007-08-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/32573
+       PR middle-end/32946
+       * gcc.dg/pr32573.c: New test.
+
        PR c++/32898
        * g++.dg/lookup/ns3.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr32573.c b/gcc/testsuite/gcc.dg/pr32573.c
new file mode 100644 (file)
index 0000000..d6897fb
--- /dev/null
@@ -0,0 +1,30 @@
+/* PR tree-optimization/32573 */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+int
+foo (void *x, long long *y)
+{
+  char a[256];
+  int i = 0;
+  long long b;
+  int c;
+  int d = 0;
+  int e = 0;
+  unsigned f = 0;
+  b = bar (x);
+  c = (unsigned) b;
+  while (d < b && d < 65557)
+    {
+      f = *(unsigned *) &a[0];
+      for (i = c - 4; i > 0; i--)
+       if (a[i + 0] == 0x50
+           && a[i + 1] == 0x4B
+           && a[i + 3] == 0x06)
+         {
+           e = 1;
+           break;
+         }
+    }
+  return !e;
+}
index 48a50ddfb10e64bd54869281a3751baaef2b7404..6ad2e96bea535b52a2d881c6fb8591f9714603b8 100644 (file)
@@ -1229,6 +1229,9 @@ initialize_data_dependence_relation (struct data_reference *a,
   DDR_B (res) = b;
   DDR_LOOP_NEST (res) = NULL;
   DDR_REVERSED_P (res) = false;
+  DDR_SUBSCRIPTS (res) = NULL;
+  DDR_DIR_VECTS (res) = NULL;
+  DDR_DIST_VECTS (res) = NULL;
 
   if (a == NULL || b == NULL)
     {
@@ -1268,8 +1271,6 @@ initialize_data_dependence_relation (struct data_reference *a,
   DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a));
   DDR_LOOP_NEST (res) = loop_nest;
   DDR_INNER_LOOP (res) = 0;
-  DDR_DIR_VECTS (res) = NULL;
-  DDR_DIST_VECTS (res) = NULL;
 
   for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
     {
@@ -1333,6 +1334,7 @@ finalize_ddr_dependent (struct data_dependence_relation *ddr,
 
   DDR_ARE_DEPENDENT (ddr) = chrec;  
   free_subscripts (DDR_SUBSCRIPTS (ddr));
+  DDR_SUBSCRIPTS (ddr) = NULL;
 }
 
 /* The dependence relation DDR cannot be represented by a distance
@@ -2961,7 +2963,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
   lambda_vector dist_v;
 
   if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
-    return true;
+    return false;
 
   if (same_access_functions (ddr))
     {
@@ -3013,11 +3015,13 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
       if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr)))
        {
          lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
-         subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr),
-                                        loop_nest);
+         if (!subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr),
+                                             loop_nest))
+           return false;
          compute_subscript_distance (ddr);
-         build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
-                                      save_v, &init_b, &index_carry);
+         if (!build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
+                                           save_v, &init_b, &index_carry))
+           return false;
          save_dist_v (ddr, save_v);
          DDR_REVERSED_P (ddr) = true;
 
@@ -3047,21 +3051,26 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
        {
          lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
          lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
-         save_dist_v (ddr, save_v);
 
          if (DDR_NB_LOOPS (ddr) > 1)
            {
              lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
 
-             subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr),
-                                            loop_nest);
+             if (!subscript_dependence_tester_1 (ddr, DDR_B (ddr),
+                                                 DDR_A (ddr), loop_nest))
+               return false;
              compute_subscript_distance (ddr);
-             build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
-                                          opposite_v, &init_b, &index_carry);
+             if (!build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
+                                               opposite_v, &init_b,
+                                               &index_carry))
+               return false;
 
+             save_dist_v (ddr, save_v);
              add_outer_distances (ddr, dist_v, index_carry);
              add_outer_distances (ddr, opposite_v, index_carry);
            }
+         else
+           save_dist_v (ddr, save_v);
        }
     }
   else
@@ -4288,8 +4297,12 @@ free_dependence_relation (struct data_dependence_relation *ddr)
   if (ddr == NULL)
     return;
 
-  if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_SUBSCRIPTS (ddr))
+  if (DDR_SUBSCRIPTS (ddr))
     free_subscripts (DDR_SUBSCRIPTS (ddr));
+  if (DDR_DIST_VECTS (ddr))
+    VEC_free (lambda_vector, heap, DDR_DIST_VECTS (ddr));
+  if (DDR_DIR_VECTS (ddr))
+    VEC_free (lambda_vector, heap, DDR_DIR_VECTS (ddr));
 
   free (ddr);
 }