[Bug c++/52558] write introduction incorrect wrt the C++11 memory model
amacleod at redhat dot com
gcc-bugzilla@gcc.gnu.org
Mon Mar 12 15:51:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52558
--- Comment #8 from Andrew Macleod <amacleod at redhat dot com> 2012-03-12 15:50:13 UTC ---
We can still perform store motion out of a loop, we just can't put the store on
a path which is executed if the loop isn't executed.
In this case, we actually made the code *slower*. Before LIM, there was a load
of g1, a compare and return.
movl g_1(%rip), %edx
xorl %eax, %eax
testl %edx, %edx
jne .L1
.L4:
addl $1, %eax
movl $0, g_2(%rip)
cmpl $4, %eax
jne .L4
.L1:
rep
ret
LIM makes it have a load of g_1, a load of g_2 and a store to g_2 before
returning.
.cfi_startproc
movl g_1(%rip), %edx
movl g_2(%rip), %eax
testl %edx, %edx
jne .L2
movl $0, g_2(%rip)
ret
.L2:
movl %eax, g_2(%rip)
xorl %eax, %eax
ret
-O3 corrects this mistake and returns it to the more optimal results.
I would argue this testcase shows LIM actually making the code worse in this
case as well.
More information about the Gcc-bugs
mailing list