[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Extraction set_descriptor_with_shape

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

commit e83779552d4d9c78e02c7f9aff76f69345bd04a2
Author: Mikael Morin <[email protected]>
Date:   Sun Aug 17 19:28:04 2025 +0200

    Extraction set_descriptor_with_shape
    
    Reindentation retour à la ligne set_descriptor_with_shape

Diff:
---
 gcc/fortran/trans-descriptor.cc | 112 ++++++++++++++++++++++++++++++++++++++++
 gcc/fortran/trans-descriptor.h  |   2 +
 gcc/fortran/trans-intrinsic.cc  | 107 ++------------------------------------
 3 files changed, 119 insertions(+), 102 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 8771c6d34cb9..91f4360eb1e0 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1863,3 +1863,115 @@ gfc_set_contiguous_descriptor (stmtblock_t *block, tree desc, tree size,
 				  gfc_index_zero_node, size);
   gfc_conv_descriptor_data_set (block, desc, data_ptr);
 }
+
+
+void
+gfc_set_descriptor_with_shape (stmtblock_t *block, tree desc, tree ptr,
+			       gfc_expr *shape, gfc_expr *lower, locus *where)
+{
+  /* Set the span field.  */
+  tree tmp = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc)));
+  tmp = fold_convert (gfc_array_index_type, tmp);
+  gfc_conv_descriptor_span_set (block, desc, tmp);
+
+  /* Set data value, dtype, and offset.  */
+  tmp = GFC_TYPE_ARRAY_DATAPTR_TYPE (TREE_TYPE (desc));
+  gfc_conv_descriptor_data_set (block, desc, fold_convert (tmp, ptr));
+  gfc_conv_descriptor_dtype_set (block, desc,
+				 gfc_get_dtype (TREE_TYPE (desc)));
+
+  /* Start scalarization of the bounds, using the shape argument.  */
+
+  gfc_ss *shape_ss = gfc_walk_expr (shape);
+  gcc_assert (shape_ss != gfc_ss_terminator);
+  gfc_se shapese, lowerse;
+  gfc_init_se (&shapese, nullptr);
+  gfc_ss *lower_ss = nullptr;
+  if (lower)
+    {
+      lower_ss = gfc_walk_expr (lower);
+      gcc_assert (lower_ss != gfc_ss_terminator);
+      gfc_init_se (&lowerse, nullptr);
+    }
+
+  gfc_loopinfo loop;
+  gfc_init_loopinfo (&loop);
+  gfc_add_ss_to_loop (&loop, shape_ss);
+  if (lower)
+    gfc_add_ss_to_loop (&loop, lower_ss);
+  gfc_conv_ss_startstride (&loop);
+  gfc_conv_loop_setup (&loop, where);
+  gfc_mark_ss_chain_used (shape_ss, 1);
+  if (lower)
+    gfc_mark_ss_chain_used (lower_ss, 1);
+
+  gfc_copy_loopinfo_to_se (&shapese, &loop);
+  shapese.ss = shape_ss;
+  if (lower)
+    {
+      gfc_copy_loopinfo_to_se (&lowerse, &loop);
+      lowerse.ss = lower_ss;
+    }
+
+  tree stride = gfc_create_var (gfc_array_index_type, "stride");
+  tree offset = gfc_create_var (gfc_array_index_type, "offset");
+  gfc_add_modify (block, stride, gfc_index_one_node);
+  gfc_add_modify (block, offset, gfc_index_zero_node);
+
+  /* Loop body.  */
+  stmtblock_t body;
+  gfc_start_scalarized_body (&loop, &body);
+
+  tree dim = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
+			      loop.loopvar[0], loop.from[0]);
+
+  tree lbound;
+  if (lower)
+    {
+      gfc_conv_expr (&lowerse, lower);
+      gfc_add_block_to_block (&body, &lowerse.pre);
+      lbound = fold_convert (gfc_array_index_type, lowerse.expr);
+      gfc_add_block_to_block (&body, &lowerse.post);
+    }
+  else
+    lbound = gfc_index_one_node;
+
+  /* Set bounds and stride.  */
+  gfc_conv_descriptor_lbound_set (&body, desc, dim, lbound);
+  gfc_conv_descriptor_stride_set (&body, desc, dim, stride);
+
+  gfc_conv_expr (&shapese, shape);
+  gfc_add_block_to_block (&body, &shapese.pre);
+  tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
+			 lbound, gfc_index_one_node);
+  tree ubound = fold_build2_loc (input_location, PLUS_EXPR,
+				 gfc_array_index_type, tmp,
+				 fold_convert (gfc_array_index_type,
+					       shapese.expr));
+  gfc_conv_descriptor_ubound_set (&body, desc, dim, ubound);
+  gfc_add_block_to_block (&body, &shapese.post);
+
+  /* Calculate offset.  */
+  tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+			 stride, lbound);
+  gfc_add_modify (&body, offset,
+		  fold_build2_loc (input_location, PLUS_EXPR,
+				   gfc_array_index_type, offset, tmp));
+
+  /* Update stride.  */
+  gfc_add_modify (&body, stride,
+		  fold_build2_loc (input_location, MULT_EXPR,
+				   gfc_array_index_type, stride,
+				   fold_convert (gfc_array_index_type,
+						 shapese.expr)));
+  /* Finish scalarization loop.  */
+  gfc_trans_scalarizing_loops (&loop, &body);
+  gfc_add_block_to_block (block, &loop.pre);
+  gfc_add_block_to_block (block, &loop.post);
+  gfc_cleanup_loop (&loop);
+
+  gfc_add_modify (block, offset,
+		  fold_build1_loc (input_location, NEGATE_EXPR,
+				   gfc_array_index_type, offset));
+  gfc_conv_descriptor_offset_set (block, desc, offset);
+}
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index bfb3ca372645..3999e793a786 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -117,5 +117,7 @@ gfc_set_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr,
 		    bool unlimited_polymorphic, bool data_needed,
 		    bool subref);
 void gfc_set_contiguous_descriptor (stmtblock_t *, tree, tree, tree);
