On Wed, Jan 7, 2009 at 1:46 AM, DJ Delorie <d...@redhat.com> wrote:
>
> I'm looking a failure for m32c-elf (-mcpu=m32c) in
> gcc.c-torture/execute/20000412-6.c.
>
> I've narrowed it down to a transformation done in 107t.ivopts.
>
> In 104t.cunroll: (tmp_9 and tmp_16 are 24-bit pointer values):
>
>  tmp_9 = tmp_16 + 2;
>  if (bufend_6(D) > tmp_9)
>
> but in 107t.ivopts:
>
>  tmp_9 = tmp_16 + 2;
>  D.1229_1 = (unsigned int) tmp_9;
>  tmp_13 = (short unsigned int *) D.1229_1;
>  if (bufend_6(D) > tmp_13)
>
> The problem is that tmp_9 is a 24-bit value, and casting it to
> unsigned int (16 bits) truncates off eight of the bits.  Why are we
> casting pointers to integer values at all?  Is there any way to stop
> ivopts from performing this truncation?

As I repeatedly said having sizetype of a different precision than
pointer types will cause all sorts of problems ;)  The middle-end
generally assumes it can cast between sizetype and pointers
arbitrarily.

In the above case, what type is tmp_9, what type is tmp_16?

Richard.

Reply via email to