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

--- Comment #2 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:82d6d385f9708fb6d5e2a2bacd003155cfc41c08

commit r14-10013-g82d6d385f9708fb6d5e2a2bacd003155cfc41c08
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Apr 18 09:49:02 2024 +0200

    libgcc: Fix up __divmodbitint4 [PR114755]

    The following testcase aborts on aarch64-linux but does not on
x86_64-linux.
    In both cases there is UB in the __divmodbitint4 implemenetation.
    When the divisor is negative with most significant limb (even when partial)
    all ones, has at least 2 limbs and the second most significant limb has the
    most significant bit clear, when this number is negated, it will have 0
    in the most significant limb.
    Already in the PR114397 r14-9592 fix I was dealing with such divisors, but
    thought the problem is only if because of that un < vn doesn't imply the
    quotient is 0 and remainder u.
    But as this testcase shows, the problem is with such divisors always.
    What happens is that we use __builtin_clz* on the most significant limb,
    and assume it will not be 0 because that is UB for the builtins.
    Normally the most significant limb of the divisor shouldn't be 0, as
    guaranteed by the bitint_reduce_prec e.g. for the positive numbers, unless
    the divisor is just 0 (but for vn == 1 we have special cases).

    The following patch moves the handling of this corner case a few lines
    earlier before the un < vn check, because adjusting the vn later is harder.

    2024-04-18  Jakub Jelinek  <ja...@redhat.com>

            PR libgcc/114755
            * libgcc2.c (__divmodbitint4): Perform the decrement on negative
            v with most significant limb all ones and the second least
            significant limb with most significant bit clear always, regardless
of
            un < vn.

            * gcc.dg/torture/bitint-69.c: New test.

Reply via email to