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

           Summary: internal compiler error in memory_address_addr_space,
                    at explow.c:504
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: dnovi...@gcc.gnu.org


Compiling the test case at the end with -O2 causes:


$ ./cc1plus -O2 -quiet a.cc
a.cc: In function 'void E(uint64*, uint64*, const void*, int64)':
a.cc:18:15: internal compiler error: in memory_address_addr_space, at
explow.c:504
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

The ICE occurs during RTL expansion for the statement:


$G =$5 = 0x7ffff7124410
# VUSE <.MEM_58(D)>
D.2207_9 = *lo_8(D);

Both sides are uint64, but in expand_expr_real_1, when we call
memory_address_addr_space on *lo_8, we get:


#3  0x00000000010e6c3d in expand_expr_real_1 (exp=0x7ffff7ff88c0, 
    target=0x7ffff6f0fcc0, tmode=DImode, modifier=EXPAND_NORMAL, 
    alt_rtl=0x7fffffffd7f8) at /home/dnovillo/gcc/src/gcc/expr.c:8735
8735            op0 = memory_address_addr_space (address_mode, op0, as);
(gdb) ptu exp
$NODE =$10 = 0x7ffff7ff88c0
*lo_8(D);

(gdb) p address_mode
$11 = DImode
(gdb) pr op0
(reg/v/f:DI 8 st [ lo ])
void(gdb) down
#2  0x00000000010720f0 in memory_address_addr_space (mode=DImode, 
    x=0x7ffff6f16100, as=0 '\000') at /home/dnovillo/gcc/src/gcc/explow.c:504
504       gcc_assert (memory_address_addr_space_p (mode, x, as));
(gdb) pr x
(reg:DI 12 st(4))

and X fails the memory_address_addr_space_p() test.

Test case:
=========================================================================
typedef unsigned long long uint64;
typedef long long int64;
typedef unsigned char uint8;
static const int PT = 8 * 1024;
typedef unsigned int uint32;

static inline uint64 L(const uint8 *p) {
    return 1;
}

void E(uint64 *, uint64 *, const void *, int64) __attribute__ ((__target__
("sse4")));

void
E (uint64 * lo, uint64 * hi, const void *bytes, int64 length)
{
  const uint8 *p = static_cast < const uint8 * >(bytes);
  const uint8 *e = p + length;
  uint32 l = *lo;
  uint64 l64 = l;

  if ((e - p) >= PT)
    {
      while ((e - p) >= 128)
        {
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
          l64 = __builtin_ia32_crc32di (l64, L (p));
        }
    }

  while ((e - p) >= 16)
    {
      l64 = __builtin_ia32_crc32di (l64, L (p));
      l64 = __builtin_ia32_crc32di (l64, L (p));
    }
  l = l64;
  *lo = l;
}

Reply via email to