[Bug target/51708] New: SH Target: SHAD / SHLD constant not CSE-ed
oleg.endo@t-online.de
gcc-bugzilla@gcc.gnu.org
Fri Dec 30 02:14:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51708
Bug #: 51708
Summary: SH Target: SHAD / SHLD constant not CSE-ed
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: oleg.endo@t-online.de
Target: sh*-*-*
If the shift amount is a constant for SHAD / SHLD insns it should be CSE-ed.
This could be done in a similar way as in the movnegt insn.
Example function:
int foo (int* a, int x, int n)
{
int i;
int count;
for (i = 0; i < n; i ++)
count += (*(a + i) << 12);
return count;
}
compiled with -m4 -O3:
cmp/pl r6
bf .L11
shll2 r6
add #-4,r6
shlr2 r6
add #1,r6
.L9:
mov.l @r4+,r1
mov #12,r2 ! load constant in loop
dt r6
shld r2,r1 ! use constant in loop
bf/s .L9
add r1,r0
.L11:
rts
nop
better:
cmp/pl r6
bf .L11
shll2 r6
add #-4,r6
shlr2 r6
add #1,r6
mov #12,r2 ! load constant before loop
.L9:
mov.l @r4+,r1
dt r6
shld r2,r1 ! use constant in loop
bf/s .L9
add r1,r0
.L11:
rts
nop
More information about the Gcc-bugs
mailing list