This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: target/9164: Improper code generation on Alpha processors.
- From: Falk Hueffner <falk dot hueffner at student dot uni-tuebingen dot de>
- To: rf358197 at ohiou dot edu, gcc-gnats at gcc dot gnu dot org, gcc-prs at gcc dot gnu dot org, gcc-bugs at gcc dot gnu dot org, nobody at gcc dot gnu dot org
- Date: 07 Jan 2003 08:44:56 +0100
- Subject: Re: target/9164: Improper code generation on Alpha processors.
> There is a problem with the compiler on the Alpha platform when
> doing comparisons between variables of different types long and int.
> This bug was discovered through mozilla's bug database and I am not
> sure if anyone from the GCC camp knows about it?
> #define INT_MAX1 (((long)1 << (30))-1)
> #define INT_MAX2 (1073741824-1)
>
> int main()
> {
> int i = 1073741825;
> long j = 1073741823;
>
> printf ("%ld %ld\n", INT_MAX1, INT_MAX2);
> printf ("%x %x\n", i, j);
> printf ("%x %x\n", (unsigned int)((i)+j), 2 * j);
>
> if ((unsigned int)((i)+j) <= 2 * INT_MAX1)
> printf ("doh1\n");
> if ((unsigned int)((i)+j) <= 2 * INT_MAX2)
> printf ("doh2\n");
>
> exit(1);
> }
Hmm, weird one. Here's a slightly smaller test case:
int main(void) {
long j = 1073741823L;
if ((unsigned int)(1073741825L + j) < 0L)
puts("bad");
else
puts("good");
}
Looks like the intermediate result gets 32-bit sign extended
erraneously.
--
Falk