https://gcc.gnu.org/g:5826c0d9f05d77cd7b080730a1eae4b4e285c71f
commit 5826c0d9f05d77cd7b080730a1eae4b4e285c71f Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sat Aug 30 21:11:38 2025 +0200 gimple-simulate: Réécriture de MEM_REF à l'intérieur de ARRAY_REF Diff: --- gcc/gimple-simulate.cc | 81 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/gcc/gimple-simulate.cc b/gcc/gimple-simulate.cc index 85c37ed468d9..e33f8d8d5b46 100644 --- a/gcc/gimple-simulate.cc +++ b/gcc/gimple-simulate.cc @@ -982,6 +982,9 @@ static bool rewrite_ref (tree * data_ref, unsigned * offset, simul_scope & context) { tree ref = *data_ref; + if (DECL_P (ref)) + return true; + switch (TREE_CODE (*data_ref)) { case MEM_REF: @@ -1007,34 +1010,24 @@ rewrite_ref (tree * data_ref, unsigned * offset, simul_scope & context) return true; } -#if 0 case ARRAY_REF: { tree base = TREE_OPERAND (ref, 0); tree index = TREE_OPERAND (ref, 1); - tree type = TREE_TYPE (ref); - unsigned type_size = get_constant_type_size (type); - data_value idx_val = context.evaluate (index); - gcc_assert (idx_val.classify () == VAL_KNOWN); - wide_int wi_idx = idx_val.get_known (); - wide_int total_off = wi::shwi (*offset, HOST_BITS_PER_WIDE_INT); - wide_int idx_off = wi_idx * type_size; - gcc_assert (wi::ges_p (total_off, idx_off)); - wide_int remaining_off = total_off - idx_off; - gcc_assert (wi::fits_uhwi_p (remaining_off)); - unsigned rem = remaining_off.to_uhwi (); tree rewritten_base = base; - if (!rewrite_ref (&base, &rem, context, - get_constant_type_size (TREE_TYPE (base)))) + unsigned rewritten_off = *offset; + if (!rewrite_ref (&rewritten_base, &rewritten_off, context) + && TREE_CODE (index) == INTEGER_CST) return false; - *data_ref = build4 (ARRAY_REF, type, rewritten_base, + + data_value idx_val = context.evaluate (index); + *data_ref = build4 (ARRAY_REF, TREE_TYPE (ref), rewritten_base, idx_val.to_tree (TREE_TYPE (index)), NULL_TREE, NULL_TREE); - *offset = rem; + *offset = rewritten_off; return true; } -#endif default: return false; @@ -4487,6 +4480,60 @@ context_printer_print_first_data_ref_part_tests () ASSERT_EQ (res14, integer_type_node); const char * str14 = pp_formatted_text (&pp14); ASSERT_STREQ (str14, "# a14[0].der2i_i2"); + + + tree der1a1i = make_node (RECORD_TYPE); + tree der1a1i_i2 = build_decl (input_location, FIELD_DECL, + get_identifier ("der1a1i_i2"), + integer_type_node); + DECL_CONTEXT (der1a1i_i2) = der1a1i; + DECL_CHAIN (der1a1i_i2) = NULL_TREE; + tree der1a1i_a1 = build_decl (input_location, FIELD_DECL, + get_identifier ("der1a1i_a1"), a2i); + DECL_CONTEXT (der1a1i_a1) = der1a1i; + DECL_CHAIN (der1a1i_a1) = der1a1i_i2; + TYPE_FIELDS (der1a1i) = der1a1i_a1; + layout_type (der1a1i); + + heap_memory mem15; + + context_printer printer15; + pretty_printer & pp15 = printer15.pp; + + tree d_15 = create_var (der1a1i, "d"); + tree p_15 = create_var (ptr_type_node, "p"); + + vec<tree> decls15{}; + decls15.safe_push (d_15); + decls15.safe_push (p_15); + + context_builder builder15 {}; + builder15.add_decls (&decls15); + simul_scope ctx15 = builder15.build (mem15, printer15); + + data_storage *strg_d15 = ctx15.find_reachable_var (d_15); + gcc_assert (strg_d15 != nullptr); + + storage_address addr_d15 (strg_d15->get_ref (), 0); + data_value val_p15 (ptr_type_node); + val_p15.set_address (addr_d15); + + data_storage *strg_p15 = ctx15.find_reachable_var (p_15); + gcc_assert (strg_p15 != nullptr); + strg_p15->set (val_p15); + + tree zero_15 = build_zero_cst (build_pointer_type (void_type_node)); + tree ref_d15 = build2 (MEM_REF, a2i, p_15, zero_15); + tree ref15 = build4 (ARRAY_REF, integer_type_node, ref_d15, + build_one_cst (integer_type_node), NULL_TREE, NULL_TREE); + + tree res15 = printer15.print_first_data_ref_part (ctx15, ref15, 0, + nullptr, + VAL_UNDEFINED); + + ASSERT_EQ (res15, integer_type_node); + const char * str15 = pp_formatted_text (&pp15); + ASSERT_STREQ (str15, "# d.der1a1i_a1[1]"); }