https://gcc.gnu.org/g:74578d10f8352d019f73096ca164f0ca9b718a48
commit 74578d10f8352d019f73096ca164f0ca9b718a48 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Tue May 20 17:19:02 2025 +0200 gimple-exec: prise en charge écrasement adresse Diff: --- gcc/cgraphunit.cc | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index 721d15405b4a..62fb874dbdba 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -2418,13 +2418,22 @@ struct storage_address struct stored_address { storage_address address; - unsigned position; + HOST_WIDE_INT position; - stored_address (storage_address addr, unsigned pos) + stored_address (storage_address addr, HOST_WIDE_INT pos) : address (addr), position (pos) {} + void invalidate (); }; + +void +stored_address::invalidate () +{ + position = HOST_WIDE_INT_M1; +} + + namespace selftest { void data_value_classify_tests (); @@ -2456,7 +2465,7 @@ class data_value vec<stored_address> addresses; void set_cst_at (unsigned dest_offset, unsigned value_width, const wide_int &val, unsigned src_offset); - stored_address *find_address (unsigned offset) const; + stored_address *find_address (HOST_WIDE_INT offset) const; friend void selftest::data_value_classify_tests (); friend void selftest::data_value_set_address_tests (); @@ -3250,7 +3259,7 @@ data_value::classify (unsigned offset, unsigned width) const stored_address * -data_value::find_address (unsigned offset) const +data_value::find_address (HOST_WIDE_INT offset) const { gcc_assert (offset <= bit_width - HOST_BITS_PER_PTR); @@ -3279,8 +3288,7 @@ data_value::set_address_at (storage_address & address, unsigned offset) { stored_address *existing_address = find_address (offset); gcc_assert (existing_address != nullptr); - /* Invalidate existing address. */ - existing_address->position = -1; + existing_address->invalidate (); } constant_mask &= ~mask; @@ -3324,8 +3332,13 @@ data_value::set_cst_at (unsigned dest_offset, unsigned value_width, enum value_type orig_type = classify (dest_offset, value_width); wide_int dest_mask = wi::shifted_mask (dest_offset, value_width, false, bit_width); - // TODO: invalidate existing address if any - gcc_assert (orig_type != VAL_ADDRESS); + if (orig_type == VAL_ADDRESS) + { + stored_address *existing_address = find_address (dest_offset); + if (existing_address) + existing_address->invalidate (); + } + if (orig_type != VAL_CONSTANT) { constant_mask |= dest_mask;