https://gcc.gnu.org/g:8ff38c847b6d8636ca0032bbdb9c1c12c3d68158

commit 8ff38c847b6d8636ca0032bbdb9c1c12c3d68158
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed May 14 10:11:27 2025 +0200

    gimple-exec: Prise en charge VIEW_CONVERT_EXPR

Diff:
---
 gcc/cgraphunit.cc | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)

diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index d99d925286d9..cf2cfa11c534 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -4002,6 +4002,9 @@ exec_context::evaluate (tree expr) const
     case CONSTRUCTOR:
       return evaluate_constructor (expr);
 
+    case VIEW_CONVERT_EXPR:
+      return evaluate (TREE_OPERAND (expr, 0));
+
     default:
       gcc_unreachable ();
     }
@@ -7390,6 +7393,31 @@ exec_context_evaluate_unary_tests ()
   ASSERT_EQ (TREE_CODE (tfm25), REAL_CST);
   REAL_VALUE_TYPE fm25 = REAL_VALUE_ATOF ("-2.5", TYPE_MODE (float_type_node));
   ASSERT_TRUE (real_equal (TREE_REAL_CST_PTR (tfm25), &fm25));
+
+
+  tree i2 = create_var (intSI_type_node, "i2");
+
+  vec<tree> decls2 {};
+  decls2.safe_push (i2);
+
+  context_builder builder2;
+  builder2.add_decls (&decls2);
+  exec_context ctx2 = builder2.build (mem, printer);
+
+  wide_int wi23 = wi::uhwi (23, TYPE_PRECISION (intSI_type_node));
+  data_value val23 (intSI_type_node);
+  val23.set_cst (wi23);
+  data_storage *strg_i2 = ctx2.find_reachable_var (i2);
+  gcc_assert (strg_i2 != nullptr);
+  strg_i2->set (val23);
+  
+  data_value val2 = ctx2.evaluate_unary (VIEW_CONVERT_EXPR, 
unsigned_intSI_type_node, i2);
+
+  ASSERT_EQ (val2.get_bitwidth (), HOST_BITS_PER_INT);
+  ASSERT_EQ (val2.classify (), VAL_CONSTANT);
+  wide_int wi2 = val2.get_cst ();
+  ASSERT_PRED1 (wi::fits_uhwi_p, wi2);
+  ASSERT_EQ (wi2.to_uhwi (), 23);
 }
 
 
@@ -8260,6 +8288,42 @@ exec_context_execute_assign_tests ()
   wide_int wi29_27 = val27_after.get_cst ();
   ASSERT_PRED1 (wi::fits_uhwi_p, wi29_27);
   ASSERT_EQ  (wi29_27.to_uhwi (), 14);
+
+
+  tree i10 = create_var (intSI_type_node, "i10");
+  tree v10 = create_var (unsigned_intSI_type_node, "v10");
+
+  vec<tree> decls10 {};
+  decls10.safe_push (i10);
+  decls10.safe_push (v10);
+
+  context_builder builder10;
+  builder10.add_decls (&decls10);
+  exec_context ctx10 = builder10.build (mem, printer);
+
+  wide_int wi23 = wi::uhwi (23, TYPE_PRECISION (intSI_type_node));
+  data_value val23 (intSI_type_node);
+  val23.set_cst (wi23);
+  data_storage *strg_i10 = ctx10.find_reachable_var (i10);
+  gcc_assert (strg_i10 != nullptr);
+  strg_i10->set (val23);
+  
+  data_storage *strg_v10 = ctx10.find_reachable_var (v10);
+  gcc_assert (strg_v10 != nullptr);
+
+  data_value val10_before = strg_v10->get_value ();
+  ASSERT_EQ (val10_before.classify (), VAL_UNDEFINED);
+
+  tree conv10 = build1 (VIEW_CONVERT_EXPR, unsigned_intSI_type_node, i10);
+  gimple *g10 = gimple_build_assign (v10, conv10);
+  ctx10.execute (g10);
+
+  data_value val10_after = strg_v10->get_value ();
+  ASSERT_EQ (val10_after.classify (), VAL_CONSTANT);
+  ASSERT_EQ (val10_after.get_bitwidth (), TYPE_PRECISION 
(unsigned_intSI_type_node));
+  wide_int wi10 = val10_after.get_cst ();
+  ASSERT_PRED1 (wi::fits_shwi_p, wi10);
+  ASSERT_EQ (wi10.to_shwi (), 23);
 }
 
 void

Reply via email to