re PR tree-optimization/33614 (ICE on semi-constant vector CONSTRUCTORs)
authorRichard Sandiford <rsandifo@nildram.co.uk>
Mon, 29 Oct 2007 22:01:24 +0000 (22:01 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 29 Oct 2007 22:01:24 +0000 (22:01 +0000)
gcc/
PR tree-optimization/33614
* gimplify.c (gimplify_init_constructor): Gimplify vector constructors
if they can't be reduced to VECTOR_CSTs and aren't legitimate
initializer constants.

gcc/testsuite/
PR tree-optimization/33614
* gcc.c-torture/compile/pr33614.c: New test.

From-SVN: r129739

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr33614.c [new file with mode: 0644]

index 9899775fb38348d0dc6b5025ff5ece2f36f72b12..a8d26816d8cc3850597f2f9100a51ebb74286236 100644 (file)
@@ -1,3 +1,10 @@
+2007-10-29  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR tree-optimization/33614
+       * gimplify.c (gimplify_init_constructor): Gimplify vector constructors
+       if they can't be reduced to VECTOR_CSTs and aren't legitimate
+       initializer constants.
+
 2007-10-29  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/33870
index 038337732b534d8c47e1ceab74e0c1c4df1c303a..5c11bad3a08510d25740ed1c0fa3bbb685b8a3f4 100644 (file)
@@ -3290,8 +3290,9 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
            tree value;
 
            /* Even when ctor is constant, it might contain non-*_CST
-             elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
-             belong into VECTOR_CST nodes.  */
+              elements, such as addresses or trapping values like
+              1.0/0.0 - 1.0/0.0.  Such expressions don't belong
+              in VECTOR_CST nodes.  */
            FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
              if (!CONSTANT_CLASS_P (value))
                {
@@ -3305,10 +3306,14 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
                break;
              }
 
-           /* Don't reduce a TREE_CONSTANT vector ctor even if we can't
+           /* Don't reduce an initializer constant even if we can't
               make a VECTOR_CST.  It won't do anything for us, and it'll
               prevent us from representing it as a single constant.  */
-           break;
+           if (initializer_constant_valid_p (ctor, type))
+             break;
+
+           TREE_CONSTANT (ctor) = 0;
+           TREE_INVARIANT (ctor) = 0;
          }
 
        /* Vector types use CONSTRUCTOR all the way through gimple
index bde12e5fd6564812c978efa0a7cfd4e7d0287c21..db874d34f06516de6920901939fbbc5cc8a08478 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-29  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR tree-optimization/33614
+       * gcc.c-torture/compile/pr33614.c: New test.
+
 2007-10-29  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/33870
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr33614.c b/gcc/testsuite/gcc.c-torture/compile/pr33614.c
new file mode 100644 (file)
index 0000000..2b835b9
--- /dev/null
@@ -0,0 +1,9 @@
+typedef float V2SF __attribute__ ((vector_size (8)));
+
+V2SF
+foo (int x, V2SF a)
+{
+  while (x--)
+    a += (V2SF) {1.0f/0.0f - 1.0f/0.0f, 1.0f/0.0f - 1.0f/0.0f};
+  return a;
+}