https://gcc.gnu.org/g:b76cd05dd7267a92c10b93149e8a3d139e692ed6
commit b76cd05dd7267a92c10b93149e8a3d139e692ed6 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Fri May 2 22:11:50 2025 +0200 gimple-exec prise en charge set undefined Diff: --- gcc/cgraphunit.cc | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index 8de5d3c1ca8c..22a2aea372b2 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -2481,6 +2481,7 @@ public: value_type classify () const; value_type classify (unsigned offset, unsigned width) const; unsigned get_bitwidth () const { return bit_width; } + void set_undefined_at (unsigned offset, unsigned width); void set_address_at (storage_address & address, unsigned offset); void set_address (storage_address & address); void set_at (const data_value & value, unsigned offset); @@ -3288,6 +3289,18 @@ data_value::set_address (storage_address & address) } +void +data_value::set_undefined_at (unsigned offset, unsigned width) +{ + wide_int dest_mask = wi::shifted_mask (offset, width, false, + bit_width); + + // TODO: invalidate existing address if any + constant_mask &= ~dest_mask; + address_mask &= ~dest_mask; +} + + void data_value::set_cst_at (unsigned dest_offset, unsigned value_width, const wide_int & value_src, unsigned src_offset) @@ -3333,6 +3346,10 @@ data_value::set_at (unsigned dest_offset, unsigned value_width, enum value_type type = value_src.classify (src_offset, value_width); switch (type) { + case VAL_UNDEFINED: + set_undefined_at (dest_offset, value_width); + break; + case VAL_CONSTANT: set_cst_at (dest_offset, value_width, value_src.constant_value, src_offset); break; @@ -5506,6 +5523,58 @@ data_value_set_at_tests () HOST_BITS_PER_INT); ASSERT_PRED1 (wi::fits_shwi_p, wi_i3); ASSERT_EQ (wi_i3.to_shwi (), 7); + + + tree range17 = build_range_type (integer_type_node, + build_int_cst (integer_type_node, 0), + build_int_cst (integer_type_node, 17)); + tree array_char_17 = build_array_type (char_type_node, range17); + tree c17 = create_var (array_char_17, "c17"); + tree i5 = create_var (integer_type_node, "i5"); + + vec<tree> decls5{}; + decls5.safe_push (c17); + decls5.safe_push (i5); + + context_builder builder5 {}; + builder5.add_decls (&decls5); + exec_context ctx5 = builder5.build (mem, printer); + + data_value z17 (array_char_17); + + wide_int wi0 = wi::shwi (0, 17 * CHAR_BIT); + z17.set_cst_at (wi0, 0); + + data_storage *strg_c17 = ctx5.find_reachable_var (c17); + gcc_assert (strg_c17 != nullptr); + strg_c17->set (z17); + + data_storage *strg_i5 = ctx5.find_reachable_var (i5); + gcc_assert (strg_i5 != nullptr); + + storage_address addr_i5(strg_i5->get_ref (), 0); + data_value val_addr_i5 (ptr_type_node); + val_addr_i5.set_address (addr_i5); + strg_c17->set_at (val_addr_i5, HOST_BITS_PER_PTR); + + data_value val17_before = strg_c17->get_value (); + + ASSERT_EQ (val17_before.classify (), VAL_MIXED); + ASSERT_EQ (val17_before.classify (0, HOST_BITS_PER_PTR), VAL_CONSTANT); + ASSERT_EQ (val17_before.classify (HOST_BITS_PER_PTR, HOST_BITS_PER_PTR), VAL_ADDRESS); + ASSERT_EQ (val17_before.classify (2 * HOST_BITS_PER_PTR, CHAR_BIT), VAL_CONSTANT); + + data_value undef (5 * CHAR_BIT + HOST_BITS_PER_PTR); + strg_c17->set_at (undef, 3 * CHAR_BIT); + + data_value val17_after = strg_c17->get_value (); + + ASSERT_EQ (val17_after.classify (), VAL_MIXED); + ASSERT_EQ (val17_after.classify (0, 3 * CHAR_BIT), VAL_CONSTANT); + ASSERT_EQ (val17_after.classify (3 * CHAR_BIT, 5 * CHAR_BIT + HOST_BITS_PER_PTR), + VAL_UNDEFINED); + ASSERT_EQ (val17_after.classify (2 * HOST_BITS_PER_PTR, CHAR_BIT), + VAL_CONSTANT); } void