[Bug tree-optimization/37810] New: Bad store sinking job
carlo at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Sun Oct 12 15:14:00 GMT 2008
The following code snippet:
void g();
struct A {
int n;
int m;
A& operator++(void)
{
if (__builtin_expect(n == m, false))
g();
else
++n;
return *this;
}
A() : n(0), m(0) { }
friend bool operator!=(A const& a1, A const& a2) { return a1.n != a2.n; }
};
void testfunction(A& iter)
{
A const end;
while (iter != end)
++iter;
}
Results in the following assembly code, using maximum optimization:
movl (%rdi), %eax
jmp .L6
.L4:
cmpl %eax, 4(%rdi) // n == m ?
je .L8 // unlikely jump
addl $1, %eax // ++n
movl %eax, (%rdi) // *** store result to memory ***
.L6:
testl %eax, %eax // iter != end ?
jne .L4 // continue while loop
The storing (back) of %eax to (%rdi) remains inside the inner
loop no matter what I try. It could/should be moved outside
the loop, since nothing inside the L4 loop is accessing (%rdi)
or could possibly be accessing that memory.
This loop has two exits: below the last jne .L4, and the
jump to .L8. The store could be sinked to both exits.
This grows the code, but it seems reasonable to do for
a loop with a very small body, especially if one of the
exits is marked as unlikely :p.
--
Summary: Bad store sinking job
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: carlo at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37810
More information about the Gcc-bugs
mailing list