[Bug rtl-optimization/58517] icvt (after combine) puts ccreg clobbering insn between ccset insn and ccreg use
olegendo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Oct 5 22:17:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58517
Oleg Endo <olegendo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |steven at gcc dot gnu.org
--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> ---
The problematic transformation happens in ifcvt.c (noce_try_cmove_arith).
I've only briefly looked over that code and can think of the following options
how to fix the issue:
1) Check whether insn_a and insn_b modify the src reg (ccreg) of the
conditional branch. If they do, don't do the transformation.
On SH, the resulting code would be the same as not specifying -mpretend-cmove:
cmp/ge r5,r4
mov r6,r0
bf/s .L6
sub r4,r0
rts
nop
.L6:
sett
mov r5,r0
rts
subc r4,r0
2) Check whether insn_a and insn_b modify the src reg (ccreg) of the
conditional branch. If they do, try to move the insn that sets the ccreg
before the conditional branch, _after_ the emitted insn_a and insn_b and right
before the conditional move.
On SH, the resulting code would look something like this:
sett
mov r5,r0
sub r4,r6
subc r4,r0
cmp/ge r5,r4
bf 0f
mov r6,r0
0:
rts
nop
Steven, since you're RTL optimizers reviewer, could you please provide some
feedback regarding the matter?
More information about the Gcc-bugs
mailing list