]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/29637 (Endless recursion in make_vector_type)
authorJakub Jelinek <jakub@redhat.com>
Mon, 30 Oct 2006 08:01:28 +0000 (09:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 30 Oct 2006 08:01:28 +0000 (09:01 +0100)
PR tree-optimization/29637
* tree.c (make_vector_type): Don't recurse if TYPE_MAIN_VARIANT
of the innertype is the innertype itself.

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

From-SVN: r118175

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr29637.c [new file with mode: 0644]
gcc/tree.c

index def4fca1deb54528631053ffc7c21a9f6f61d39d..abcdecefe87922e276843bc4a0efd3c6c91a7660 100644 (file)
@@ -1,3 +1,9 @@
+2006-10-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/29637
+       * tree.c (make_vector_type): Don't recurse if TYPE_MAIN_VARIANT
+       of the innertype is the innertype itself.
+
 2006-10-30  Danny Smith  <dannysmith@users.sourceforge.net>
 
        * dwarf2out.c (file_name_acquire): Correct typo.
index 1d44a4c6f7b0cab3ec715fe8fbe834c1f0dd16f0..3d1049466d6a61985db8d20d9c3696039d633730 100644 (file)
@@ -1,3 +1,8 @@
+2006-10-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/29637
+       * gcc.dg/pr29637.c: New test.
+
 2006-10-29  Roger Sayle  <roger@eyesopen.com>
 
        * gcc.dg/fold-compare-1.c: Update to reflect recent changes in
diff --git a/gcc/testsuite/gcc.dg/pr29637.c b/gcc/testsuite/gcc.dg/pr29637.c
new file mode 100644 (file)
index 0000000..5dfee41
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR tree-optimization/29637 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+typedef struct __attribute__ ((aligned (8)))
+{
+    short a, b, c, d;
+} A;
+
+typedef struct
+{
+  A a[24];
+} B;
+
+static const A b = { 0, 0, 1, -1 };
+
+void
+foo (B *x)
+{
+  int i;
+  for (i = 0; i <= 20; i += 4)
+    x->a[i] = b;
+}
index 8f869fa16ba34f64aeb4f01ea0b991d800a208f3..d0c56c40dd22a8faf977eb774713855137822aac 100644 (file)
@@ -6400,7 +6400,8 @@ make_vector_type (tree innertype, int nunits, enum machine_mode mode)
 
   /* Build a main variant, based on the main variant of the inner type, then
      use it to build the variant we return.  */
-  if (TYPE_ATTRIBUTES (innertype) || TYPE_QUALS (innertype))
+  if ((TYPE_ATTRIBUTES (innertype) || TYPE_QUALS (innertype))
+      && TYPE_MAIN_VARIANT (innertype) != innertype)
     return build_type_attribute_qual_variant (
            make_vector_type (TYPE_MAIN_VARIANT (innertype), nunits, mode),
            TYPE_ATTRIBUTES (innertype),