[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#162919: gcc-3.2: loop unroll bug with -march=k6-3



Package: gcc-3.2
Version: 1:3.2.1-0pre3
Severity: important
Tags: upstream



-- System Information:
Debian Release: testing/unstable
Architecture: i386
Kernel: Linux rusalka 2.4.20-pre4 #1 SMP Tue Sep 3 22:12:35 MDT 2002 i686
Locale: LANG=C, LC_CTYPE=C

Versions of packages gcc-3.2 depends on:
ii  binutils                   2.13.90.0.4-1 The GNU assembler, linker and bina
ii  cpp-3.2                    1:3.2.1-0pre3 The GNU C preprocessor.
ii  gcc-3.2-base               1:3.2.1-0pre3 The GNU Compiler Collection (base 
ii  libc6                      2.2.5-14.3    GNU C Library: Shared libraries an
ii  libgcc1                    1:3.2.1-0pre3 GCC support library.

-- no debconf information

the following simple code produces a segfault when compiled using gcc
3.2 using the folloing command line:

gcc -march=k6-3 -O3 -ffast-math -funroll-loops -fomit-frame-pointer
-fexpensive-optimizations -fstrict-aliasing -pipe -Wall -Werror
-fno-common -o foo foo.c

---8<---

void *array[4];

int
main ()
{
	int i;

	for (i = 0; i < sizeof (array) / sizeof (array[0]); i++)
		array[i] = 0;
	return 0;
}

---8<---

The following is the resulting asm (-S instead of -o foo). Lines
begining with "*" are annotations. Non-useful lines are omitted.

	movl	$array+4, %eax
	movl	$array, %edx
	cmpl	$array+13, %eax
	movl	$array+12, %ecx
	jb	.L10
	.loc 1 9 0
	movl	$0, (%edx)
	.loc 1 8 0
	addl	$4, %edx
	cmpl	%ecx, %edx
	ja	.L9
.L10:
	subl	$array-1, %ecx
	shrl	$4, %ecx

*	            ^^^   set to 0

	.p2align 5,,7
.L28:
	.loc 1 9 0
	movl	$0, (%edx)
	movl	$0, 4(%edx)
	movl	$0, 8(%edx)
	movl	$0, 12(%edx)
	.loc 1 8 0
	addl	$16, %edx
	loop	.L28

*	^^^ %ecx is 0 for the first pass and thus this loop becomes
*	effectively infinite causing %edx to overflow the array.

.L9:
	.loc 1 10 0
	ret
[snip]
	.string "GNU C 3.2.1 20020924 (Debian prerelease)"




Reply to: