]> git.ipfire.org Git - thirdparty/gcc.git/commit
change get_best_mode args int -> HOST_WIDE_INT [PR121264]
authorJakub Jelinek <jakub@redhat.com>
Thu, 31 Jul 2025 10:10:02 +0000 (12:10 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 31 Jul 2025 10:26:48 +0000 (12:26 +0200)
commit46860078a0dc147b76ad0cc660b021c6e5b7bb81
tree35f44afd3d0b3ccd6823c4b423c74f98207459c2
parent1b42af2d10bd6ec11ffa25431445cd609384e690
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  <jakub@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.

(cherry picked from commit e624d5559d21992c9e5da85b4ae75629a61afc2c)
gcc/machmode.h
gcc/stor-layout.cc
gcc/testsuite/gcc.dg/tree-ssa/pr121264.c [new file with mode: 0644]