https://gcc.gnu.org/g:8fd3bbc0668da212f027c9dbe689b4a69a580f6b

commit 8fd3bbc0668da212f027c9dbe689b4a69a580f6b
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sun Mar 30 18:16:46 2025 +0200

    Réduction utilisations stride_get
    
    Correction régression gomp/pr36726.f90

Diff:
---
 gcc/fortran/trans-decl.cc   |  4 +---
 gcc/fortran/trans-openmp.cc | 45 +++++++++++++++++++++++++++------------------
 2 files changed, 28 insertions(+), 21 deletions(-)

diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 0c48f7a062d1..d88ad3655c19 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7597,9 +7597,7 @@ done:
   tmp = gfc_conv_descriptor_extent_get (gfc_desc, idx);
   gfc_add_modify (&loop_body, gfc_get_cfi_dim_extent (cfi, idx), tmp);
   /* d->dim[n].sm = gfc->dim[i].stride  * gfc->span); */
-  tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-                            gfc_conv_descriptor_stride_get (gfc_desc, idx),
-                            gfc_conv_descriptor_span_get (gfc_desc));
+  tmp = gfc_conv_descriptor_sm_get (gfc_desc, idx);
   gfc_add_modify (&loop_body, gfc_get_cfi_dim_sm (cfi, idx), tmp);
 
   /* Generate loop.  */
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index f1b50ea00b6b..4ac7ea0893c1 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -779,14 +779,17 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree 
outer)
       gfc_add_modify (&cond_block, decl, outer);
       tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
       size = gfc_conv_descriptor_extent_get (decl, rank);
-      if (GFC_TYPE_ARRAY_RANK (type) > 1)
+      if (GFC_TYPE_ARRAY_RANK (type) >= 1)
        size = fold_build2_loc (input_location, MULT_EXPR,
                                gfc_array_index_type, size,
-                               gfc_conv_descriptor_stride_get (decl, rank));
-      tree esize = fold_convert (gfc_array_index_type,
-                                TYPE_SIZE_UNIT (gfc_get_element_type (type)));
-      size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-                             size, esize);
+                               gfc_conv_descriptor_sm_get (decl, rank));
+      else
+       {
+         tree esize = gfc_conv_descriptor_span_get (decl);
+         esize = fold_convert_loc (input_location, gfc_array_index_type, 
esize);
+         size = fold_build2_loc (input_location, MULT_EXPR, 
gfc_array_index_type,
+                                 size, esize);
+       }
       size = unshare_expr (size);
       size = gfc_evaluate_now (fold_convert (size_type_node, size),
                               &cond_block);
@@ -965,14 +968,17 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree 
src)
     {
       tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
       size = gfc_conv_descriptor_extent_get (dest, rank);
-      if (GFC_TYPE_ARRAY_RANK (type) > 1)
+      if (GFC_TYPE_ARRAY_RANK (type) >= 1)
        size = fold_build2_loc (input_location, MULT_EXPR,
                                gfc_array_index_type, size,
-                               gfc_conv_descriptor_stride_get (dest, rank));
-      tree esize = fold_convert (gfc_array_index_type,
-                                TYPE_SIZE_UNIT (gfc_get_element_type (type)));
-      size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-                             size, esize);
+                               gfc_conv_descriptor_sm_get (dest, rank));
+      else
+       {
+         tree esize = gfc_conv_descriptor_span_get (dest);
+         esize = fold_convert_loc (input_location, gfc_array_index_type, 
esize);
+         size = fold_build2_loc (input_location, MULT_EXPR, 
gfc_array_index_type,
+                                 size, esize);
+       }
       size = unshare_expr (size);
       size = gfc_evaluate_now (fold_convert (size_type_node, size),
                               &cond_block);
@@ -1083,14 +1089,17 @@ gfc_omp_clause_assign_op (tree clause, tree dest, tree 
src)
     {
       tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
       size = gfc_conv_descriptor_extent_get (src, rank);
-      if (GFC_TYPE_ARRAY_RANK (type) > 1)
+      if (GFC_TYPE_ARRAY_RANK (type) >= 1)
        size = fold_build2_loc (input_location, MULT_EXPR,
                                gfc_array_index_type, size,
-                               gfc_conv_descriptor_stride_get (src, rank));
-      tree esize = fold_convert (gfc_array_index_type,
-                                TYPE_SIZE_UNIT (gfc_get_element_type (type)));
-      size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-                             size, esize);
+                               gfc_conv_descriptor_sm_get (src, rank));
+      else
+       {
+         tree esize = gfc_conv_descriptor_span_get (src);
+         esize = fold_convert_loc (input_location, gfc_array_index_type, 
esize);
+         size = fold_build2_loc (input_location, MULT_EXPR, 
gfc_array_index_type,
+                                 size, esize);
+       }
       size = unshare_expr (size);
       size = gfc_evaluate_now (fold_convert (size_type_node, size),
                               &cond_block);

Reply via email to