[gcc(refs/users/mikael/heads/refactor_descriptor_v07)] Suppression gfc_conv_descriptor_rank compil' OK

Mikael Morin mikael@gcc.gnu.org
Sun Jun 29 13:43:16 GMT 2025


https://gcc.gnu.org/g:27e89f24feae3c86777062a73d5f69b9140dc2a7

commit 27e89f24feae3c86777062a73d5f69b9140dc2a7
Author: Mikael Morin <mikael@gcc.gnu.org>
Date:   Sun Jun 29 14:07:23 2025 +0200

    Suppression gfc_conv_descriptor_rank compil' OK

Diff:
---
 gcc/fortran/trans-array.cc      | 16 ++++++----------
 gcc/fortran/trans-decl.cc       |  2 +-
 gcc/fortran/trans-descriptor.cc | 22 ++++++++++++++++++++--
 gcc/fortran/trans-descriptor.h  |  4 +++-
 gcc/fortran/trans-expr.cc       | 24 +++++++-----------------
 gcc/fortran/trans-intrinsic.cc  | 10 +++++-----
 gcc/fortran/trans-openmp.cc     |  2 +-
 gcc/fortran/trans-stmt.cc       |  2 +-
 8 files changed, 44 insertions(+), 38 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index a301b0d06aa6..5a05031d3b69 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -1192,9 +1192,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss,
 
 
 	  /* These transformational functions change the rank.  */
-	  tmp = gfc_conv_descriptor_rank (desc);
-	  gfc_add_modify (pre, tmp,
-			  build_int_cst (TREE_TYPE (tmp), ss->loop->dimen));
+	  gfc_conv_descriptor_rank_set (pre, desc, ss->loop->dimen);
 	  fcn_ss->info->class_container = NULL_TREE;
 	}
 
@@ -4669,7 +4667,7 @@ done:
 			  && (gfc_option.allow_std & GFC_STD_F202Y)))
 		      gcc_assert (se.pre.head == NULL_TREE
 				  && se.post.head == NULL_TREE);
-		    rank = gfc_conv_descriptor_rank (se.expr);
+		    rank = gfc_conv_descriptor_rank_get (se.expr);
 		    tmp = fold_build2_loc (input_location, MINUS_EXPR,
 					   gfc_array_index_type,
 					   fold_convert (gfc_array_index_type,
@@ -8267,7 +8265,7 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim)
   enum gfc_array_kind akind = GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc));
   if (expr == NULL || expr->rank < 0)
     rank = fold_convert (signed_char_type_node,
-			 gfc_conv_descriptor_rank (desc));
+			 gfc_conv_descriptor_rank_get (desc));
   else
     rank = build_int_cst (signed_char_type_node, expr->rank);
 
@@ -8672,8 +8670,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, bool g77,
 		gfc_conv_descriptor_stride_get (se->expr, gfc_index_zero_node));
 	      tree tmp2 = gfc_conv_descriptor_dtype_get (se->expr);
 	      gfc_conv_descriptor_dtype_set (&block, arr, tmp2);
-	      gfc_add_modify (&block, gfc_conv_descriptor_rank (arr),
-			      build_int_cst (signed_char_type_node, 1));
+	      gfc_conv_descriptor_rank_set (&block, arr, 1);
 	      gfc_conv_descriptor_span_set (&block, arr,
 					    gfc_conv_descriptor_span_get (arr));
 	      gfc_conv_descriptor_offset_set (&block, arr, gfc_index_zero_node);
@@ -8957,7 +8954,7 @@ gfc_full_array_size (stmtblock_t *block, tree decl, int rank)
   tree nelems;
   tree tmp;
   if (rank < 0)
-    idx = gfc_conv_descriptor_rank (decl);
+    idx = gfc_conv_descriptor_rank_get (decl);
   else
     idx = gfc_rank_cst[rank - 1];
   nelems = gfc_conv_descriptor_ubound_get (decl, idx);
@@ -9167,8 +9164,7 @@ duplicate_allocatable_coarray (tree dest, tree dest_tok, tree src, tree type,
   else
     {
       /* Set the rank or unitialized memory access may be reported.  */
-      tmp = gfc_conv_descriptor_rank (dest);
-      gfc_add_modify (&globalblock, tmp, build_int_cst (TREE_TYPE (tmp), rank));
+      gfc_conv_descriptor_rank_set (&globalblock, dest, rank);
 
       if (rank)
 	nelems = gfc_full_array_size (&globalblock, src, rank);
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index c89047acdcc8..fda3f34682ec 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7361,7 +7361,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
     {
       /* Set gfc->dtype.rank, if assumed-rank.  */
       rank = gfc_get_cfi_desc_rank (cfi);
-      gfc_add_modify (&block, gfc_conv_descriptor_rank (gfc_desc), rank);
+      gfc_conv_descriptor_rank_set (&block, gfc_desc, rank);
     }
   else if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
     /* In that case, the CFI rank and the declared rank can differ.  */
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index f488e87663e9..77ef2e16e13b 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -283,8 +283,8 @@ gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc,
 }
 
 
-tree
-gfc_conv_descriptor_rank (tree desc)
+static tree
+get_descriptor_rank (tree desc)
 {
   tree tmp;
   tree dtype;
@@ -297,6 +297,24 @@ gfc_conv_descriptor_rank (tree desc)
 			  dtype, tmp, NULL_TREE);
 }
 
