[Bug target/61298] New: redundant compare instructions for powerpc64
carrot at google dot com
gcc-bugzilla@gcc.gnu.org
Fri May 23 20:24:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61298
Bug ID: 61298
Summary: redundant compare instructions for powerpc64
Product: gcc
Version: 4.10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: carrot at google dot com
Target: powerpc64le
Compile the following source code with options -m64 -mvsx -mcpu=power8 -O2
typedef unsigned char Bool;
typedef unsigned char UChar;
typedef unsigned int UInt32;
typedef unsigned short UInt16;
Bool compare( UInt32 i1, UInt32 i2, UChar* p)
{
UChar c1, c2;
c1 = p[i1]; c2 = p[i2];
if (c1 != c2) return (c1 > c2);
i1++; i2++;
c1 = p[i1]; c2 = p[i2];
if (c1 != c2) return (c1 > c2);
i1++; i2++;
c1 = p[i1]; c2 = p[i2];
if (c1 != c2) return (c1 > c2);
return ((Bool)0);
}
Trunk gcc generates:
compare:
lbzx 9,5,3
lbzx 10,5,4
cmpw 7,9,10 // A
beq 7,.L8
.L6:
cmplw 7,9,10 // B
mfcr 3,1
rlwinm 3,3,30,1
blr
.p2align 4,,15
.L8:
addi 9,3,1
addi 10,4,1
rldicl 9,9,0,32
rldicl 10,10,0,32
lbzx 9,5,9
lbzx 10,5,10
cmpw 7,9,10 // C
bne 7,.L6
addi 3,3,2
addi 4,4,2
rldicl 3,3,0,32
rldicl 4,4,0,32
lbzx 9,5,3
lbzx 3,5,4
cmpw 7,9,3 // X
beq 7,.L5
cmplw 7,9,3 // Y
mfcr 3,1
rlwinm 3,3,30,1
blr
.p2align 4,,15
.L5:
li 3,0
blr
Instruction X is used to compare equal, so it can be replaced by cmplw, same as
instruction Y, then instruction Y can be removed.
Similarly instructions AC can be replaced by cmplw, then instruction B can be
removed.
GCC 4.9 generates similar code.
GCC 4.8 can generate optimal code without the redundant compare instructions.
More information about the Gcc-bugs
mailing list