https://gcc.gnu.org/g:4425aca695b084e862b9ecdeaaf0e3725d2b480a

commit 4425aca695b084e862b9ecdeaaf0e3725d2b480a
Author: Mikael Morin <mik...@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);
 }

Reply via email to