> Internally, we use VIEW_CONVERT_EXPR to overlay a TImode
> container on top of a struct. There is no exact C
> equivalent, though a union comes close. I tried that,
> but couldn't replicate the exact set of events that have
> to be present to hit the problem. I send what I tried
> to you separately.
OK, the problem is that TImode is not available as "automatic" mode on the
x86-64 so you'd need to be on IA-64, Alpha or s390x for example to reproduce
in C; moreover you need to be on little-endian with good 32-bit support so
only IA-64 remains. But the use of predicate registers on IA-64 apparently
hides the problem...
It turns out that x86 is a perfect fit if you cut all the types in half.
The attached testcase aborts at -O -fgcse with every 4.x compiler (you
need -fno-split-wide-types for 4.3.x and later though) because of the wrong
REG_EQUAL note. It's even a regression since this doesn't happen with 3.4.x.
--
Eric Botcazou
extern void abort(void);
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef struct
{
uint16_t thread;
uint16_t phase;
} s32;
typedef union
{
uint32_t i;
s32 s;
} u32;
typedef union
{
uint64_t i;
u32 u;
} u64;
static __attribute__((noinline))
void foo(int val)
{
u64 data;
uint32_t thread;
data.u.i = 0x10000L;
thread = data.u.s.thread;
if (val)
abort ();
if (thread)
abort();
}
int main(void)
{
foo (0);
return 0;
}