[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] Extraction set_descriptor_with_shape
Mikael Morin
mikael@gcc.gnu.org
Mon Sep 8 20:31:58 GMT 2025
https://gcc.gnu.org/g:616fc48e8ef5bcc318f472f2219e0e045a1ff055
commit 616fc48e8ef5bcc318f472f2219e0e045a1ff055
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sun Aug 17 19:28:04 2025 +0200
Extraction set_descriptor_with_shape
Diff:
---
gcc/fortran/trans-descriptor.cc | 110 ++++++++++++++++++++++++++++++++++++++++
gcc/fortran/trans-descriptor.h | 4 +-
gcc/fortran/trans-intrinsic.cc | 107 ++------------------------------------
3 files changed, 117 insertions(+), 104 deletions(-)
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 761eb57e4ea2..60cb6f1b9798 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1676,3 +1676,113 @@ 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);
+ tree 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_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 e945d8e884f0..c477e65de0d6 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -22,8 +22,6 @@ along with GCC; see the file COPYING3. If not see
/* Build a null array descriptor constructor. */
void gfc_nullify_descriptor (stmtblock_t *block, gfc_expr *, tree);
void gfc_set_scalar_null_descriptor (stmtblock_t *block, tree, gfc_symbol *, gfc_expr *, tree);
-void gfc_set_descriptor_with_shape (stmtblock_t *, tree, tree,
- gfc_expr *, locus *);
tree gfc_get_scalar_to_descriptor_type (tree scalar, symbol_attribute attr);
void gfc_copy_sequence_descriptor (stmtblock_t &, tree, tree, bool);
void gfc_set_gfc_from_cfi (stmtblock_t *, stmtblock_t *, tree, tree, tree,
@@ -130,5 +128,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 9c8427c51050..e02f2c307daf 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -9920,11 +9920,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;
@@ -9966,105 +9964,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;
- }
-
- 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]);
+ gfc_set_descriptor_with_shape (&block, desc, cptrse.expr, shape, lower,
+ &fptr->where);
- 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);
More information about the Gcc-cvs
mailing list