This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/25489] New: Suboptimal code generated for coparisons on Sparc
- From: "dann at godzilla dot ics dot uci dot edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 18 Dec 2005 22:36:46 -0000
- Subject: [Bug rtl-optimization/25489] New: Suboptimal code generated for coparisons on Sparc
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
This code:
typedef struct {
int protected_mode;
int x;
} TScreen;
extern void ClearRight (TScreen *screen, int n);
extern void ClearLeft(TScreen * screen);
extern void ClearLine(TScreen * screen);
void
do_erase_line(TScreen * screen, int param, int mode)
{
int saved_mode = screen->protected_mode;
if (saved_mode == 1
&& saved_mode != mode)
screen->protected_mode = 0;
switch (param) {
case -1: /* DEFAULT */
case 0:
ClearRight(screen, -1);
break;
case 1:
ClearLeft(screen);
break;
case 2:
ClearLine(screen);
break;
}
screen->protected_mode = saved_mode;
}
is compiled to: (when using -O2 -mcpu=ultrasparc using gcc-4.0.2 and gcc-4.2)
do_erase_line:
save %sp, -112, %sp
ld [%i0], %l0
xor %l0, 1, %g1 <- from here
xor %l0, %i2, %i2
subcc %g0, %g1, %g0
subx %g0, -1, %g2
subcc %g0, %i2, %g0
addx %g0, 0, %g1
andcc %g2, %g1, %g0 <- to here
bne,a,pt %icc, .LL2
st %g0, [%i0]
.LL2:
cmp %i1, 1
be,pn %icc, .LL6
nop
[snip]
The code generated for the "if" can be better implemented
as (pseudoassembly):
xor save_mode, 1, tmp1
xnor save_mode, mode, tmp2
orcc tmp1, tmp2
I don't know if this is a Sparc specific problem, or a general problem.
--
Summary: Suboptimal code generated for coparisons on Sparc
Product: gcc
Version: 4.0.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dann at godzilla dot ics dot uci dot edu
GCC target triplet: sparc-sun-solaris2.8
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25489