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

--- Comment #5 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:e624d5559d21992c9e5da85b4ae75629a61afc2c

commit r16-2661-ge624d5559d21992c9e5da85b4ae75629a61afc2c
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Jul 31 12:10:02 2025 +0200

    change get_best_mode args int -> HOST_WIDE_INT [PR121264]

    The following testcase is miscompiled, because byte 0x20000000
    is bit 0x100000000 and ifcombine incorrectly combines the two loads
    into a BIT_FIELD_REF even when they are very far away.
    The problem is that gimple-fold.cc ifcombine uses get_best_mode heavily,
    and that function has just int bitsize and int bitpos arguments, so
    when called e.g. with
      if (get_best_mode (end_bit - first_bit, first_bit, 0, ll_end_region,
                         ll_align, BITS_PER_WORD, volatilep, &lnmode))
    where end_bit - first_bit doesn't fit into int, it is silently truncated.
    If there was just a single problematic get_best_mode call, I would probably
    just check for overflows in the caller, but there are many.
    And the two arguments are used solely as arguments to
    bit_field_mode_iterator constructor which has HOST_WIDE_INT arguments,
    so I think the easiest fix is just make the get_best_mode arguments
    also HOST_WIDE_INT.

    2025-07-31  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/121264
            * machmode.h (get_best_mode): Change type of first 2 arguments
            from int to HOST_WIDE_INT.
            * stor-layout.cc (get_best_mode): Likewise.

            * gcc.dg/tree-ssa/pr121264.c: New test.

Reply via email to