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

Kang-Che Sung <Explorer09 at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |Explorer09 at gmail dot com

--- Comment #6 from Kang-Che Sung <Explorer09 at gmail dot com> ---
Hello. Thank you guys for implementing the multiplication overflow
optimization.
Otherwise there have been "complaints" on the web [1] about lack of such
optimization.


However, from what I tested in the current svn source (r244933), the construct
like this (b != 0 && -1 / b < a) still not yet yields optimal code. In
particular, there are still unnecessary (b != 0) generated...

...for a code like this:

----------------------------------------------
#define UINT_MAX (~0U)
void abort(void); /* from stdlib.h */
unsigned int umul_overflow1(unsigned int a, unsigned int b) {
    if (b != 0 && UINT_MAX / b < a)
        abort();
    return a * b;
}
unsigned int umul_overflow2(unsigned int a, unsigned int b) {
    unsigned int res;
    if (__builtin_umul_overflow(a, b, &res))
        abort();
    return res;
}
----------------------------------------------

Generated assembly (-O2, gcc configured with --target=x86_64-pc-linux-gnu
--with-arch-64=generic)

umul_overflow1:
.LFB0:
        .cfi_startproc
        testl   %esi, %esi
        je      .L2
        movl    %edi, %eax
        mull    %esi
        jo      .L13
.L2:
        movl    %esi, %eax
        imull   %edi, %eax
        ret
.L13:
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        call    abort
        .cfi_endproc
umul_overflow2:
.LFB1:
        .cfi_startproc
        movl    %edi, %eax
        mull    %esi
        jo      .L22
        rep ret
.L22:
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        call    abort
        .cfi_endproc

----------------------------------------------

I would expect that ideally, both functions will generate same machine code.


[1]http://kqueue.org/blog/2012/03/16/fast-integer-overflow-detection/

Reply via email to