[Bug target/56309] -O3 optimizer generates conditional moves instead of compare and branch resulting in almost 2x slower code
steven at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 14 17:10:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56309
--- Comment #12 from Steven Bosscher <steven at gcc dot gnu.org> 2013-02-14 17:10:02 UTC ---
A bit more clear with insn 195 added:
195: flags:CC=cmp(r124:DI,r235:DI)
197: r116:DI={(gtu(flags:CC,0))?r125:DI:r233:DI}
199: {r110:DI=r110:DI+0x1;clobber flags:CC;}
201: flags:CC=cmp(r124:DI,r235:DI)
202: r221:DI={(gtu(flags:CC,0))?r126:DI:r124:DI}
insns 195 and 201 compute the same condition but GCC can't eliminate
the comparison in insns 201 because insn 199 clobbers the flags (i.e.
destroys the result from insn 195).
As for speed, of course I can measure that myself:
--- by-val-O3.s.orig 2013-02-14 18:06:56.000000000 +0100
+++ by-val-O3.s 2013-02-14 18:07:23.000000000 +0100
@@ -357,9 +357,8 @@
shrq $32, %rdi
cmpq %r8, %rdx
cmovbe %r11, %rdi
- addq $1, %rax
- cmpq %r8, %rdx
cmovbe %rdx, %rcx
+ addq $1, %rax
cmpq %rbp, %rax
movq %rcx, -8(%rsi,%rax,8)
jne .L50
unmodified: Took 14.31 seconds total.
modified: Took 13.04 seconds total.
So re. comment #9: it's not the problem but it'd be a small improvement.
More information about the Gcc-bugs
mailing list