re PR c++/90810 (Different intrinsics behavior on G++ 7.4 and G++ 8.3)
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Jun 2019 13:01:40 +0000 (15:01 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Jun 2019 13:01:40 +0000 (15:01 +0200)
PR c++/90810
* init.c (constant_value_1): Handle VECTOR_CST DECL_INITIAL for
!DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P decls like CONSTRUCTOR.

* g++.dg/ext/vector37.C: New test.

From-SVN: r272152

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector37.C [new file with mode: 0644]

index f279c7cdd282ae4ba92f60e59dc15fd6eea1b9d3..757f3fccf31f5ccd596c4686f60884ad4480889c 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/90810
+       * init.c (constant_value_1): Handle VECTOR_CST DECL_INITIAL for
+       !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P decls like CONSTRUCTOR.
+
 2019-06-11  Martin Liska  <mliska@suse.cz>
 
        PR c++/87847
index b206263f23cafb333aead809a5741042272d040d..e962113d15434712a5391f5620fcc2cb5c35faa1 100644 (file)
@@ -2339,8 +2339,11 @@ constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p)
                  || TREE_CODE (init) == STRING_CST)))
        break;
       /* Don't return a CONSTRUCTOR for a variable with partial run-time
-        initialization, since it doesn't represent the entire value.  */
-      if (TREE_CODE (init) == CONSTRUCTOR
+        initialization, since it doesn't represent the entire value.
+        Similarly for VECTOR_CSTs created by cp_folding those
+        CONSTRUCTORs.  */
+      if ((TREE_CODE (init) == CONSTRUCTOR
+          || TREE_CODE (init) == VECTOR_CST)
          && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
        break;
       /* If the variable has a dynamic initializer, don't use its
index a40e0141a4924fce184a1b71e856aa7c024182de..beecd96eab56b7c12d16b866b4fac7cb4b6d419d 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/90810
+       * g++.dg/ext/vector37.C: New test.
+
 2019-06-10  Matthew Beliveau  <mbelivea@redhat.com>
 
        PR c++/87250
diff --git a/gcc/testsuite/g++.dg/ext/vector37.C b/gcc/testsuite/g++.dg/ext/vector37.C
new file mode 100644 (file)
index 0000000..a7baf8d
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/90810
+// { dg-do run }
+
+void
+foo (float x, float y)
+{
+  typedef float __attribute__ ((__vector_size__ (4 * sizeof (float)), __may_alias__)) V;
+  const V a = { x, x, x, x }, b = { y, y, y, y };
+  const V c = a / b;
+  if (c[0] != 6.0f || c[1] != 6.0f || c[2] != 6.0f || c[3] != 6.0f)
+    __builtin_abort ();
+}
+
+void
+bar (float y)
+{
+  typedef float __attribute__ ((__vector_size__ (4 * sizeof (float)), __may_alias__)) V;
+  const V a = { 7.0f, 8.0f, 9.0f, 10.0f }, b = { 1.0f, 2.0f, 3.0f, y };
+  const V c = a / b;
+  if (c[0] != 7.0f || c[1] != 4.0f || c[2] != 3.0f || c[3] != 5.0f)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo (12.0f, 2.0f);
+  bar (2.0f);
+}