http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56510
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-03-03
12:40:09 UTC ---
Reduced testcase:
struct S { unsigned long s1; void **s2[0]; };
void **a, **b, **c, **d, **e, **f;
static void **
baz (long x, long y)
{
void **s = f;
*f = (void **) (y << 8 | (x & 0xff));
f += y + 1;
return s;
}
void bar (void);
void
foo (void)
{
void **g = b[4];
a = b[2];
b = b[1];
g[2] = e;
void **h = ((void ***************)
a)[1][1][1][1][1][1][1][1][1][1][1][1][1][66];
void **i = ((struct S *) h)->s2[4];
d = baz (4, 3);
d[1] = b;
d[2] = a;
d[3] = bar;
b = d;
g[1] = i[2];
a = g;
((void (*) (void)) (i[1])) ();
}
I'd say the problem is that during expansion we turn:
_10 = MEM[(void * * * * * * * * * * * * * * *)a.1_4 + 8B];
_11 = MEM[(void * * * * * * * * * * * * * *)_10 + 8B];
_12 = MEM[(void * * * * * * * * * * * * *)_11 + 8B];
_13 = MEM[(void * * * * * * * * * * * *)_12 + 8B];
_14 = MEM[(void * * * * * * * * * * *)_13 + 8B];
_15 = MEM[(void * * * * * * * * * *)_14 + 8B];
_16 = MEM[(void * * * * * * * * *)_15 + 8B];
_17 = MEM[(void * * * * * * * *)_16 + 8B];
_18 = MEM[(void * * * * * * *)_17 + 8B];
_19 = MEM[(void * * * * * *)_18 + 8B];
_20 = MEM[(void * * * * *)_19 + 8B];
_21 = MEM[(void * * * *)_20 + 8B];
_22 = MEM[(void * * *)_21 + 8B];
h_23 = MEM[(void * *)_22 + 528B];
# DEBUG h => h_23
i_24 = MEM[(struct S *)h_23].s2[4];
into:
(debug_insn 14 13 15 2 (var_location:DI h (mem/f:DI (plus:DI (mem/f:DI (plus:DI
(mem/f:DI (plus:DI (mem/f:DI (plus:DI (mem/f:DI (plus:DI (mem/f:DI
(plus:DI (mem/f:DI (plus:DI (mem/f:DI (plus:DI (mem/f:DI (plus:DI (mem/f:DI
(plus:DI (mem/f:DI (plus:DI (mem/f:DI (plus:DI (mem/f:DI (plus:DI (mem/
f:DI (plus:DI (reg/f:DI 61 [ a.1 ])
(const_int 8 [0x8])) [0 MEM[(vo
id * * * * * * * * * * * * * * *)a.1_4 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * *
* * * * * * * * * * *)_10 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * * * * * *
* * * * * *)_11 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * * * * * * * * * *
*)_12 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * * * * * * * * * *)_13 + 8
B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * * * * * * * * *)_14 + 8B]+0 S8 A6
4])
(const_int
8 [0x8])) [0 MEM[(void * * * * * * * * *)_15 + 8B]+0 S8 A64])
(const_int 8
[0x8])) [0 MEM[(void * * * * * * * *)_16 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0
MEM[(void * * * * * * *)_17 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void *
* * * * *)_18 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * * *
*)_19 + 8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * * *)_20 +
8B]+0 S8 A64])
(const_int 8 [0x8])) [0 MEM[(void * * *)_21 + 8B]+0 S8
A64])
(const_int 528 [0x210])) [0 MEM[(void * *)_22 + 528B]+0 S8 A64]))
pr56510-2.i:21 -1
(nil))
which is simply too large for any reasonable cselib handling, it would better
be split using debug temporaries.
OT, are you sure the testcase doesn't violate aliasing just about everywhere?