[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] gimple-simulate: Réécriture de MEM_REF à l'intérieur de ARRAY_REF

Mikael Morin mikael@gcc.gnu.org
Wed Sep 17 19:52:19 GMT 2025


https://gcc.gnu.org/g:5826c0d9f05d77cd7b080730a1eae4b4e285c71f

commit 5826c0d9f05d77cd7b080730a1eae4b4e285c71f
Author: Mikael Morin <mikael@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]");
 }


More information about the Gcc-cvs mailing list