target/9164: Improper code generation on Alpha processors.

Falk Hueffner falk.hueffner@student.uni-tuebingen.de
Mon Jan 13 05:17:00 GMT 2003


> 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



More information about the Gcc-bugs mailing list