re PR target/77613 (Powerpc64le: redundant swaps in autovectorised loop)
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Fri, 16 Sep 2016 21:28:52 +0000 (21:28 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Fri, 16 Sep 2016 21:28:52 +0000 (21:28 +0000)
[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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/swaps-p8-25.c [new file with mode: 0644]

index 660bd9580b456899e73dab6cc642245a4807c9b3..f87ea00dfd8419f1feb3e6da5e25b744dd14cec1 100644 (file)
@@ -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):
index 557009f8099736960e4a7371104543def9d00bb9..ed24d96006f969dc099acbf65cc97e9fdc56ed05 100644 (file)
@@ -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.  */
index dfcccf7726e1fa9b35269af8fde9a296fe0127e4..b2bded06ac6ef777bc64c3bdc06dd013c88388e8 100644 (file)
@@ -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 (file)
index 0000000..5b99948
--- /dev/null
@@ -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];
+}