https://gcc.gnu.org/g:d8822da68eff0612ace646e7dfdb0921415641e9

commit d8822da68eff0612ace646e7dfdb0921415641e9
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat May 17 18:38:28 2025 +0200

    gimple-exec: prise en charge memcpy

Diff:
---
 gcc/cgraphunit.cc | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 59 insertions(+), 3 deletions(-)

diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index cf2cfa11c534..816393414a23 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -2457,8 +2457,6 @@ class data_value
   void set_cst_at (unsigned dest_offset, unsigned value_width,
                   const wide_int &val, unsigned src_offset);
   stored_address *find_address (unsigned offset) const;
-  void set_at (unsigned dest_offset, unsigned value_width,
-              const data_value & value_src, unsigned src_offset);
 
   friend void selftest::data_value_classify_tests ();
   friend void selftest::data_value_set_address_tests ();
@@ -2484,6 +2482,8 @@ public:
   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 (unsigned dest_offset, unsigned value_width,
+              const data_value & value_src, unsigned src_offset);
   void set_at (const data_value & value, unsigned offset);
   void set (const data_value & value);
   void set_cst_at (const wide_int & val, unsigned offset);
@@ -4439,8 +4439,10 @@ exec_context::execute_call (gcall *g)
       data_storage & storage1 = addr1.storage.get ();
       data_value src = storage1.get_value ();
       wide_int wi_len2 = len2.get_cst ();
+      wi_len2 *= CHAR_BIT;
       gcc_assert (wi::fits_uhwi_p (wi_len2));
-      dest_val.set (src);
+      dest_val.set_at (0, wi_len2.to_uhwi (),
+                      src, addr1.offset);
       storage0.set (dest_val);
     }
   else
@@ -8643,6 +8645,60 @@ exec_context_execute_call_tests ()
   wide_int wi_v82 = v82_after.get_cst ();
   ASSERT_PRED1 (wi::fits_shwi_p, wi_v82);
   ASSERT_EQ (wi_v82.to_shwi (), 17);
+
+
+  tree i91 = create_var (integer_type_node, "i91");
+  tree c92 = create_var (char_type_node, "c92");
+  tree p93 = create_var (ptr_type_node, "p93");
+
+  vec<tree> decls9{};
+  decls9.safe_push (i91);
+  decls9.safe_push (c92);
+  decls9.safe_push (p93);
+
+  heap_memory mem9;
+  context_builder builder9 {};
+  builder9.add_decls (&decls9);
+  exec_context ctx9 = builder9.build (mem9, printer);
+
+  data_storage * storage_i91 = ctx9.find_reachable_var (i91);
+  gcc_assert (storage_i91 != nullptr);
+  storage_address addr91 (storage_i91->get_ref (), CHAR_BIT);
+
+  data_value val_addr91 (ptr_type_node);
+  val_addr91.set_address (addr91);
+
+  data_storage * storage_p93 = ctx9.find_reachable_var (p93);
+  gcc_assert (storage_p93 != nullptr);
+  storage_p93->set (val_addr91);
+
+  tree a92 = build1_loc (UNKNOWN_LOCATION, ADDR_EXPR,
+                        ptr_type_node, c92);
+
+  gcall * memcpy_call9 = gimple_build_call (memcpy_fn, 3, a92, p93,
+                                           size_one_node);
+
+  data_value val91 (integer_type_node);
+  wide_int wi91 = wi::uhwi (5 + 3 * 256 + 1 * 65536, HOST_BITS_PER_INT);
+  val91.set_cst (wi91);
+
+  storage_i91->set (val91);
+  
+  data_storage *storage_c92 = ctx9.find_reachable_var (c92);
+  gcc_assert (storage_c92 != nullptr);
+
+  data_value c92_before = storage_c92->get_value ();
+
+  ASSERT_EQ (c92_before.classify (), VAL_UNDEFINED);
+
+  ctx9.execute (memcpy_call9);
+
+  data_value c92_after = storage_c92->get_value ();
+
+  ASSERT_EQ (c92_after.classify (), VAL_CONSTANT);
+  wide_int wi_c92 = c92_after.get_cst ();
+  ASSERT_PRED1 (wi::fits_shwi_p, wi_c92);
+  ASSERT_EQ (wi_c92.to_shwi (), 3);
 }
 
 void

Reply via email to