[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] Correction régression alloc_comp_auto_array_1
Mikael Morin
mikael@gcc.gnu.org
Fri Jun 13 15:05:15 GMT 2025
https://gcc.gnu.org/g:c9d4f9c058a1c2baf7df6e6de10285d14f699dd8
commit c9d4f9c058a1c2baf7df6e6de10285d14f699dd8
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Thu May 15 16:30:28 2025 +0200
Correction régression alloc_comp_auto_array_1
Diff:
---
gcc/fortran/trans-array.cc | 58 +++++++++++++++++++++++++++-------------------
1 file changed, 34 insertions(+), 24 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 0172bf419a66..559039c06e8e 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -6277,7 +6277,8 @@ gfc_trans_array_bounds (tree type, gfc_symbol * sym, tree * poffset,
tree eltype = gfc_get_element_type (type);
tree elem_len = fold_convert_loc (input_location, gfc_array_index_type,
TYPE_SIZE_UNIT (eltype));
- size = elem_len;
+ gcc_assert (INTEGER_CST_P (elem_len));
+ size = gfc_index_one_node;
offset = gfc_index_zero_node;
tree spacing = GFC_TYPE_ARRAY_SPACING (type, 0);
if (spacing && VAR_P (spacing))
@@ -6309,39 +6310,38 @@ gfc_trans_array_bounds (tree type, gfc_symbol * sym, tree * poffset,
}
/* The offset of this dimension. offset = offset - lbound * sm. */
tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- lbound, size);
+ lbound, spacing);
offset = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
offset, tmp);
- /* The size of this dimension, and the stride of the next. */
- tree spacing;
+ /* Calculate spacing = size * (ubound + 1 - lbound). */
+ tmp = gfc_conv_array_extent_dim (lbound, ubound, nullptr);
+ size = fold_build2_loc (input_location, MULT_EXPR,
+ gfc_array_index_type, size, tmp);
+
+ tree array_info;
if (dim + 1 < as->rank)
- spacing = GFC_TYPE_ARRAY_SPACING (type, dim + 1);
+ array_info = GFC_TYPE_ARRAY_SPACING (type, dim + 1);
else
- spacing = GFC_TYPE_ARRAY_SIZE (type);
+ array_info = GFC_TYPE_ARRAY_SIZE (type);
- if (ubound != NULL_TREE && !(spacing && INTEGER_CST_P (spacing)))
+ if (!(array_info && INTEGER_CST_P (array_info)))
{
- /* Calculate spacing = size * (ubound + 1 - lbound). */
- tmp = gfc_conv_array_extent_dim (lbound, ubound, nullptr);
- tmp = fold_build2_loc (input_location, MULT_EXPR,
- gfc_array_index_type, size, tmp);
- if (spacing)
- gfc_add_modify (pblock, spacing, tmp);
+ if (dim + 1 < as->rank)
+ {
+ tmp = fold_build2_loc (input_location, MULT_EXPR,
+ gfc_array_index_type, spacing, tmp);
+ spacing = array_info;
+ }
else
- spacing = gfc_evaluate_now (tmp, pblock);
+ {
+ tmp = size;
+ spacing = NULL_TREE;
+ }
- /* Make sure that negative size arrays are translated
- to being zero size. */
- tmp = fold_build2_loc (input_location, GE_EXPR, logical_type_node,
- spacing, gfc_index_zero_node);
- tmp = fold_build3_loc (input_location, COND_EXPR,
- gfc_array_index_type, tmp,
- spacing, gfc_index_zero_node);
- gfc_add_modify (pblock, spacing, tmp);
+ gcc_assert (array_info);
+ gfc_add_modify (pblock, array_info, tmp);
}
-
- size = spacing;
}
gfc_trans_array_cobounds (type, pblock, sym);
@@ -6441,6 +6441,11 @@ gfc_trans_auto_array_allocation (tree decl, gfc_symbol * sym,
if (sym->attr.omp_allocate)
{
+ /* The size is the number of elements in the array, so multiply by the
+ size of an element to get the total size. */
+ tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+ size, fold_convert (gfc_array_index_type, tmp));
size = gfc_evaluate_now (size, &init);
tree omp_alloc = lookup_attribute ("omp allocate",
@@ -6459,6 +6464,11 @@ gfc_trans_auto_array_allocation (tree decl, gfc_symbol * sym,
}
else
{
+ /* The size is the number of elements in the array, so multiply by the
+ size of an element to get the total size. */
+ tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+ size, fold_convert (gfc_array_index_type, tmp));
/* Allocate memory to hold the data. */
tmp = gfc_call_malloc (&init, TREE_TYPE (decl), size);
gfc_add_modify (&init, decl, tmp);
More information about the Gcc-cvs
mailing list