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?

Reply via email to