https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106701
Bug ID: 106701
Summary: s390: Compiler does not take into account number range
limitation to avoid subtract from immediate
Product: gcc
Version: 11.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: ---
unsigned long long subfic(unsigned long long a)
{
if (a > 15) __builtin_unreachable();
return 15 - a;
}
With clang on x86 subtract from immediate gets translated to xor:
_Z6subficy: # @_Z6subficy
mov rax, rdi
xor rax, 15
ret
Platforms like 390 and x86 which have no subtract from immediate would benefit
from this optimization:
gcc currently generates:
_Z6subficy:
lghi %r1,15
sgr %r1,%r2
lgr %r2,%r1
br %r14