[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] gimple-simulate: Propagation offset pour MEM_REF a l'interieur de tableau
Mikael Morin
mikael@gcc.gnu.org
Wed Sep 17 13:36:51 GMT 2025
https://gcc.gnu.org/g:a3b570a4b5ec6bb13ef4dbdb87a24c6a7aa850d2
commit a3b570a4b5ec6bb13ef4dbdb87a24c6a7aa850d2
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sun Aug 31 18:18:46 2025 +0200
gimple-simulate: Propagation offset pour MEM_REF a l'interieur de tableau
Diff:
---
gcc/gimple-simulate.cc | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/gcc/gimple-simulate.cc b/gcc/gimple-simulate.cc
index 7075c6e14cf7..30b512260b2b 100644
--- a/gcc/gimple-simulate.cc
+++ b/gcc/gimple-simulate.cc
@@ -827,9 +827,13 @@ pick_subref_at (tree var_ref, unsigned min_offset,
break;
}
else if (var_type == target_type
+ || TYPE_MAIN_VARIANT (var_type)
+ == TYPE_MAIN_VARIANT (target_type)
|| (TREE_CODE (var_type) == ARRAY_TYPE
&& TREE_CODE (target_type) == ARRAY_TYPE
- && TREE_TYPE (var_type) == TREE_TYPE (target_type)))
+ && (TREE_TYPE (var_type) == TREE_TYPE (target_type)
+ || TYPE_MAIN_VARIANT (TREE_TYPE (var_type))
+ == TYPE_MAIN_VARIANT (TREE_TYPE (target_type)))))
break;
if (TREE_CODE (var_type) == ARRAY_TYPE)
@@ -910,7 +914,10 @@ pick_subref_at (tree var_ref, unsigned min_offset,
{
gcc_assert (ignored_bits != nullptr);
*ignored_bits = remaining_offset;
- return NULL_TREE;
+ if (target_type == NULL_TREE)
+ return NULL_TREE;
+ else
+ return ref;
}
}
@@ -976,8 +983,8 @@ find_mem_ref_replacement (tree * repl, unsigned * offset, simul_scope & context,
total_offset.get_precision ());
gcc_assert (wi::ges_p (ref_offset, 0)
&& wi::fits_uhwi_p (ref_offset));
-
- tree t = pick_subref_at (var_ref, ref_offset.to_uhwi (), nullptr,
+ int ignored_bits;
+ tree t = pick_subref_at (var_ref, ref_offset.to_uhwi (), &ignored_bits,
0, access_type);
if (t == NULL_TREE)
{
@@ -989,7 +996,7 @@ find_mem_ref_replacement (tree * repl, unsigned * offset, simul_scope & context,
else
{
*repl = t;
- *offset = (total_offset - ref_offset).to_uhwi ();
+ *offset = (total_offset - ref_offset + ignored_bits).to_uhwi ();
}
return true;
}
@@ -1015,16 +1022,14 @@ rewrite_ref (tree * data_ref, unsigned * offset, simul_scope & context)
tree comp = TREE_OPERAND (ref, 1);
tree rewritten_base = base;
- unsigned off = *offset;
+ unsigned off = 0;
if (!rewrite_ref (&rewritten_base, &off, context))
return false;
- if (rewritten_base == base
- && off == *offset)
- return true;
+
tree t = build3 (COMPONENT_REF, TREE_TYPE (ref), rewritten_base,
comp, NULL_TREE);
*data_ref = t;
- *offset = off;
+ *offset += off;
return true;
}
@@ -1034,7 +1039,7 @@ rewrite_ref (tree * data_ref, unsigned * offset, simul_scope & context)
tree index = TREE_OPERAND (ref, 1);
tree rewritten_base = base;
- unsigned rewritten_off = *offset;
+ unsigned rewritten_off = 0;
if (!rewrite_ref (&rewritten_base, &rewritten_off, context)
&& TREE_CODE (index) == INTEGER_CST)
return false;
@@ -1043,7 +1048,7 @@ rewrite_ref (tree * data_ref, unsigned * offset, simul_scope & context)
*data_ref = build4 (ARRAY_REF, TREE_TYPE (ref), rewritten_base,
idx_val.to_tree (TREE_TYPE (index)),
NULL_TREE, NULL_TREE);
- *offset = rewritten_off;
+ *offset += rewritten_off;
return true;
}
More information about the Gcc-cvs
mailing list