https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116538
Bug ID: 116538
Summary: GET_MODE_BITSIZE() returns wrong value for PSImode
Product: gcc
Version: 12.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: alancf0 at gmail dot com
Target Milestone: ---
Target: msp430-none-elf
Some targets (ie, msp430-none-elf with the -mlarge flag) have size_t and
pointer types with a size between HImode and SImode; the size of this type is
often not a multiple of 8 bits. In the case of msp430 with -mlarge, PSImode is
20 bits. The current implementation of GET_MODE_BITSIZE() is as follows:
/* Return the base GET_MODE_BITSIZE value for MODE. */
ALWAYS_INLINE poly_uint16
mode_to_bits (machine_mode mode)
{
return mode_to_bytes (mode) * BITS_PER_UNIT;
}
This obviously does not return the correct value for types whose size is not a
multiple of one byte. One possible patch, which mirrors the above
mode_to_bytes():
diff -ur gcc-12.2.0/gcc/machmode.h ../gcc-12.2.0/gcc/machmode.h
--- gcc-12.2.0/gcc/machmode.h 2022-08-19 01:09:52.940667079 -0700
+++ ../gcc-12.2.0/gcc/machmode.h 2024-08-29 21:51:01.099313215 -0700
@@ -558,7 +558,12 @@
ALWAYS_INLINE poly_uint16
mode_to_bits (machine_mode mode)
{
- return mode_to_bytes (mode) * BITS_PER_UNIT;
+#if GCC_VERSION >= 4001
+ return (__builtin_constant_p (mode)
+ ? mode_unit_precision_inline (mode) : mode_unit_precision[mode]);
+#else
+ return mode_unit_precision[mode];
+#endif
}
/* Return the base GET_MODE_PRECISION value for MODE. */
Note: I have not tested this patch extensively; perhaps in context it is
necessary for mode_to_bits to return a value which is a multiple of 8.