aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>2016-09-16 21:28:52 +0000
committerWilliam Schmidt <wschmidt@gcc.gnu.org>2016-09-16 21:28:52 +0000
commit9a42726b2e41d0d0d45bdf0c08ef59b9b6fde07d (patch)
tree7858b480c9f25effa75ae36e586da412abb94476
parent8f03e02f36105e7b3c7d21ce2368f3e3147d091a (diff)
downloadgcc-9a42726b2e41d0d0d45bdf0c08ef59b9b6fde07d.zip
gcc-9a42726b2e41d0d0d45bdf0c08ef59b9b6fde07d.tar.gz
gcc-9a42726b2e41d0d0d45bdf0c08ef59b9b6fde07d.tar.bz2
re PR target/77613 (Powerpc64le: redundant swaps in autovectorised loop)
[gcc] 2016-09-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR target/77613 * config/rs6000/rs6000.c (rtx_is_swappable_p): Add support for splat with truncate. [gcc/testsuite] 2016-09-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR target/77613 * gcc.target/powerpc/swaps-p8-25.c: New. From-SVN: r240199
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/swaps-p8-25.c18
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 660bd95..f87ea00 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-09-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ PR target/77613
+ * config/rs6000/rs6000.c (rtx_is_swappable_p): Add support for
+ splat with truncate.
+
2016-09-16 Jason Merrill <jason@redhat.com>
* hwint.h (least_bit_hwi, pow2_or_zerop, pow2p_hwi, ctz_or_zero):
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 557009f..ed24d96 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -39101,10 +39101,15 @@ rtx_is_swappable_p (rtx op, unsigned int *special)
handling. */
if (GET_CODE (XEXP (op, 0)) == CONST_INT)
return 1;
- else if (GET_CODE (XEXP (op, 0)) == REG
+ else if (REG_P (XEXP (op, 0))
&& GET_MODE_INNER (GET_MODE (op)) == GET_MODE (XEXP (op, 0)))
/* This catches V2DF and V2DI splat, at a minimum. */
return 1;
+ else if (GET_CODE (XEXP (op, 0)) == TRUNCATE
+ && REG_P (XEXP (XEXP (op, 0), 0))
+ && GET_MODE_INNER (GET_MODE (op)) == GET_MODE (XEXP (op, 0)))
+ /* This catches splat of a truncated value. */
+ return 1;
else if (GET_CODE (XEXP (op, 0)) == VEC_SELECT)
/* If the duplicated item is from a select, defer to the select
processing to see if we can change the lane for the splat. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dfcccf7..b2bded0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-09-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ PR target/77613
+ * gcc.target/powerpc/swaps-p8-25.c: New.
+
2016-09-16 Jakub Jelinek <jakub@redhat.com>
PR c++/77482
diff --git a/gcc/testsuite/gcc.target/powerpc/swaps-p8-25.c b/gcc/testsuite/gcc.target/powerpc/swaps-p8-25.c
new file mode 100644
index 0000000..5b99948
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/swaps-p8-25.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { powerpc64le-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-options "-mcpu=power8 -O3 " } */
+/* { dg-final { scan-assembler "lxvd2x" } } */
+/* { dg-final { scan-assembler "stxvd2x" } } */
+/* { dg-final { scan-assembler-not "xxpermdi" } } */
+
+/* Verify that swap optimization works correctly for a truncating splat. */
+
+/* Test case to resolve PR77613. */
+
+void pr77613 (signed short a, signed short *x, signed short *y)
+{
+ unsigned long i;
+
+ for (i = 0; i < 1024; i++)
+ y[i] = a * x[i] + y[i];
+}