OSDN Git Service

PR target/51968
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Jan 2012 17:33:41 +0000 (17:33 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Jan 2012 17:33:41 +0000 (17:33 +0000)
        * config/arm/arm.c (neon_split_vcombine): Emit deleted note
        to effect no-op split.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183480 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/gcc.target/arm/pr51968.c [new file with mode: 0644]

index 4fb5057..4197c18 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-25  Richard Henderson  <rth@redhat.com>
+
+       PR target/51968
+       * config/arm/arm.c (neon_split_vcombine): Emit deleted note
+       to effect no-op split.
+
 2012-01-24  Aldy Hernandez  <aldyh@redhat.com>
            Patrick Marlier  <patrick.marlier@gmail.com>
 
index 8f1412a..4a94145 100644 (file)
@@ -20928,7 +20928,11 @@ neon_split_vcombine (rtx operands[3])
   rtx destlo, desthi;
 
   if (src1 == dest && src2 == dest + halfregs)
-    return;
+    {
+      /* No-op move.  Can't split to nothing; emit something.  */
+      emit_note (NOTE_INSN_DELETED);
+      return;
+    }
 
   /* Preserve register attributes for variable tracking.  */
   destlo = gen_rtx_REG_offset (operands[0], halfmode, dest, 0);
diff --git a/gcc/testsuite/gcc.target/arm/pr51968.c b/gcc/testsuite/gcc.target/arm/pr51968.c
new file mode 100644 (file)
index 0000000..f0506c2
--- /dev/null
@@ -0,0 +1,32 @@
+/* PR target/51968 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=armv7-a -mfloat-abi=softfp -mfpu=neon" } */
+/* { dg-require-effective-target arm_neon_ok } */
+
+typedef __builtin_neon_qi int8x8_t __attribute__ ((__vector_size__ (8)));
+typedef __builtin_neon_uqi uint8x8_t __attribute__ ((__vector_size__ (8)));
+typedef __builtin_neon_qi int8x16_t __attribute__ ((__vector_size__ (16)));
+typedef __builtin_neon_hi int16x8_t __attribute__ ((__vector_size__ (16)));
+typedef __builtin_neon_si int32x4_t __attribute__ ((__vector_size__ (16)));
+struct T { int8x8_t val[2]; };
+int y;
+
+void
+foo (int8x8_t z, int8x8_t x, int16x8_t b, int8x8_t n)
+{
+  if (y)
+    {
+      struct T m;
+      __builtin_neon_vuzpv8qi (&m.val[0], z, x);
+    }
+  for (;;)
+    {
+      int8x16_t g;
+      int8x8_t h, j, k;
+      struct T m;
+      j = __builtin_neon_vqmovunv8hi (b, 1);
+      g = __builtin_neon_vcombinev8qi (j, h);
+      k = __builtin_neon_vget_lowv16qi (g);
+      __builtin_neon_vuzpv8qi (&m.val[0], k, n);
+    }
+}