https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108049
Bug ID: 108049 Summary: s390: Compiler adds extra zero extend after xoring 2 zero extended values Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: jens.seifert at de dot ibm.com Target Milestone: --- Same issue for PPC: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107949 extern unsigned char magic1[256]; unsigned int hash(const unsigned char inp[4]) { const unsigned long long INIT = 0x1ULL; unsigned long long h1 = INIT; h1 = magic1[((unsigned long long)inp[0]) ^ h1]; h1 = magic1[((unsigned long long)inp[1]) ^ h1]; h1 = magic1[((unsigned long long)inp[2]) ^ h1]; h1 = magic1[((unsigned long long)inp[3]) ^ h1]; return h1; } hash(unsigned char const*): llgc %r4,1(%r2) <= zero extends to 64-bit lgrl %r1,.LC0 llgc %r3,0(%r2) <= zero extends to 64-bit xilf %r3,1 llgc %r3,0(%r3,%r1) xr %r3,%r4 <= should be 64-bit xor llgc %r4,2(%r2) <= zero extends to 64-bit llgcr %r3,%r3 <= unnecessary llgc %r2,3(%r2) llgc %r3,0(%r3,%r1) xr %r3,%r4 <= should be 64-bit xor llgcr %r3,%r3 <= unnecessary llgc %r3,0(%r3,%r1) <= zero extends to 64-bit xrk %r2,%r3,%r2 <= should be 64-bit xor llgcr %r2,%r2 <= unnecessary llgc %r2,0(%r2,%r1) br %r14 Smaller sample: unsigned long long tiny2(const unsigned char *inp) { unsigned long long a = inp[0]; unsigned long long b = inp[1]; return a ^ b; } tiny2(unsigned char const*): llgc %r1,0(%r2) llgc %r2,1(%r2) xrk %r2,%r1,%r2 llgcr %r2,%r2 br %r14