re PR tree-optimization/91069 (Miscompare of 453.povray since r272843)
authorRichard Biener <rguenther@suse.de>
Wed, 3 Jul 2019 12:47:07 +0000 (12:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 3 Jul 2019 12:47:07 +0000 (12:47 +0000)
2019-07-03  Richard Biener  <rguenther@suse.de>

PR middle-end/91069
* match.pd (vec_perm -> bit_insert): Fix element read from
first vector.

* gcc.dg/pr91069.c: New testcase.

From-SVN: r273007

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr91069.c [new file with mode: 0644]

index 63160aab268bde62754b2fe3622997a2bf0bffbd..b3695cf56043a57a5e9d5522a115a842901a7281 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-03  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/91069
+       * match.pd (vec_perm -> bit_insert): Fix element read from
+       first vector.
+
 2019-07-03  Martin Liska  <mliska@suse.cz>
 
        * dbgcnt.def (DEBUG_COUNTER): Add match debug counter.
index f8e35e96d22036bb0b96fbdbe2c7a346f4695067..4a7aa0185d8f97e142c26b7ca5c03c05f7b3e280 100644 (file)
@@ -5520,7 +5520,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
                   first vector we only can insert the first elt from
                   the first vector.  */
                at = 0;
-               if ((ins = fold_read_from_vector (cop0, 0)))
+               if ((ins = fold_read_from_vector (cop0, sel[0])))
                  op0 = op1;
              }
            else
index 0214647af9746a59473b278cf5f95f61b3e2650a..95db1ad5806da35a73b28a811762700cf59b377e 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-03  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/91069
+       * gcc.dg/pr91069.c: New testcase.
+
 2019-07-03  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/tree-prof/val-prof-2.c: Update scanned pattern
diff --git a/gcc/testsuite/gcc.dg/pr91069.c b/gcc/testsuite/gcc.dg/pr91069.c
new file mode 100644 (file)
index 0000000..221da30
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu11" } */
+
+typedef double v2df __attribute__((vector_size(16)));
+typedef long v2di __attribute__((vector_size(16)));
+
+void foo (v2df *res, v2df *src)
+{
+  v2df x = *src;
+  *res = __builtin_shuffle ((v2df) { 1.0, 0.0 }, x, (v2di) { 1, 3 });
+}
+
+int main()
+{
+  v2df x = (v2df) { 0.0, 2.0 };
+  foo (&x, &x);
+  if (x[0] != 0.0 || x[1] != 2.0)
+    __builtin_abort ();
+  return 0;
+}