https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105338
Bug ID: 105338
Summary: Regression: jump or cmove generated for pattern (x ?
CST : 0)
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: denis.campredon at gmail dot com
Target Milestone: ---
int f(int i) {
return i ? 5 : 0;
}
int g(int i) {
return i ? -2 : 0;
}
int h(int b) {
return !!b * -2;
}
int i(int b) {
return !!b * 5;
}
int j(int b) {
if (!b) return 0;
return -2;
}
-------------
With -02 gcc 11.2 the five functions above output branchless code like:
f(int):
neg edi
sbb eax, eax
and eax, 5
ret
g(int):
neg edi
sbb eax, eax
and eax, -2
ret
...
--------------
Whereas -02 gcc 12 now outputs a cmov or jump depending of sign of the
constant:
f(int):
mov eax, edi
test edi, edi
mov edx, 5
cmovne eax, edx
ret
g(int):
mov eax, edi
test edi, edi
jne .L11
ret
.L11:
mov eax, -2
ret
h(int):
mov eax, edi
test edi, edi
jne .L17
ret
.L17:
mov eax, -2
ret
i(int):
mov eax, edi
test edi, edi
mov edx, 5
cmovne eax, edx
ret
j(int):
mov eax, edi
test edi, edi
mov edx, -2
cmovne eax, edx
ret
---------------------------
Alternatively, with the following code
int k(int b) {
bool b2 = b;
return b2 * 5;
}
----------------
Both gcc 12 and 11.2 are outputing
k(int):
xor eax, eax
test edi, edi
setne al
lea eax, [rax+rax*4]
ret