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

--- Comment #3 from CVS 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:09b512466ce302833d1624045fc5fe5afe040f58

commit r14-4349-g09b512466ce302833d1624045fc5fe5afe040f58
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Sat Sep 30 11:28:44 2023 +0200

    lowerbitint: Fix 2 bitint lowering bugs [PR111625]

    This patch fixes 2 issues.  One is when we want to get address of
    an uninitialized large/huge bitint SSA_NAME for
multiplication/division/modulo
    or conversion to floating point (binary or decimal), the code just creates
    an uninitialized limb sized variable and passes address of that, but I
forgot
    to initialize *prec in that case, so it invoked UB at compile time rather
    than at runtime.  As it is UB, we could use anything valid as precision
there,
    say 2 bits for signed, 1 bit for unsigned as smallest possible set of
values,
    or full bitint precision as full random value.  Though, because we only
pass
    address to a single limb, I think it is best to pass the bitsize of the
limb.

    And the other issue is that when ranger in range_to_prec finds some range
    is undefined_p (), it will assert {lower,upper}_bound () method isn't
called
    on it, but we were.  So, the patch adjusts range_to_proc to treat it like
    the !optimized case, full bitint precision.

    2023-09-30  Jakub Jelinek  <ja...@redhat.com>

            PR middle-end/111625
            PR middle-end/111637
            * gimple-lower-bitint.cc (range_to_prec): Use prec or -prec if
            r.undefined_p ().
            (bitint_large_huge::handle_operand_addr): For uninitialized
operands
            use limb_prec or -limb_prec precision.

Reply via email to