------- Comment #20 from jakub at gcc dot gnu dot org  2007-10-31 16:31 -------
What I'd try instead is something like:
--- tree-data-ref.c.jj11        2007-10-28 19:34:10.000000000 +0100
+++ tree-data-ref.c     2007-10-31 16:22:21.000000000 +0100
@@ -629,7 +629,7 @@ dr_analyze_innermost (struct data_refere
   enum machine_mode pmode;
   int punsignedp, pvolatilep;
   affine_iv base_iv, offset_iv;
-  tree init, dinit, step;
+  tree init, dinit, step, type;

   if (dump_file && (dump_flags & TDF_DETAILS))
     fprintf (dump_file, "analyze_innermost: ");
@@ -666,9 +666,21 @@ dr_analyze_innermost (struct data_refere

   init = ssize_int (pbitpos / BITS_PER_UNIT);
   split_constant_offset (base_iv.base, &base_iv.base, &dinit);
-  init =  size_binop (PLUS_EXPR, init, dinit);
+  init = size_binop (PLUS_EXPR, init, dinit);
   split_constant_offset (offset_iv.base, &offset_iv.base, &dinit);
-  init =  size_binop (PLUS_EXPR, init, dinit);
+  init = size_binop (PLUS_EXPR, init, dinit);
+
+  /* See if base address involves a variable length type somewhere.
+     Bases with such types shouldn't be gimplified again.  */
+  type = TREE_TYPE (base_iv.base);
+  while (POINTER_TYPE_P (type))
+    type = TREE_TYPE (type);
+  if (int_size_in_bytes (type) < 0)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+        fprintf (dump_file, "failed: base involves a variable length
type.\n");
+      return;
+    }

   step = size_binop (PLUS_EXPR,
                     fold_convert (ssizetype, base_iv.step),

or similar check in the vectorizer instead.  This exact patch breaks
gfortran.dg/vect/vect-3.f90 and gfortran.dg/vect/pr19049.f90 (they are no
longer vectorized as expected), would need to see whether it tries to unsafely
gimplify the VLA type sizes in the vectorizer or not.


-- 


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

Reply via email to