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

Reply via email to