This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]