+void gfc_set_descriptor_with_shape (stmtblock_t *, tree, tree,
+				    gfc_expr *, gfc_expr *, locus *);
 
 #endif /* GFC_TRANS_DESCRIPTOR_H */
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 5e3681da4675..6a3145e0045c 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -10137,11 +10137,9 @@ static tree
 conv_isocbinding_subroutine (gfc_code *code)
 {
   gfc_expr *cptr, *fptr, *shape, *lower;
-  gfc_se se, cptrse, fptrse, shapese, lowerse;
-  gfc_ss *shape_ss, *lower_ss;
-  tree desc, dim, tmp, stride, offset, lbound, ubound;
-  stmtblock_t body, block;
-  gfc_loopinfo loop;
+  gfc_se se, cptrse, fptrse;
+  tree desc;
+  stmtblock_t block;
   gfc_actual_arglist *arg;
 
   arg = code->ext.actual;
@@ -10183,105 +10181,10 @@ conv_isocbinding_subroutine (gfc_code *code)
   gfc_add_block_to_block (&block, &fptrse.pre);
   desc = fptrse.expr;
 
-  /* Set the span field.  */
-  tmp = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc)));
-  tmp = fold_convert (gfc_array_index_type, tmp);
-  gfc_conv_descriptor_span_set (&block, desc, tmp);
-
-  /* Set data value, dtype, and offset.  */
-  tmp = GFC_TYPE_ARRAY_DATAPTR_TYPE (TREE_TYPE (desc));
-  gfc_conv_descriptor_data_set (&block, desc, fold_convert (tmp, cptrse.expr));
-  gfc_conv_descriptor_dtype_set (&block, desc,
-				 gfc_get_dtype (TREE_TYPE (desc)));
-
-  /* Start scalarization of the bounds, using the shape argument.  */
-
-  shape_ss = gfc_walk_expr (shape);
-  gcc_assert (shape_ss != gfc_ss_terminator);
-  gfc_init_se (&shapese, NULL);
-  if (lower)
-    {
-      lower_ss = gfc_walk_expr (lower);
-      gcc_assert (lower_ss != gfc_ss_terminator);
-      gfc_init_se (&lowerse, NULL);
-    }
-
-  gfc_init_loopinfo (&loop);
-  gfc_add_ss_to_loop (&loop, shape_ss);
-  if (lower)
-    gfc_add_ss_to_loop (&loop, lower_ss);
-  gfc_conv_ss_startstride (&loop);
-  gfc_conv_loop_setup (&loop, &fptr->where);
-  gfc_mark_ss_chain_used (shape_ss, 1);
-  if (lower)
-    gfc_mark_ss_chain_used (lower_ss, 1);
-
-  gfc_copy_loopinfo_to_se (&shapese, &loop);
-  shapese.ss = shape_ss;
-  if (lower)
-    {
-      gfc_copy_loopinfo_to_se (&lowerse, &loop);
-      lowerse.ss = lower_ss;
-    }
+  gfc_set_descriptor_with_shape (&block, desc, cptrse.expr, shape, lower,
+				 &fptr->where);
 
