This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
optimization/5738: GCSE missed optimization
- From: dann at godzilla dot ics dot uci dot edu
- To: gcc-gnats at gcc dot gnu dot org
- Date: 20 Feb 2002 21:52:16 -0000
- Subject: optimization/5738: GCSE missed optimization
- Reply-to: dann at godzilla dot ics dot uci dot edu
>Number: 5738
>Category: optimization
>Synopsis: GCSE missed optimization
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: pessimizes-code
>Submitter-Id: net
>Arrival-Date: Wed Feb 20 13:56:01 PST 2002
>Closed-Date:
>Last-Modified:
>Originator: dann@godzilla.ics.uci.edu
>Release: CVS
>Organization:
>Environment:
sparc-sun-solaris2.8
>Description:
GCSE not working
The following code:
struct foo
{
unsigned short *p;
};
void
func (struct foo *s, unsigned int *coord, _Bool delta)
{
unsigned short change;
if (delta) {
change = *((s)->p++);
*coord += change;
} else {
change = *((s)->p++);
*coord += change;
*coord += *((s)->p++) << 8;
}
}
generates when compiled with gcc from CVS on SPARC (with -O2)
func:
!#PROLOGUE# 0
!#PROLOGUE# 1
andcc %o2, 0xff, %g0
mov %o0, %o5
be .LL2
mov %o1, %o4
ld [%o0], %o0
ld [%o1], %o2
lduh [%o0], %o3
sll %o3, 16, %o1
srl %o1, 16, %o1
add %o2, %o1, %o2
add %o0, 2, %o0
st %o0, [%o5]
b .LL1
st %o2, [%o4]
.LL2:
ld [%o0], %o0
lduh [%o0], %o3
ld [%o1], %o2
add %o0, 2, %o0
lduh [%o0], %o1
add %o2, %o3, %o2
sll %o1, 8, %o1
add %o2, %o1, %o2
add %o0, 2, %o0
st %o2, [%o4]
st %o0, [%o5]
.LL1:
retl
nop
GCSE should be able to realize that
The sequence:
change = *((s)->p++);
*coord += change;
occurs on both branches of the conditional and move it before.
>How-To-Repeat:
Compile the code above with -O2 and look at the assembly,
one branch of the conditional should be empty.
>Fix:
n/a
>Release-Note:
>Audit-Trail:
>Unformatted: