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

--- Comment #8 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-04-21 
12:39:10 UTC ---
(In reply to comment #7)
> IVOPTs generates
> 
>   ivtmp.25_24 = (long unsigned int) &array;
>   array.26_26 = (long unsigned int) &array;
>   D.2769_27 = array.26_26 + 0x0fffffffffffffff0;
> 
> <bb 3>:
>   # ans_21 = PHI <ans_16(4), 0(2)>
>   # ivtmp.25_20 = PHI <ivtmp.25_19(4), ivtmp.25_24(2)>
>   D.2741_10 = ans_21 * 2;
>   D.2767_25 = (void *) ivtmp.25_20;

Actually D.2767_25 is already the problem as it can point before &array.

>   D.2737_15 = MEM[(int *)D.2767_25 + 12B];

Here we assume that the memory reference happens only to array[3] or beyond,
as D.2767_25 is assumed to at least point to &array[0] but never to &array[-1].

Other passes could derive similar info for D.2767_25 given that points-to
analysis computes it points somewhere into array.

Reply via email to