re PR target/51968 (gcc trunk (ARM) ICEs in final_scan_insn in final.c:2716, with "could not split insn" error msg)

PR target/51968
        * config/arm/arm.c (neon_split_vcombine): Emit deleted note
        to effect no-op split.

From-SVN: r183480
This commit is contained in:
Richard Henderson 2012-01-24 09:33:41 -08:00 committed by Richard Henderson
parent d4157849c9
commit ed6cf3188b
3 changed files with 43 additions and 1 deletions

View 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>

View 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);

View File

@ -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);
}
}