rs6000.c (rtx_is_swappable_p): Add UNSPEC_VSX_CVDPSPN as an unswappable operand...
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Tue, 9 Sep 2014 16:53:07 +0000 (16:53 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Tue, 9 Sep 2014 16:53:07 +0000 (16:53 +0000)
[gcc]

2014-09-09  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* config/rs6000/rs6000.c (rtx_is_swappable_p): Add
UNSPEC_VSX_CVDPSPN as an unswappable operand, and add commentary
on how to make it legal in future.

[gcc/testsuite]

2014-09-09  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* gcc.target/powerpc/swaps-p8-15.c: Remove scan-assembler-not for
xxpermdi and add commentary about adding it back later; remove
unused typedef.

From-SVN: r215088

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/swaps-p8-15.c

index 8f7c7e3..aa75e05 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-09  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * config/rs6000/rs6000.c (rtx_is_swappable_p): Add
+       UNSPEC_VSX_CVDPSPN as an unswappable operand, and add commentary
+       on how to make it legal in future.
+
 2014-09-09  David Malcolm  <dmalcolm@redhat.com>
 
        * caller-save.c (rtx saveinsn): Strengthen this variable from rtx
index 3ed8107..dcd8c72 100644 (file)
@@ -33761,8 +33761,6 @@ rtx_is_swappable_p (rtx op, unsigned int *special)
          case UNSPEC_VSUMSWS:
          case UNSPEC_VSUMSWS_DIRECT:
          case UNSPEC_VSX_CONCAT:
-         case UNSPEC_VSX_CVSPDP:
-         case UNSPEC_VSX_CVSPDPN:
          case UNSPEC_VSX_SET:
          case UNSPEC_VSX_SLDWI:
          case UNSPEC_VUNPACK_HI_SIGN:
@@ -33775,6 +33773,15 @@ rtx_is_swappable_p (rtx op, unsigned int *special)
          case UNSPEC_VUPKLPX:
          case UNSPEC_VUPKLS_V4SF:
          case UNSPEC_VUPKLU_V4SF:
+         /* The following could be handled as an idiom with XXSPLTW.
+            These place a scalar in BE element zero, but the XXSPLTW
+            will currently expect it in BE element 2 in a swapped
+            region.  When one of these feeds an XXSPLTW with no other
+            defs/uses either way, we can avoid the lane change for
+            XXSPLTW and things will be correct.  TBD.  */
+         case UNSPEC_VSX_CVDPSPN:
+         case UNSPEC_VSX_CVSPDP:
+         case UNSPEC_VSX_CVSPDPN:
            return 0;
          case UNSPEC_VSPLT_DIRECT:
            *special = SH_SPLAT;
index cb5d81a..448a7ef 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-09  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * gcc.target/powerpc/swaps-p8-15.c: Remove scan-assembler-not for
+       xxpermdi and add commentary about adding it back later; remove
+       unused typedef.
+
 2014-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/arm/vect-lceilf_1.c: Make input and output arrays global
index 3c9296c..e7191b3 100644 (file)
@@ -3,13 +3,14 @@
 /* { dg-final { scan-assembler "lxvd2x" } } */
 /* { dg-final { scan-assembler "stxvd2x" } } */
 /* { dg-final { scan-assembler "xxspltw" } } */
-/* { dg-final { scan-assembler-not "xxpermdi" } } */
 
+/* Currently the analyze_swaps phase cannot optimize this loop because
+   of the presence of an UNSPEC_VSX_CVDPSPN.  At such time as this is 
+   handled, we need to add a 'scan-assembler-not "xxpermdi"' directive to
+   this test.  */
 #include <altivec.h>
 void abort();
 
-typedef struct xx {vector double l; vector double h;} xx;
-
 #define N 4096
 #define M 10000000
 vector float ca[N][4] = {0};