Interestingly only clang understands that an upcast will prevent the overflow:

int foo(unsigned int a)
{
        if (a > 5)
                return ((unsigned long long)a * 3) / 3;
        else
                return 0;
}

Is compiled to compact code in clang:

        xorl    %eax, %eax
        cmpl    $5, %edi
        cmoval  %edi, %eax
        retq


Reply via email to