https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87913

            Bug ID: 87913
           Summary: max(n, 1) code generation
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hoganmeier at gmail dot com
  Target Milestone: ---

unsigned int f(unsigned int num)
{
    return num < 1 ? 1 : num;
}

int f2(int num)
{
    return num < 1 ? 1 : num;
}

unsigned int g(unsigned int num)
{
    return num + !num;
}

$ gcc -O3

f(unsigned int):
        mov     eax, edi
        test    edi, edi
        mov     edx, 1
        cmove   eax, edx
f2(int):
        test    edi, edi
        mov     eax, 1
        cmovg   eax, edi
g(unsigned int):
        xor     eax, eax
        test    edi, edi
        sete    al
        add     eax, edi

f and g could be:
f:      test    edi, edi
        mov     eax, 1
        cmovne  eax, edi
g:      cmp     edi, 1
        adc     edi, 0
        mov     eax, edi

https://godbolt.org/z/YJWjsQ

Reply via email to