This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug pending/27986] New: unnecessary jump to middle of loop on entry
- From: "dean at arctic dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 10 Jun 2006 22:23:53 -0000
- Subject: [Bug pending/27986] New: unnecessary jump to middle of loop on entry
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
in the following code gcc choses the registers in such a way that it causes
itself an extra copy for every loop iteration and has to jump past the copy to
start the loop... it's probably easiest to describe just by looking at the
code:
% cat jmp-over.c
void foo(int *v, int *d, int g)
{
int s = v[1];
int s0;
do {
s0 = s;
s += *d;
++d;
} while (s < g);
v[0] = s0;
}
% gcc -g -O3 -Wall -c -o jmp-over.o jmp-over.c
% objdump -dr jmp-over.o
jmp-over.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <foo>:
0: 8b 4f 04 mov 0x4(%rdi),%ecx
3: eb 02 jmp 7 <foo+0x7>
5: 89 c1 mov %eax,%ecx
7: 89 c8 mov %ecx,%eax
9: 03 06 add (%rsi),%eax
b: 48 83 c6 04 add $0x4,%rsi
f: 39 d0 cmp %edx,%eax
11: 7c f2 jl 5 <foo+0x5>
13: 89 0f mov %ecx,(%rdi)
15: c3 retq
the jump-over is unnecessary...
mov 0x4(%rdi),%ecx
1: mov %ecx,%eax
add (%rsi),%ecx
add $0x4,%rsi
cmp %edx,%ecx
jl 1b
mov %eax,(%rdi)
retq
-dean
% gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../gcc/configure --prefix=/home/odo/gcc
--host=x86_64-linux-gnu --disable-multilib --enable-languages=c,c++
--disable-bootstrap
Thread model: posix
gcc version 4.2.0 20060603 (experimental)
--
Summary: unnecessary jump to middle of loop on entry
Product: gcc
Version: 4.2.0
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: pending
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dean at arctic dot org
GCC build triplet: x86_64-linux-gnu
GCC host triplet: x86_64-linux-gnu
GCC target triplet: x86_64-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27986