[Bug target/54673] New: [SH] Unnecessary sign extension of logical operation results
olegendo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Sep 22 23:12:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54673
Bug #: 54673
Summary: [SH] Unnecessary sign extension of logical operation
results
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: olegendo@gcc.gnu.org
Target: sh*-*-*
Logical operations already sign extended values as inputs cause additional sign
extensions of intermediate values. For example:
int test00 (char* a, short* b, int c)
{
return a[0] ^ a[1] ^ c;
}
becomes:
mov.b @(1,r4),r0
mov.b @r4,r1
xor r1,r0
exts.b r0,r0
rts
xor r6,r0
int test01 (char* a, short* b, int c)
{
return a[0] | a[1] | c;
}
becomes:
mov.b @(1,r4),r0
mov.b @r4,r1
or r1,r0
exts.b r0,r0
rts
or r6,r0
int test02 (char* a, short* b, int c)
{
return a[0] & a[1] & c;
}
becomes:
mov.b @(1,r4),r0
mov.b @r4,r1
and r1,r0
exts.b r0,r0
rts
and r6,r0
This seems to be caused by the fact that patterns for xorsi3, iorsi3 and andsi3
allow matching 'subreg' in their operands. In the combine pass it can be
observed that it tries combinations such as:
Failed to match this instruction:
(set (reg:SI 173 [ D.1867 ])
(sign_extend:SI (subreg:QI (xor:SI (subreg:SI (mem:QI (plus:SI (reg/v/f:SI
166 [ a ])
(const_int 1 [0x1])) [0 MEM[(char *)a_2(D) + 1B]+0
S1 A8]) 0)
(subreg:SI (reg:QI 171 [ *a_2(D) ]) 0)) 3)))
which doesn't go anywhere.
I have quickly tried out prohibiting subreg in the operands of the
*xorsi3_compact insn and the sign extension (as well as the subreg orgy in
combine) disappeared. However, I guess that not matching 'subreg' in the
logical patterns will cause problems with DImode logical ops, since they are
split into SImode ops working on subregs.
More information about the Gcc-bugs
mailing list