https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105034
Bug ID: 105034
Summary: [10/11/12 regression]Suboptimal codegen for min/max
with -Os
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: crazylht at gmail dot com
Target Milestone: ---
#define max(a,b) (((a) > (b))? (a) : (b))
#define min(a,b) (((a) < (b))? (a) : (b))
int foo(int x)
{
return max(x,0);
}
int bar(int x)
{
return min(x,0);
}
unsigned int baz(unsigned int x)
{
return min(x,1);
}
gcc10/11/12 -Os -msse4.1
foo(int):
movd xmm0, edi
xorps xmm1, xmm1
pmaxsd xmm0, xmm1
movd eax, xmm0
ret
bar(int):
movd xmm0, edi
xorps xmm1, xmm1
pminsd xmm0, xmm1
movd eax, xmm0
ret
baz(unsigned int):
xor eax, eax
test edi, edi
setne al
ret
gcc9.4 -Os -msse4.1
foo(int):
test edi, edi
mov eax, 0
cmovns eax, edi
ret
bar(int):
test edi, edi
mov eax, 0
cmovle eax, edi
ret
baz(unsigned int):
xor eax, eax
test edi, edi
setne al
ret
Os size
text data bss dec hex filename
178 0 0 178 b2 Os.o
O2 size
text data bss dec hex filename
176 0 0 176 b0 O2.o
https://godbolt.org/z/1sYxdTcKz