]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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:08:47 +0000 (15:08 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Jun 2019 13:08:47 +0000 (15:08 +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: r272154

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

index ff5722cd9f202129a554aafe958669357323ec5f..8e33634f7a01465058412baa658d38d51e3efe71 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-05  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index 79a93a297a91d76f7ac0c924dc30b3e36d9f7a7d..59e1f351fc69891f6a72a3f930891d8a13d2d4f5 100644 (file)
@@ -2341,8 +2341,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 f131f62dd7c9c64e1300e9a02592679fd1d71bef..96e2b3d62616771adbbbf791df642063ee5413a0 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-07  John David Anglin  <danglin@gcc.gnu.org>
 
        * lib/scanasm.exp (dg-function-on-line): Add pattern for hppa*-*-linux*.
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);
+}