From: Mikael Morin <[email protected]>
Regression tested on powerpc64le-unknown-linux-gnu. OK for master?
-- >8 --
Add accessor functions to get or set the value of the rank field of
array descriptors, and remove from the public API the function giving
direct acces to the field.
gcc/fortran/ChangeLog:
* trans-descriptor.cc (gfc_conv_descriptor_rank): Make static and
rename ...
(conv_descriptor_rank): ... to this.
(gfc_conv_descriptor_rank_get, gfc_conv_descriptor_rank_set): New
functions.
* trans-descriptor.h (gfc_conv_descriptor_rank): Remove declaration.
(gfc_conv_descriptor_rank_get, gfc_conv_descriptor_rank_set): New
declarations.
* trans-array.cc (gfc_trans_create_temp_array,
gfc_conv_ss_startstride, gfc_tree_array_size,
gfc_conv_array_parameter, gfc_full_array_size,
duplicate_allocatable_coarray): Use gfc_conv_descriptor_rank_get
to get the value of the rank field, and gfc_conv_descriptor_rank_set
to set it.
* trans-decl.cc (gfc_conv_cfi_to_gfc): Likewise.
* trans-expr.cc (gfc_conv_variable, gfc_conv_gfc_desc_to_cfi_desc,
conv_null_actual, gfc_trans_structure_assign): Likewise.
* trans-intrinsic.cc (gfc_conv_intrinsic_rank,
gfc_conv_intrinsic_bound, gfc_conv_intrinsic_sizeof,
gfc_conv_associated): Likewise.
* trans-openmp.cc (gfc_omp_get_array_size): Likewise.
* trans-stmt.cc (gfc_trans_select_rank_cases): Likewise.
---
gcc/fortran/trans-array.cc | 16 ++++++----------
gcc/fortran/trans-decl.cc | 2 +-
gcc/fortran/trans-descriptor.cc | 33 +++++++++++++++++++++++++++++++--
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, 55 insertions(+), 38 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index cee779697e8..a3c4c5ab0ae 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -1255,9 +1255,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre,
stmtblock_t * post, gfc_ss * ss,
gfc_add_modify (pre, tmp, dtype);
/* 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;
}
@@ -4907,7 +4905,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,
@@ -8511,7 +8509,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);
@@ -8916,8 +8914,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr,
bool g77,
gfc_conv_descriptor_stride_get (se->expr, gfc_index_zero_node));
gfc_add_modify (&block, gfc_conv_descriptor_dtype (arr),
gfc_conv_descriptor_dtype (se->expr));
- 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);
@@ -9211,7 +9208,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);
@@ -9421,8 +9418,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 5ef2603d6bf..cf35cac5c31 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7419,7 +7419,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 c02a3fd5282..a00bed09f94 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -150,8 +150,10 @@ gfc_conv_descriptor_span_set (stmtblock_t *block, tree
desc, tree value)
}
-tree
-gfc_conv_descriptor_rank (tree desc)
+/* Return a reference to the rank of array descriptor DESC. */
+
+static tree
+conv_descriptor_rank (tree desc)
{
tree tmp;
tree dtype;
@@ -164,6 +166,33 @@ gfc_conv_descriptor_rank (tree desc)
dtype, tmp, NULL_TREE);
}
+/* Return the rank of the array descriptor DESC. */
+
+tree
+gfc_conv_descriptor_rank_get (tree desc)
+{
+ return conv_descriptor_rank (desc);
+}
+
+/* Add code to BLOCK setting to VALUE the rank of the array descriptor DESC.
*/
+
+void
+gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value)
+{
+ location_t loc = input_location;
+ tree t = conv_descriptor_rank (desc);
+ gfc_add_modify_loc (loc, block, t,
+ fold_convert_loc (loc, TREE_TYPE (t), value));
+}
+
+/* Add code to BLOCK setting to VALUE the rank of the array descriptor DESC.
*/
+
+void
+gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value)
+{
+ gfc_conv_descriptor_rank_set (block, desc, gfc_rank_cst[value]);
+}
+
/* Return a reference to descriptor DESC's format version. */
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index ec60d7cb656..cdf2295abe4 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -21,7 +21,6 @@ along with GCC; see the file COPYING3. If not see
tree gfc_conv_descriptor_dtype (tree);
-tree gfc_conv_descriptor_rank (tree);
tree gfc_conv_descriptor_attribute (tree);
tree gfc_conv_descriptor_type (tree);
tree gfc_get_descriptor_dimension (tree);
@@ -32,6 +31,7 @@ tree gfc_conv_descriptor_data_get (tree);
tree gfc_conv_descriptor_offset_get (tree);
tree gfc_conv_descriptor_elem_len_get (tree);
tree gfc_conv_descriptor_version_get (tree);
+tree gfc_conv_descriptor_rank_get (tree);
tree gfc_conv_descriptor_span_get (tree);
tree gfc_conv_descriptor_stride_get (tree, tree);
@@ -42,6 +42,8 @@ void gfc_conv_descriptor_data_set (stmtblock_t *, tree, tree);
void gfc_conv_descriptor_offset_set (stmtblock_t *, tree, tree);
void gfc_conv_descriptor_elem_len_set (stmtblock_t *, tree, tree);
void gfc_conv_descriptor_version_set (stmtblock_t *, tree, tree);
+void gfc_conv_descriptor_rank_set (stmtblock_t *, tree, tree);
+void gfc_conv_descriptor_rank_set (stmtblock_t *, tree, int);
void gfc_conv_descriptor_span_set (stmtblock_t *, tree, tree);
void gfc_conv_descriptor_stride_set (stmtblock_t *, tree, tree, tree);
void gfc_conv_descriptor_lbound_set (stmtblock_t *, tree, tree, tree);
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 230665ef9c5..4a87cf717d5 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -3329,7 +3329,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);
@@ -6158,7 +6158,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);
@@ -6750,12 +6751,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
@@ -6805,13 +6803,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);
}
@@ -6828,11 +6823,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);
}
@@ -10279,8 +10270,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 a74ad261722..ab46c46e856 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);
}
@@ -2479,7 +2479,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,
@@ -2574,7 +2574,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);
@@ -8440,7 +8440,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);
@@ -9252,7 +9252,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 5e419180983..0b5ea14629a 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 5eaafbbcc7e..fd82336bbfb 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -3976,7 +3976,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)
--
2.51.0