aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>2014-05-20 14:14:21 +0000
committerWilliam Schmidt <wschmidt@gcc.gnu.org>2014-05-20 14:14:21 +0000
commitec217bd88a7f9ac30e05ff43de51dda5e4b001d2 (patch)
treec70cebb42d5110d8ce5aba1d0dec49af965a4b52 /gcc
parentb2b222b31138eb3772cfd648ff2cf31be27ee30b (diff)
downloadgcc-ec217bd88a7f9ac30e05ff43de51dda5e4b001d2.zip
gcc-ec217bd88a7f9ac30e05ff43de51dda5e4b001d2.tar.gz
gcc-ec217bd88a7f9ac30e05ff43de51dda5e4b001d2.tar.bz2
simplify-rtx.c (simplify_binary_operation_1): Optimize case of nested VEC_SELECTs that are inverses of each other.
[gcc] 2014-05-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com> * simplify-rtx.c (simplify_binary_operation_1): Optimize case of nested VEC_SELECTs that are inverses of each other. [gcc/testsuite] 2014-05-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com> * gcc.target/powerpc/vsxcopy.c: New test. From-SVN: r210644
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/simplify-rtx.c25
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vsxcopy.c15
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f0aecbd..7d518b8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-05-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * simplify-rtx.c (simplify_binary_operation_1): Optimize case of
+ nested VEC_SELECTs that are inverses of each other.
+
2014-05-20 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (process_scc): Dump SCC here, when
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 27e04f5..181b56f 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -3419,6 +3419,31 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
}
}
+ /* If we have two nested selects that are inverses of each
+ other, replace them with the source operand. */
+ if (GET_CODE (trueop0) == VEC_SELECT
+ && GET_MODE (XEXP (trueop0, 0)) == mode)
+ {
+ rtx op0_subop1 = XEXP (trueop0, 1);
+ gcc_assert (GET_CODE (op0_subop1) == PARALLEL);
+ gcc_assert (XVECLEN (trueop1, 0) == GET_MODE_NUNITS (mode));
+
+ /* Apply the outer ordering vector to the inner one. (The inner
+ ordering vector is expressly permitted to be of a different
+ length than the outer one.) If the result is { 0, 1, ..., n-1 }
+ then the two VEC_SELECTs cancel. */
+ for (int i = 0; i < XVECLEN (trueop1, 0); ++i)
+ {
+ rtx x = XVECEXP (trueop1, 0, i);
+ if (!CONST_INT_P (x))
+ return 0;
+ rtx y = XVECEXP (op0_subop1, 0, INTVAL (x));
+ if (!CONST_INT_P (y) || i != INTVAL (y))
+ return 0;
+ }
+ return XEXP (trueop0, 0);
+ }
+
return 0;
case VEC_CONCAT:
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 95ceb39..1440e04 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-05-20 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * gcc.target/powerpc/vsxcopy.c: New test.
+
2014-05-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58664
diff --git a/gcc/testsuite/gcc.target/powerpc/vsxcopy.c b/gcc/testsuite/gcc.target/powerpc/vsxcopy.c
new file mode 100644
index 0000000..fc1f0bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vsxcopy.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target { powerpc64*-*-* } } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O1" } */
+/* { dg-final { scan-assembler "lxvd2x" } } */
+/* { dg-final { scan-assembler "stxvd2x" } } */
+/* { dg-final { scan-assembler-not "xxpermdi" } } */
+
+typedef float vecf __attribute__ ((vector_size (16)));
+extern vecf j, k;
+
+void fun (void)
+{
+ j = k;
+}
+