This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Buggy peephole prevents bootstrap (i386)
- To: gcc-bugs at gcc dot gnu dot org
- Subject: Buggy peephole prevents bootstrap (i386)
- From: "Zack Weinberg" <zackw at stanford dot edu>
- Date: Fri, 13 Oct 2000 18:52:10 -0700
- Cc: Jan Hubicka <jh at suse dot cz>
This function is based on emit-rtl.c:gen_rtx_CONST_INT.
int foo (int x)
{
return (x >= -64 && x <= 64);
}
Compiled with current cvs at -O2 -fno-peephole2 -fomit-frame-pointer,
we get:
foo:
movl 4(%esp), %edx
movl $0, %eax
addl $64, %edx
cmpl $128, %edx
setbe %al
ret
Without -fno-peephole2, we get instead:
foo:
movl 4(%esp), %edx
xorl %eax, %eax
addl $64, %edx
* addl $-128, %edx
setbe %al
ret
This transformation was done to save space - the add instruction is
three bytes shorter than the corresponding compare. However, add
doesn't set the condition codes the same way cmp and sub do. It
appears (from staring at the confusing Intel reference manual) that
add's condition codes are usable only with the signed conditional
instructions - setle in this case instead of setbe. But we can't use
setle for the clamp operation being done here - it will get the case
x < -64 wrong.
The bad peepholes were introduced by this patch:
Thu Oct 12 16:02:31 MET DST 2000 Jan Hubicka <jh@suse.cz>
* i386.md (adddi3, subdi3 splitters): Update for new pattern.
(addsi3_cc, addqi3_cc, subsi3_cc): Remove
(addsi3_carry): Canonicalize.
(addqi_5): Remove '*'.
(sbb pattern): Canonicalize.
* i386.md (cmp to inc/add peep2): New.
At the moment, I believe this transformation is always wrong. I could
be mistaken.
zw