[Bug target/58314] SH4 error: 'asm' operand requires impossible reload

olegendo at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Nov 22 20:03:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58314

--- Comment #12 from Oleg Endo <olegendo at gcc dot gnu.org> ---
(In reply to Oleg Endo from comment #10)
> 
> FAIL: gcc.dg/torture/vshuf-v16hi.c  -O2  (test for excess errors)
> Excess errors:
> /usr/local/sh-elf/bin/ld: internal error: merge of architecture 'sh3e' with
> architecture 'sh2a-nofpu' produced unknown architecture
> /usr/local/sh-elf/bin/ld: /tmp/ccRPtSqs.o: uses instructions which are
> incompatible with instructions used in previous modules
> /usr/local/sh-elf/bin/ld: failed to merge target specific data of file
> /tmp/ccRPtSqs.o

Below is the reduced test case that fails when compiled with -O2 -m4 -mb
when the r,r constraints are allowed in the "*movhi" pattern and the
"*mov<mode>_reg_reg" pattern is disabled.  So the comment above the
"*mov<mode>_reg_reg" pattern is still correct.

typedef unsigned short V __attribute__((vector_size(32)));
typedef V VI;

extern void abort (void);
V a, b, c, d;

 __attribute__((noinline, noclone)) void
test_14 (void)
{
  VI mask = { 25, 5, 17, 1, 9, 15, 21, 7, 28, 2, 18, 13, 30, 14, 10, 4 };
  int i;
  c = __builtin_shuffle (a, mask);
  d = __builtin_shuffle (a, b, mask);
  __asm ("" : : "r" (&c), "r" (&d) : "memory");

  for (i = 0; i < 16; ++i)
    if (c[i] != a[mask[i] & (16 - 1)])
      abort ();
    else if ((mask[i] & 16))
    {
      if (d[i] != b[mask[i] & (16 - 1)])
        abort ();
    }
    else if (d[i] != a[mask[i] & (16 - 1)])
      abort ();
}



More information about the Gcc-bugs mailing list