[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