This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/24160] [4.1 Regression] ICE with -O1 -ftree-vectorize -msse
- From: "uros at kss-loka dot si" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 4 Oct 2005 12:45:36 -0000
- Subject: [Bug rtl-optimization/24160] [4.1 Regression] ICE with -O1 -ftree-vectorize -msse
- References: <bug-24160-8902@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #9 from uros at kss-loka dot si 2005-10-04 12:45 -------
The problem here is that we are out of GENERAL_REGS at the point of. This can
be seen in code, produced with -fomit-frame-pointer:
...
.L4:
movl 1052(%esp), %edx
movl %ebp, (%edx,%ecx,4) <<<<< load to %ebp
incl %ecx
cmpl %ecx, %eax
ja .L4
movl $10, %edx
movl %edx, %esi
subl %ecx, %esi
cmpl $10, %eax
je .L13
subl %eax, %edx
movl %edx, 4(%esp)
movl %edx, %ebx
shrl $2, %ebx
movl %ebx, %edi
sall $2, %edi
je .L8
.L9:
movl %ebp, (%esp) <<< here %ebp is spilled to stack
movss (%esp), %xmm1
shufps $0, %xmm1, %xmm1
movaps %xmm1, %xmm0
movl 1052(%esp), %edx
...
It looks that register allocator is running out of registers. It allocates the
last available reg, %ebp, that is usually used as a frame pointer. x86_64
target doesn't have this problem, as it has more registers (and is
-fomit-frame-pointer by default).
This bug is unfortunatelly not fixable in the i386 backend without fixing
current register allocator.
BTW: Peerhaps a tree expert could look into an optimized tree dump, maybe
something can be done there.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24160