IPA: Require matching precision for VIEW_CONVERT_EXPR with known values
IPA: Fixes incorrect bitfield interpretation on big-endian targets by ensuring type precision matches for VIEW_CONVERT_EXPR.
This commit addresses an issue in the IPA pass where VIEW_CONVERT_EXPR was folding aggregate constants with differing type precisions. When a bit-field and its containing byte had the same TYPE_SIZE but different TYPE_PRECISION, the conversion could lead to incorrect values, especially on big-endian systems. The change requires matching precision between the aggregate constant and the condition’s type, preventing misinterpretation and ensuring correct predicate evaluation.
In Details
In ipa-fnsummary.cc, evaluate_conditions_for_known_args previously allowed VIEW_CONVERT_EXPR on an aggregate constant if TYPE_SIZE matched the condition type. This overlooked TYPE_PRECISION differences, leading to incorrect folding via native_encode_expr/native_interpret_expr and wrong predicate outcomes when bitfield storage order didn't match endianness. The fix requires matching TYPE_PRECISION as well.
- IPA
- Interprocedural Analysis, a compiler optimization phase that analyzes relationships between different functions.
- VIEW_CONVERT_EXPR
- An expression in GCC's internal representation (tree) that signifies a conversion between types, often used to reinterpret data.
- TYPE_SIZE
- An attribute of a GCC tree type indicating the total storage size in bits.
- TYPE_PRECISION
- An attribute of a GCC tree type indicating the number of value bits it holds.
- bit-field
- A structure member that occupies a specified number of bits, potentially smaller than a byte.
- big-endian
- A computer architecture where the most significant byte of a multi-byte word is stored at the lowest memory address.