diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4fb5057eb6a..4197c182ed4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-25 Richard Henderson + + PR target/51968 + * config/arm/arm.c (neon_split_vcombine): Emit deleted note + to effect no-op split. + 2012-01-24 Aldy Hernandez Patrick Marlier diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 8f1412a8a3c..4a94145d4aa 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -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 index 00000000000..f0506c267fe --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr51968.c @@ -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); + } +}