[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Factorisation descriptor_element_size

Mikael Morin via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:2b19b738ae6827ac94eefe56d7b603fd694a58e1

commit 2b19b738ae6827ac94eefe56d7b603fd694a58e1
Author: Mikael Morin <[email protected]>
Date:   Fri Feb 14 11:04:01 2025 +0100

    Factorisation descriptor_element_size

Diff:
---
 gcc/fortran/trans-array.cc | 85 +++++++++++++++++++++++++++-------------------
 1 file changed, 51 insertions(+), 34 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index fa89a8397280..eb7a86ae1a99 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -5967,6 +5967,46 @@ gfc_conv_array_extent_dim (tree lbound, tree ubound, tree* or_expr)
 }
 
 
+static tree
+descriptor_element_size (tree descriptor, tree expr3_elem_size,
+			 gfc_expr *expr3)
+{
+  tree type;
+  tree tmp;
+
+  type = TREE_TYPE (descriptor);
+
+  /* Obviously, if there is a SOURCE expression (expr3) we must use its element
+     size.  */
+  if (expr3_elem_size != NULL_TREE)
+    tmp = expr3_elem_size;
+  else if (expr3 != NULL)
+    {
+      if (expr3->ts.type == BT_CLASS)
+	{
+	  gfc_se se_sz;
+	  gfc_expr *sz = gfc_copy_expr (expr3);
+	  gfc_add_vptr_component (sz);
+	  gfc_add_size_component (sz);
+	  gfc_init_se (&se_sz, NULL);
+	  gfc_conv_expr (&se_sz, sz);
+	  gfc_free_expr (sz);
+	  tmp = se_sz.expr;
+	}
+      else
+	{
+	  tmp = gfc_typenode_for_spec (&expr3->ts);
+	  tmp = TYPE_SIZE_UNIT (tmp);
+	}
+    }
+  else
+    tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+
+  /* Convert to size_t.  */
+  return fold_convert (size_type_node, tmp);
+}
+
+
 /* Fills in an array descriptor, and returns the size of the array.
    The size will be a simple_val, ie a variable or a constant.  Also
    calculates the offset of the base.  The pointer argument overflow,
@@ -6004,7 +6044,7 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
 		     stmtblock_t * descriptor_block, tree * overflow,
 		     tree expr3_elem_size, gfc_expr *expr3, tree expr3_desc,
 		     bool e3_has_nodescriptor, gfc_expr *expr,
-		     tree *element_size, bool explicit_ts)
+		     tree element_size, bool explicit_ts)
 {
   tree type;
   tree tmp;
@@ -6241,37 +6281,10 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
     }
 
   /* The stride is the number of elements in the array, so multiply by the
-     size of an element to get the total size.  Obviously, if there is a
-     SOURCE expression (expr3) we must use its element size.  */
-  if (expr3_elem_size != NULL_TREE)
-    tmp = expr3_elem_size;
-  else if (expr3 != NULL)
-    {
-      if (expr3->ts.type == BT_CLASS)
-	{
-	  gfc_se se_sz;
-	  gfc_expr *sz = gfc_copy_expr (expr3);
-	  gfc_add_vptr_component (sz);
-	  gfc_add_size_component (sz);
-	  gfc_init_se (&se_sz, NULL);
-	  gfc_conv_expr (&se_sz, sz);
-	  gfc_free_expr (sz);
-	  tmp = se_sz.expr;
-	}
-      else
-	{
-	  tmp = gfc_typenode_for_spec (&expr3->ts);
-	  tmp = TYPE_SIZE_UNIT (tmp);
-	}
-    }
-  else
-    tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
-
-  /* Convert to size_t.  */
-  *element_size = fold_convert (size_type_node, tmp);
+     size of an element to get the total size.  */
 
   if (rank == 0)
-    return *element_size;
+    return element_size;
 
   stride = fold_convert (size_type_node, stride);
 
@@ -6280,14 +6293,14 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
      dividing.  */
   tmp = fold_build2_loc (input_location, TRUNC_DIV_EXPR,
 			 size_type_node,
-			 TYPE_MAX_VALUE (size_type_node), *element_size);
+			 TYPE_MAX_VALUE (size_type_node), element_size);
   cond = gfc_unlikely (fold_build2_loc (input_location, LT_EXPR,
 					logical_type_node, tmp, stride),
 		       PRED_FORTRAN_OVERFLOW);
   tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond,
 			 integer_one_node, integer_zero_node);
   cond = gfc_unlikely (fold_build2_loc (input_location, EQ_EXPR,
-					logical_type_node, *element_size,
+					logical_type_node, element_size,
 					build_int_cst (size_type_node, 0)),
 		       PRED_FORTRAN_SIZE_ZERO);
   tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond,
@@ -6297,7 +6310,7 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
   *overflow = gfc_evaluate_now (tmp, pblock);
 
   size = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
-			  stride, *element_size);
+			  stride, element_size);
 
   if (poffset != NULL)
     {
@@ -6485,6 +6498,10 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
 				  se->string_length));
 
   gfc_init_block (&set_descriptor_block);
+
+
+  element_size = descriptor_element_size (se->expr, expr3_elem_size, expr3);
+
   /* Take the corank only from the actual ref and not from the coref.  The
      later will mislead the generation of the array dimensions for allocatable/
      pointer components in derived types.  */
@@ -6494,7 +6511,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
 			      &offset, lower, upper,
 			      &se->pre, &set_descriptor_block, &overflow,
 			      expr3_elem_size, expr3, e3_arr_desc,
-			      e3_has_nodescriptor, expr, &element_size,
+			      e3_has_nodescriptor, expr, element_size,
 			      explicit_ts);
 
   if (dimension)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.