+tree
+gfc_conv_descriptor_rank_get (tree desc)
+{
+  return non_lvalue_loc (input_location, get_descriptor_rank (desc));
+}
+
+void
+gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value)
+{
+  tree t = get_descriptor_rank (desc);
+  gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value));
+}
+
+void
+gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value)
+{
+  gfc_conv_descriptor_rank_set (block, desc, gfc_rank_cst[value]);
+}
 
 static tree
 get_descriptor_version (tree desc)
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 3f4fd92df117..54420824c8eb 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -29,7 +29,6 @@ tree gfc_get_cfi_dim_extent (tree desc, tree idx);
 tree gfc_get_cfi_dim_sm (tree desc, tree idx);
 
 
-tree gfc_conv_descriptor_rank (tree desc);
 tree gfc_conv_descriptor_attribute (tree desc);
 tree gfc_conv_descriptor_type (tree desc);
 tree gfc_get_descriptor_dimension (tree desc);
@@ -41,6 +40,7 @@ tree gfc_conv_descriptor_offset_get (tree desc);
 tree gfc_conv_descriptor_dtype_get (tree desc);
 tree gfc_conv_descriptor_elem_len_get (tree desc);
 tree gfc_conv_descriptor_version_get (tree desc);
+tree gfc_conv_descriptor_rank_get (tree desc);
 tree gfc_conv_descriptor_span_get (tree desc);
 
 tree gfc_conv_descriptor_stride_get (tree desc, tree dim);
@@ -53,6 +53,8 @@ void gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree value);
 void gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree value);
 void gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value);
 void gfc_conv_descriptor_version_set (stmtblock_t *block, tree desc, tree value);
+void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value);
+void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value);
 void gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value);
 void gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc, tree dim, tree value);
 void gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, tree dim, tree value);
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 52587ecb8bad..bbc9a2cd315d 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -3308,7 +3308,7 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr)
       char *msg;
 
       dim = fold_convert (signed_char_type_node,
-			  gfc_conv_descriptor_rank (se->expr));
+			  gfc_conv_descriptor_rank_get (se->expr));
       dim = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node,
 			     dim, build_int_cst (signed_char_type_node, 1));
       lower = gfc_conv_descriptor_lbound_get (se->expr, dim);
@@ -6083,7 +6083,8 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
   gfc_add_modify (&block, tmp,
 		  build_int_cst (TREE_TYPE (tmp), CFI_VERSION));
   if (e->rank < 0)
-    rank = fold_convert (signed_char_type_node, gfc_conv_descriptor_rank (gfc));
+    rank = fold_convert (signed_char_type_node,
+			 gfc_conv_descriptor_rank_get (gfc));
   else
     rank = build_int_cst (signed_char_type_node, e->rank);
   tmp = gfc_get_cfi_desc_rank (cfi);
@@ -6627,12 +6628,9 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
 	     correct rank.  */
 	  if (fsym->as && fsym->as->type == AS_ASSUMED_RANK)
 	    {
-	      tree rank;
 	      tree tmp = parmse->expr;
 	      tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr);
-	      rank = gfc_conv_descriptor_rank (tmp);
-	      gfc_add_modify (&parmse->pre, rank,
-			      build_int_cst (TREE_TYPE (rank), e->rank));
+	      gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank);
 	      parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
 	    }
 	  else
@@ -6682,13 +6680,10 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
 	   For an assumed-rank dummy we provide a descriptor that passes
 	   the correct rank.  */
 	{
-	  tree rank;
 	  tree tmp = parmse->expr;
 
 	  tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, gfc_expr_attr (e));
-	  rank = gfc_conv_descriptor_rank (tmp);
-	  gfc_add_modify (&parmse->pre, rank,
-			  build_int_cst (TREE_TYPE (rank), e->rank));
+	  gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank);
 	  gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node);
 	  parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
 	}
