[gcc(refs/users/mikael/heads/refactor_descriptor_v03)] Déplacement fonction

Mikael Morin mikael@gcc.gnu.org
Fri Mar 14 16:13:55 GMT 2025


https://gcc.gnu.org/g:9e9030951592f83556ac71fc36ab41c119e482ee

commit 9e9030951592f83556ac71fc36ab41c119e482ee
Author: Mikael Morin <mikael@gcc.gnu.org>
Date:   Fri Feb 14 09:34:02 2025 +0100

    Déplacement fonction

Diff:
---
 gcc/fortran/trans-array.cc | 53 ++++++++++++++++++++++++++++++++++++++--------
 gcc/fortran/trans-array.h  |  1 +
 gcc/fortran/trans-expr.cc  | 41 ++---------------------------------
 3 files changed, 47 insertions(+), 48 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 5be7e29130d3..2ec19e44a465 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -2227,6 +2227,44 @@ gfc_conv_shift_descriptor_subarray (stmtblock_t *block, tree desc,
 }
 
 
+void
+gfc_conv_shift_descriptor (stmtblock_t *block, tree desc, int rank,
+			   tree lbound[GFC_MAX_DIMENSIONS],
+			   tree ubound[GFC_MAX_DIMENSIONS])
+{
+  tree size = gfc_index_one_node;
+  tree offset = gfc_index_zero_node;
+  for (int n = 0; n < rank; n++)
+    {
+      tree tmp = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
+      tmp = fold_build2_loc (input_location, PLUS_EXPR,
+			     gfc_array_index_type, tmp,
+			     gfc_index_one_node);
+      gfc_conv_descriptor_ubound_set (block,
+				      desc,
+				      gfc_rank_cst[n],
+				      tmp);
+      gfc_conv_descriptor_lbound_set (block,
+				      desc,
+				      gfc_rank_cst[n],
+				      gfc_index_one_node);
+      size = gfc_evaluate_now (size, block);
+      offset = fold_build2_loc (input_location, MINUS_EXPR,
+				gfc_array_index_type,
+				offset, size);
+      offset = gfc_evaluate_now (offset, block);
+      tmp = gfc_conv_array_extent_dim (lbound[n], ubound[n], nullptr);
+      size = fold_build2_loc (input_location, MULT_EXPR,
+			      gfc_array_index_type, size, tmp);
+    }
+
+  gfc_conv_descriptor_offset_set (block, desc,
+				  offset);
+}
+
+
+
+
 int
 gfc_descriptor_rank (tree descriptor)
 {
@@ -8412,15 +8450,12 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
 		 start at zero, but when allocating it, the standard expects
 		 the array to start at one.  Therefore fix the upper bound to be
 		 (desc.ubound - desc.lbound) + 1.  */
-	      tmp = fold_build2_loc (input_location, MINUS_EXPR,
-				     gfc_array_index_type,
-				     gfc_conv_descriptor_ubound_get (
-				       expr3_desc, gfc_rank_cst[n]),
-				     gfc_conv_descriptor_lbound_get (
-				       expr3_desc, gfc_rank_cst[n]));
-	      tmp = fold_build2_loc (input_location, PLUS_EXPR,
-				     gfc_array_index_type, tmp,
-				     gfc_index_one_node);
+	      tmp = gfc_conv_array_extent_dim (
+		      gfc_conv_descriptor_lbound_get (expr3_desc,
+						      gfc_rank_cst[n]),
+		      gfc_conv_descriptor_ubound_get (expr3_desc,
+						      gfc_rank_cst[n]),
+		      nullptr);
 	      se.expr = gfc_evaluate_now (tmp, pblock);
 	    }
 	  else
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index 836a177da014..f37f09c21cff 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -237,6 +237,7 @@ void gfc_conv_shift_descriptor (stmtblock_t*, tree, const gfc_array_ref &);
 void gfc_conv_shift_descriptor (stmtblock_t*, tree, int);
 void gfc_conv_shift_descriptor (stmtblock_t*, tree, tree, int, tree);
 void gfc_conv_shift_descriptor_subarray (stmtblock_t*, tree, gfc_expr *, gfc_expr *);
+void gfc_conv_shift_descriptor (stmtblock_t *, tree, int, tree *, tree *);
 
 /* Add pre-loop scalarization code for intrinsic functions which require
    special handling.  */
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index f9078dd1b694..be5df5e1fa8e 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -5364,43 +5364,6 @@ gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
 }
 
 
-static void
-shift_descriptor (stmtblock_t *block, tree desc, int rank,
-		  tree lbound[GFC_MAX_DIMENSIONS],
-		  tree ubound[GFC_MAX_DIMENSIONS])
-
-{
-  tree size = gfc_index_one_node;
-  tree offset = gfc_index_zero_node;
-  for (int n = 0; n < rank; n++)
-    {
-      tree tmp = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
-      tmp = fold_build2_loc (input_location, PLUS_EXPR,
-			     gfc_array_index_type, tmp,
-			     gfc_index_one_node);
-      gfc_conv_descriptor_ubound_set (block,
-				      desc,
-				      gfc_rank_cst[n],
-				      tmp);
-      gfc_conv_descriptor_lbound_set (block,
-				      desc,
-				      gfc_rank_cst[n],
-				      gfc_index_one_node);
-      size = gfc_evaluate_now (size, block);
-      offset = fold_build2_loc (input_location, MINUS_EXPR,
-				gfc_array_index_type,
-				offset, size);
-      offset = gfc_evaluate_now (offset, block);
-      tmp = gfc_conv_array_extent_dim (lbound[n], ubound[n], nullptr);
-      size = fold_build2_loc (input_location, MULT_EXPR,
-			      gfc_array_index_type, size, tmp);
-    }
-
-  gfc_conv_descriptor_offset_set (block, desc,
-				  offset);
-}
-
-
 /* Returns a reference to a temporary array into which a component of
    an actual argument derived type array is copied and then returned
    after the function call.  */
@@ -5671,8 +5634,8 @@ class_array_fcn:
   /* Determine the offset for pointer formal arguments and set the
      lbounds to one.  */
   if (formal_ptr)
-    shift_descriptor (&parmse->pre, parmse->expr, dimen,
-		      rse.loop->from, rse.loop->to);
+    gfc_conv_shift_descriptor (&parmse->pre, parmse->expr, dimen,
+			       rse.loop->from, rse.loop->to);
 
   /* We want either the address for the data or the address of the descriptor,
      depending on the mode of passing array arguments.  */


More information about the Gcc-cvs mailing list