re PR tree-optimization/68961 (Test case gcc.target/powerpc/pr60203.c fails since...
authorRichard Biener <rguenther@suse.de>
Tue, 12 Jul 2016 08:56:14 +0000 (08:56 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 12 Jul 2016 08:56:14 +0000 (08:56 +0000)
2016-07-12  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/68961
* fwprop.c (propagate_rtx): Allow SUBREGs of VEC_CONCAT and CONCAT
to simplify to a non-constant.

* gcc.target/i386/pr68961.c: New testcase.

From-SVN: r238238

gcc/ChangeLog
gcc/fwprop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr68961.c [new file with mode: 0644]

index 7252ef87846d4c7e37b41d14b85e39930981d8d8..3c9432a67a7a189aecfc6f68d7692e67dd222e63 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-12  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/68961
+       * fwprop.c (propagate_rtx): Allow SUBREGs of VEC_CONCAT and CONCAT
+       to simplify to a non-constant.
+
 2016-07-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/71758
index 7834bca7f51491d6451c6d5ebe36d18a44f4eedf..88cfefbe1ef930c847b85aa3801a8c402930ffce 100644 (file)
@@ -619,6 +619,15 @@ propagate_rtx_1 (rtx *px, rtx old_rtx, rtx new_rtx, int flags)
 
   *px = tem;
 
+  /* Allow replacements that simplify operations on a vector or complex
+     value to a component.  The most prominent case is
+     (subreg ([vec_]concat ...)).   */
+  if (REG_P (tem) && !HARD_REGISTER_P (tem)
+      && (VECTOR_MODE_P (GET_MODE (new_rtx))
+         || COMPLEX_MODE_P (GET_MODE (new_rtx)))
+      && GET_MODE (tem) == GET_MODE_INNER (GET_MODE (new_rtx)))
+    return true;
+
   /* The replacement we made so far is valid, if all of the recursive
      replacements were valid, or we could simplify everything to
      a constant.  */
index a171ad874e9dd4e88048301353ffcaeca7abb580..f524bdac96412581b8a4b919b53ce0364f002d9f 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-12  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/68961
+       * gcc.target/i386/pr68961.c: New testcase.
+
 2016-07-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/71758
diff --git a/gcc/testsuite/gcc.target/i386/pr68961.c b/gcc/testsuite/gcc.target/i386/pr68961.c
new file mode 100644 (file)
index 0000000..ef379c4
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O3 -fno-vect-cost-model -fdump-tree-slp2-details" } */
+
+struct x { double d[2]; };
+
+struct x
+pack (double a, double aa)
+{
+  struct x u;
+  u.d[0] = a;
+  u.d[1] = aa;
+  return u;
+}
+
+/* The function should be optimized to just return as arguments and
+   result exactly overlap even when previously vectorized.  */
+
+/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" } } */
+/* { dg-final { scan-assembler-not "mov" } } */