https://gcc.gnu.org/g:64eb5fd110ad4bff744af289763a34ef66274e59

commit 64eb5fd110ad4bff744af289763a34ef66274e59
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Fri Aug 29 20:52:19 2025 +0200

    gimple-simulate: sauvegarde

Diff:
---
 gcc/gimple-simulate.cc | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/gcc/gimple-simulate.cc b/gcc/gimple-simulate.cc
index 9333c64aa77d..3bdfd2bf6f7d 100644
--- a/gcc/gimple-simulate.cc
+++ b/gcc/gimple-simulate.cc
@@ -807,6 +807,8 @@ static tree
 pick_subref_at (tree var_ref, unsigned offset, int * ignored_bits,
                unsigned min_size)
 {
+  if (ignored_bits != nullptr)
+    *ignored_bits = 0;
   tree ref = var_ref;
   unsigned remaining_offset = offset;
   while (true)
@@ -953,8 +955,20 @@ find_mem_ref_replacement (tree * repl, unsigned * offset, 
simul_scope & context,
          remaining_offset += wi_idx * CHAR_BIT;
        }
 
-      *repl = var_ref;
-      *offset = remaining_offset.to_shwi ();
+      int ignored_bits;
+      tree t = pick_subref_at (var_ref, remaining_offset.to_shwi (),
+                              &ignored_bits,
+                              get_constant_type_size (access_type));
+      if (t == NULL_TREE)
+       {
+         *repl = var_ref;
+         *offset = remaining_offset.to_shwi ();
+       }
+      else
+       {
+         *repl = t;
+         *offset = ignored_bits;
+       }
       return true;
     }
 }

Reply via email to