re PR target/68805 (ICE while var-tracking in simplify_binary_operation_1 with -g...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Thu, 17 Dec 2015 01:01:24 +0000 (01:01 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Thu, 17 Dec 2015 01:01:24 +0000 (01:01 +0000)
[gcc]
2015-12-15  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/68805
* config/rs6000/rs6000.c (rs6000_gen_le_vsx_permute): Use ROTATE
instead of VEC_SELECT for TImode.

* config/rs6000/vsx.md (VSX_LE): Move TImode from VSX_LE to
VSX_LE_128, so that we use ROTATE to swap the 64-bit words instead
of using VEC_SELECT.
(VSX_LE_128): Likewise.
(define_peephole2): Add peephole to eliminate double xxpermdi when
copying TImode.

[gcc/testsuite]
2015-12-15  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/68805
* gcc.target/powerpc/pr68805.c: New test.

From-SVN: r231732

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/vsx.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr68805.c [new file with mode: 0644]

index 8b0a5e7921dd5e6e3e9e26b7a0b17a6f436358b5..d7607d7d88b9d9484f11e8432eab7ec6312ad2b6 100644 (file)
@@ -1,3 +1,16 @@
+2015-12-15  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/68805
+       * config/rs6000/rs6000.c (rs6000_gen_le_vsx_permute): Use ROTATE
+       instead of VEC_SELECT for TImode.
+
+       * config/rs6000/vsx.md (VSX_LE): Move TImode from VSX_LE to
+       VSX_LE_128, so that we use ROTATE to swap the 64-bit words instead
+       of using VEC_SELECT.
+       (VSX_LE_128): Likewise.
+       (define_peephole2): Add peephole to eliminate double xxpermdi when
+       copying TImode.
+
 2015-12-16  John David Anglin  <danglin@gcc.gnu.org>
 
        PR target/68779
index 6b22f93e0ffbd053b1b85e4b4345e642543fad7c..8ffdae2e0241ac3c85bf5f9e54f55a09a8108714 100644 (file)
@@ -8829,8 +8829,9 @@ rs6000_const_vec (machine_mode mode)
 rtx
 rs6000_gen_le_vsx_permute (rtx source, machine_mode mode)
 {
-  /* Use ROTATE instead of VEC_SELECT on IEEE 128-bit floating point.  */
-  if (FLOAT128_VECTOR_P (mode))
+  /* Use ROTATE instead of VEC_SELECT on IEEE 128-bit floating point, and
+     128-bit integers if they are allowed in VSX registers.  */
+  if (FLOAT128_VECTOR_P (mode) || mode == TImode)
     return gen_rtx_ROTATE (mode, source, GEN_INT (64));
   else
     {
index 2b92d451a548476d2f6a3c7119b8ef3de47748a3..b95da6f1d0cad3e4f3647b80d89f133dbddb9580 100644 (file)
 
 ;; Iterator for the 2 64-bit vector types + 128-bit types that are loaded with
 ;; lxvd2x to properly handle swapping words on little endian
-(define_mode_iterator VSX_LE [V2DF
-                             V2DI
-                             V1TI
-                             (TI       "VECTOR_MEM_VSX_P (TImode)")])
+(define_mode_iterator VSX_LE [V2DF V2DI V1TI])
 
 ;; Mode iterator to handle swapping words on little endian for the 128-bit
 ;; types that goes in a single vector register.
 (define_mode_iterator VSX_LE_128 [(KF   "FLOAT128_VECTOR_P (KFmode)")
-                                 (TF   "FLOAT128_VECTOR_P (TFmode)")])
+                                 (TF   "FLOAT128_VECTOR_P (TFmode)")
+                                 (TI   "TARGET_VSX_TIMODE")])
 
 ;; Iterator for the 2 32-bit vector types
 (define_mode_iterator VSX_W [V4SF V4SI])
                                        : operands[0];
 })
 
+;; Peephole to catch memory to memory transfers for TImode if TImode landed in
+;; VSX registers on a little endian system.  The vector types and IEEE 128-bit
+;; floating point are handled by the more generic swap elimination pass.
+(define_peephole2
+  [(set (match_operand:TI 0 "vsx_register_operand" "")
+       (rotate:TI (match_operand:TI 1 "vsx_register_operand" "")
+                  (const_int 64)))
+   (set (match_operand:TI 2 "vsx_register_operand" "")
+       (rotate:TI (match_dup 0)
+                  (const_int 64)))]
+  "!BYTES_BIG_ENDIAN && TARGET_VSX && TARGET_VSX_TIMODE
+   && (rtx_equal_p (operands[0], operands[2])
+       || peep2_reg_dead_p (2, operands[0]))"
+   [(set (match_dup 2) (match_dup 1))])
+
 ;; The post-reload split requires that we re-permute the source
 ;; register in case it is still live.
 (define_split
index 63d8b44381936a7551d9d19cbcfb4ff2d4e9c284..cc8779865c5e1057c3083cf114435cc018293251 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-15  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/68805
+       * gcc.target/powerpc/pr68805.c: New test.
+
 2015-12-16  Martin Sebor  <msebor@redhat.com>
 
        PR objc++/68932
diff --git a/gcc/testsuite/gcc.target/powerpc/pr68805.c b/gcc/testsuite/gcc.target/powerpc/pr68805.c
new file mode 100644 (file)
index 0000000..f4454a9
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile { target powerpc64le-*-* } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-options "-O2 -mvsx-timode -mcpu=power8" } */
+
+typedef struct bar {
+  void *a;
+  void *b;
+} TYPE;
+
+void foo (TYPE *p, TYPE *q) { *p = *q; }
+
+/* { dg-final { scan-assembler     "lxvd2x"   } } */
+/* { dg-final { scan-assembler     "stxvd2x"  } } */
+/* { dg-final { scan-assembler-not "xxpermdi" } } */
+