[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] gimple-exec: réutilisation decompose_ref

Mikael Morin mikael@gcc.gnu.org
Mon May 26 15:46:08 GMT 2025


https://gcc.gnu.org/g:630d555a49b2b503b7cfb5c3bcdcd374d9cacf14

commit 630d555a49b2b503b7cfb5c3bcdcd374d9cacf14
Author: Mikael Morin <mikael@gcc.gnu.org>
Date:   Mon May 26 11:13:56 2025 +0200

    gimple-exec: réutilisation decompose_ref

Diff:
---
 gcc/cgraphunit.cc | 71 ++++++++++++-------------------------------------------
 1 file changed, 15 insertions(+), 56 deletions(-)

diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 97013daa9fbd..40b1af804be9 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -3850,6 +3850,8 @@ exec_context::evaluate (tree expr) const
     {
     case ARRAY_REF:
     case COMPONENT_REF:
+    case MEM_REF:
+    case TARGET_MEM_REF:
       {
 	data_storage *storage = nullptr;
 	int offset = -1;
@@ -3871,54 +3873,6 @@ exec_context::evaluate (tree expr) const
       }
       break;
 
-    case MEM_REF:
-    case TARGET_MEM_REF:
-      {
-	tree ptr = TREE_OPERAND (expr, 0);
-	data_value val_ptr = evaluate (ptr);
-	gcc_assert (val_ptr.classify () == VAL_ADDRESS);
-	storage_address *address = val_ptr.get_address ();
-	gcc_assert (address != nullptr);
-	data_value storage_value = address->storage.get ().get_value ();
-	wide_int ptr_off = wi::uhwi (address->offset,
-				     HOST_BITS_PER_WIDE_INT);
-
-	tree offset_bytes = TREE_OPERAND (expr, 1);
-	data_value val_off = evaluate (offset_bytes);
-	gcc_assert (val_off.classify () == VAL_CONSTANT);
-	wide_int wi_off = val_off.get_cst ();
-
-	unsigned bit_width;
-	if (!get_constant_type_size (TREE_TYPE (expr), bit_width))
-	  gcc_unreachable ();
-
-	if (code == TARGET_MEM_REF)
-	  {
-	    tree index = TREE_OPERAND (expr, 2);
-	    tree step = TREE_OPERAND (expr, 3);
-	    if (index || step)
-	      {
-		gcc_assert (index && step);
-
-		data_value val_idx = evaluate (index);
-		gcc_assert (val_idx.classify () == VAL_CONSTANT);
-		wide_int wi_idx = val_idx.get_cst ();
-
-		data_value val_step = evaluate (step);
-		gcc_assert (val_step.classify () == VAL_CONSTANT);
-		wide_int wi_step = val_step.get_cst ();
-
-		wi_off += wi_idx * wi_step;
-	      }
-	  }
-
-	wi_off = wi_off * CHAR_BIT + ptr_off;
-	gcc_assert (wi::fits_uhwi_p (wi_off));
-
-	return storage_value.get_at (wi_off.to_shwi (), bit_width);
-      }
-      break;
-
     case INTEGER_CST:
       {
 	data_value result (TREE_TYPE (expr));
@@ -4288,15 +4242,20 @@ exec_context::decompose_ref (tree data_ref, data_storage * & storage, int & offs
 	    if (code == TARGET_MEM_REF)
 	      {
 		tree index = TREE_OPERAND (data_ref, 2);
-		data_value idx_val = evaluate (index);
-		gcc_assert (idx_val.classify () == VAL_CONSTANT);
-		add_index = idx_val.get_cst ();
-
 		tree step = TREE_OPERAND (data_ref, 3);
-		data_value step_val = evaluate (step);
-		gcc_assert (step_val.classify () == VAL_CONSTANT);
-		add_multiplier = step_val.get_cst ();
-		add_multiplier *= CHAR_BIT;
+		if (index || step)
+		  {
+		    gcc_assert (index && step);
+
+		    data_value idx_val = evaluate (index);
+		    gcc_assert (idx_val.classify () == VAL_CONSTANT);
+		    add_index = idx_val.get_cst ();
+
+		    data_value step_val = evaluate (step);
+		    gcc_assert (step_val.classify () == VAL_CONSTANT);
+		    add_multiplier = step_val.get_cst ();
+		    add_multiplier *= CHAR_BIT;
+		  }
 	      }
 	  }
 	  break;


More information about the Gcc-cvs mailing list