[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] gimple-simulate: Correction assertion évaluation LSHIFT_EXPR et RSHIFT_EXPR
Mikael Morin
mikael@gcc.gnu.org
Wed Sep 17 15:36:54 GMT 2025
https://gcc.gnu.org/g:4425aca695b084e862b9ecdeaaf0e3725d2b480a
commit 4425aca695b084e862b9ecdeaaf0e3725d2b480a
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Fri Aug 29 10:14:50 2025 +0200
gimple-simulate: Correction assertion évaluation LSHIFT_EXPR et RSHIFT_EXPR
Diff:
---
gcc/gimple-simulate.cc | 41 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/gcc/gimple-simulate.cc b/gcc/gimple-simulate.cc
index 4fc64d342089..0951731a1d2c 100644
--- a/gcc/gimple-simulate.cc
+++ b/gcc/gimple-simulate.cc
@@ -2105,7 +2105,9 @@ simul_scope::evaluate_binary (enum tree_code code, tree type, tree lhs,
&& TYPE_PRECISION (TREE_TYPE (lhs))
== TYPE_PRECISION (TREE_TYPE (rhs))
&& TYPE_UNSIGNED (TREE_TYPE (lhs))
- == TYPE_UNSIGNED (TREE_TYPE (rhs))));
+ == TYPE_UNSIGNED (TREE_TYPE (rhs)))
+ || code == LSHIFT_EXPR
+ || code == RSHIFT_EXPR);
tree lval = val_lhs.to_tree (TREE_TYPE (lhs));
tree rval = val_rhs.to_tree (TREE_TYPE (rhs));
tree t = fold_binary (code, type, lval, rval);
@@ -5723,6 +5725,43 @@ simul_scope_evaluate_binary_tests ()
wide_int wi_ne5 = val_ne5.get_known ();
ASSERT_PRED1 (wi::fits_uhwi_p, wi_ne5);
ASSERT_EQ (wi_ne5.to_uhwi (), 1);
+
+
+ tree l6 = create_var (long_integer_type_node, "l6");
+
+ vec<tree> decls6{};
+ decls6.safe_push (l6);
+
+ context_builder builder6 {};
+ builder6.add_decls (&decls6);
+ simul_scope ctx6 = builder6.build (mem, printer);
+
+ wide_int wi11_6 = wi::shwi (11, TYPE_PRECISION (long_integer_type_node));
+ data_value cst11_6 (long_integer_type_node);
+ cst11_6.set_known (wi11_6);
+ data_storage *strg_l6 = ctx6.find_reachable_var (l6);
+ gcc_assert (strg_l6 != nullptr);
+ strg_l6->set (cst11_6);
+
+ tree int3 = build_int_cst (integer_type_node, 3);
+ data_value lshift_6 = ctx6.evaluate_binary (LSHIFT_EXPR,
+ long_integer_type_node,
+ l6, int3);
+
+ ASSERT_EQ (lshift_6.classify (), VAL_KNOWN);
+ wide_int wi_lshift6 = lshift_6.get_known ();
+ ASSERT_PRED1 (wi::fits_shwi_p, wi_lshift6);
+ ASSERT_EQ (wi_lshift6.to_shwi (), 88);
+
+ tree int1 = build_int_cst (integer_type_node, 1);
+ data_value rshift_6 = ctx6.evaluate_binary (RSHIFT_EXPR,
+ long_integer_type_node,
+ l6, int1);
+
+ ASSERT_EQ (rshift_6.classify (), VAL_KNOWN);
+ wide_int wi_rshift6 = rshift_6.get_known ();
+ ASSERT_PRED1 (wi::fits_shwi_p, wi_rshift6);
+ ASSERT_EQ (wi_rshift6.to_shwi (), 5);
}
More information about the Gcc-cvs
mailing list