@@ -6705,11 +6700,7 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
 	  tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr);
 	  dummy_rank = fsym->as ? fsym->as->rank : 0;
 	  if (dummy_rank > 0)
-	    {
-	      tree rank = gfc_conv_descriptor_rank (tmp);
-	      gfc_add_modify (&parmse->pre, rank,
-			      build_int_cst (TREE_TYPE (rank), dummy_rank));
-	    }
+	    gfc_conv_descriptor_rank_set (&parmse->pre, tmp, dummy_rank);
 	  gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node);
 	  parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
 	}
@@ -10175,8 +10166,7 @@ gfc_trans_structure_assign (tree dest, gfc_expr * expr, bool init, bool coarray)
 		rank = 1;
 	      size = build_zero_cst (size_type_node);
 	      desc = field;
-	      gfc_add_modify (&block, gfc_conv_descriptor_rank (desc),
-			      build_int_cst (signed_char_type_node, rank));
+	      gfc_conv_descriptor_rank_set (&block, desc, rank);
 	    }
 	  else
 	    {
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 0030344a7161..f2e57c5ddece 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -2290,7 +2290,7 @@ gfc_conv_intrinsic_rank (gfc_se *se, gfc_expr *expr)
   gfc_add_block_to_block (&se->pre, &argse.pre);
   gfc_add_block_to_block (&se->post, &argse.post);
 
-  se->expr = gfc_conv_descriptor_rank (argse.expr);
+  se->expr = gfc_conv_descriptor_rank_get (argse.expr);
   se->expr = fold_convert (gfc_get_int_type (gfc_default_integer_kind),
 			   se->expr);
 }
@@ -2459,7 +2459,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, enum gfc_isym_id op)
           cond = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
 				  bound, build_int_cst (TREE_TYPE (bound), 0));
 	  if (as && as->type == AS_ASSUMED_RANK)
-	    tmp = gfc_conv_descriptor_rank (desc);
+	    tmp = gfc_conv_descriptor_rank_get (desc);
 	  else
 	    tmp = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))];
           tmp = fold_build2_loc (input_location, GE_EXPR, logical_type_node,
@@ -2554,7 +2554,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, enum gfc_isym_id op)
 	{
 	  tree minus_one = build_int_cst (gfc_array_index_type, -1);
 	  tree rank = fold_convert (gfc_array_index_type,
-				    gfc_conv_descriptor_rank (desc));
+				    gfc_conv_descriptor_rank_get (desc));
 	  rank = fold_build2_loc (input_location, PLUS_EXPR,
 				  gfc_array_index_type, rank, minus_one);
 
@@ -8232,7 +8232,7 @@ gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr)
           stmtblock_t body;
 
 	  tmp = fold_convert (gfc_array_index_type,
-			      gfc_conv_descriptor_rank (argse.expr));
+			      gfc_conv_descriptor_rank_get (argse.expr));
 	  loop_var = gfc_create_var (gfc_array_index_type, "i");
 	  gfc_add_modify (&argse.pre, loop_var, gfc_index_zero_node);
           exit_label = gfc_build_label_decl (NULL_TREE);
@@ -9034,7 +9034,7 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
 	  gfc_conv_expr_lhs (&arg1se, arg1->expr);
 	  if (arg1->expr->rank == -1)
 	    {
-	      tmp = gfc_conv_descriptor_rank (arg1se.expr);
+	      tmp = gfc_conv_descriptor_rank_get (arg1se.expr);
 	      tmp = fold_build2_loc (input_location, MINUS_EXPR,
 				     TREE_TYPE (tmp), tmp,
 				     build_int_cst (TREE_TYPE (tmp), 1));
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 5e0732b1035d..d9e47fef9b5d 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -2042,7 +2042,7 @@ gfc_omp_get_array_size (location_t loc, tree desc, gimple_seq *seq)
   tree end;
   if (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE_CONT
       || GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE)
-    end = gfc_conv_descriptor_rank (desc);
+    end = gfc_conv_descriptor_rank_get (desc);
   else
     end = build_int_cst (signed_char_type_node,
 			 GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc)));
diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index 79436b4489aa..5817c6ab4fb2 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -3959,7 +3959,7 @@ gfc_trans_select_rank_cases (gfc_code * code)
   /* Calculate the switch expression.  */
   gfc_init_se (&se, NULL);
   gfc_conv_expr_descriptor (&se, code->expr1);
-  rank = gfc_conv_descriptor_rank (se.expr);
+  rank = gfc_conv_descriptor_rank_get (se.expr);
   rank = gfc_evaluate_now (rank, &block);
   symbol_attribute attr = gfc_expr_attr (code->expr1);
   if (!attr.pointer && !attr.allocatable)


More information about the Gcc-cvs mailing list