-  stride = gfc_create_var (gfc_array_index_type, "stride");
-  offset = gfc_create_var (gfc_array_index_type, "offset");
-  gfc_add_modify (&block, stride, gfc_index_one_node);
-  gfc_add_modify (&block, offset, gfc_index_zero_node);
-
-  /* Loop body.  */
-  gfc_start_scalarized_body (&loop, &body);
-
-  dim = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
-			 loop.loopvar[0], loop.from[0]);
-
-  if (lower)
-    {
-      gfc_conv_expr (&lowerse, lower);
-      gfc_add_block_to_block (&body, &lowerse.pre);
-      lbound = fold_convert (gfc_array_index_type, lowerse.expr);
-      gfc_add_block_to_block (&body, &lowerse.post);
-    }
-  else
-    lbound = gfc_index_one_node;
-
-  /* Set bounds and stride.  */
-  gfc_conv_descriptor_lbound_set (&body, desc, dim, lbound);
-  gfc_conv_descriptor_stride_set (&body, desc, dim, stride);
-
-  gfc_conv_expr (&shapese, shape);
-  gfc_add_block_to_block (&body, &shapese.pre);
-  ubound = fold_build2_loc (
-    input_location, MINUS_EXPR, gfc_array_index_type,
-    fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, lbound,
-		     fold_convert (gfc_array_index_type, shapese.expr)),
-    gfc_index_one_node);
-  gfc_conv_descriptor_ubound_set (&body, desc, dim, ubound);
-  gfc_add_block_to_block (&body, &shapese.post);
-
-  /* Calculate offset.  */
-  tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-			 stride, lbound);
-  gfc_add_modify (&body, offset,
-		  fold_build2_loc (input_location, PLUS_EXPR,
-				   gfc_array_index_type, offset, tmp));
-
-  /* Update stride.  */
-  gfc_add_modify (
-    &body, stride,
-    fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, stride,
-		     fold_convert (gfc_array_index_type, shapese.expr)));
-  /* Finish scalarization loop.  */
-  gfc_trans_scalarizing_loops (&loop, &body);
-  gfc_add_block_to_block (&block, &loop.pre);
-  gfc_add_block_to_block (&block, &loop.post);
   gfc_add_block_to_block (&block, &fptrse.post);
-  gfc_cleanup_loop (&loop);
-
-  gfc_add_modify (&block, offset,
-		  fold_build1_loc (input_location, NEGATE_EXPR,
-				   gfc_array_index_type, offset));
-  gfc_conv_descriptor_offset_set (&block, desc, offset);
 
   gfc_add_expr_to_block (&se.pre, gfc_finish_block (&block));
   gfc_add_block_to_block (&se.pre, &se.post);
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.