https://gcc.gnu.org/g:136929c7198627c9273030a4c19effae5be54454

commit 136929c7198627c9273030a4c19effae5be54454
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Mar 5 15:43:19 2025 +0100

    Prise en charge zero extension

Diff:
---
 gcc/cgraphunit.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index e7b6e45386bf..c52e6559fede 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -2436,6 +2436,7 @@ namespace selftest
   void context_printer_print_value_update_tests ();
   void exec_context_evaluate_tests ();
   void exec_context_evaluate_literal_tests ();
+  void exec_context_evaluate_unary_tests ();
   void exec_context_evaluate_binary_tests ();
   void exec_context_execute_assign_tests ();
   void exec_context_execute_call_tests ();
@@ -2638,6 +2639,7 @@ class exec_context
   friend void selftest::data_value_set_address_tests ();
   friend void selftest::data_value_set_tests ();
   friend void selftest::exec_context_evaluate_literal_tests ();
+  friend void selftest::exec_context_evaluate_unary_tests ();
   friend void selftest::exec_context_evaluate_binary_tests ();
   friend void selftest::exec_context_execute_assign_tests ();
   friend void selftest::exec_context_execute_call_tests ();
@@ -3821,12 +3823,29 @@ exec_context::evaluate_constructor (tree cstr) const
 
 
 data_value
-exec_context::evaluate_unary (enum tree_code code, tree type ATTRIBUTE_UNUSED, 
tree arg) const
+exec_context::evaluate_unary (enum tree_code code, tree type, tree arg) const
 {
   switch (code)
     {
     case NOP_EXPR:
-      return evaluate (arg);
+      {
+       data_value value = evaluate (arg);
+       unsigned target_width = get_constant_type_size (type);
+       unsigned source_width = value.get_bitwidth ();
+       if (source_width == target_width)
+         return value;
+
+       gcc_assert (value.classify () == VAL_CONSTANT);
+       tree t = value.to_tree (TREE_TYPE (arg));
+       tree r = fold_unary (code, type, t);
+       gcc_assert (TREE_CODE (r) == INTEGER_CST);
+       wide_int wi_r = wi::to_wide (r);
+
+       data_value result (type);
+       result.set_cst (wi_r);
+       return result;
+      }
+      break;
 
     default:
       {
@@ -3874,6 +3893,8 @@ exec_context::evaluate_binary (enum tree_code code, tree 
type, tree lhs, tree rh
          }
        else
          {
+           gcc_assert (code == PLUS_EXPR
+                       || code == POINTER_PLUS_EXPR);
            data_value *val_address = nullptr, *val_offset = nullptr;
            if (lhs_type == VAL_ADDRESS && rhs_type == VAL_CONSTANT)
              {
@@ -6350,6 +6371,39 @@ exec_context_evaluate_constructor_tests ()
   ASSERT_PRED1 (strg2.matches, b);
 }
 
+
+void
+exec_context_evaluate_unary_tests ()
+{
+  heap_memory mem;
+  context_printer printer;
+
+  tree c1 = create_var (char_type_node, "c1");
+
+  vec<tree> decls1;
+  decls1.safe_push (c1);
+
+  context_builder builder1;
+  builder1.add_decls (&decls1);
+  exec_context ctx1 = builder1.build (mem, printer);
+
+  wide_int wi18 = wi::uhwi (18, CHAR_BIT);
+  data_value val18 (char_type_node);
+  val18.set_cst (wi18);
+  data_storage *strg_c1 = ctx1.find_reachable_var (c1);
+  gcc_assert (strg_c1 != nullptr);
+  strg_c1->set (val18);
+  
+  data_value val1 = ctx1.evaluate_unary (NOP_EXPR, integer_type_node, c1);
+
+  ASSERT_EQ (val1.get_bitwidth (), HOST_BITS_PER_INT);
+  ASSERT_EQ (val1.classify (), VAL_CONSTANT);
+  wide_int wi1 = val1.get_cst ();
+  ASSERT_PRED1 (wi::fits_uhwi_p, wi1);
+  ASSERT_EQ (wi1.to_uhwi (), 18);
+}
+
+
 void
 exec_context_evaluate_binary_tests ()
 {
@@ -7253,6 +7307,7 @@ gimple_exec_cc_tests ()
   exec_context_evaluate_tests ();
   exec_context_evaluate_literal_tests ();
   exec_context_evaluate_constructor_tests ();
+  exec_context_evaluate_unary_tests ();
   exec_context_evaluate_binary_tests ();
   exec_context_execute_assign_tests ();
   exec_context_execute_call_tests ();

Reply via email to