https://gcc.gnu.org/g:29d17e16b8846680aaf1975145759629b322a909

commit 29d17e16b8846680aaf1975145759629b322a909
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Thu Sep 12 16:56:39 2024 +0200

    fortran: Check MASK directly instead of its scalarization chain
    
    Update the conditions used by the inline MINLOC/MAXLOC code generation
    function to check directly the properties of MASK instead of the
    variable holding its scalarization chain.
    
    The inline implementation of MINLOC/MAXLOC in gfc_conv_intrinsic_minmaxloc
    uses several conditions checking the presence of a scalarization chain for
    MASK, which means that the argument is present and non-scalar.  The next
    patch will allow inlining MINLOC/MAXLOC with DIM and MASK, and in that
    case the scalarization chain for MASK is initialized elsewhere, so the
    variable usually holding it in the function is not used, and the conditions
    won't work in that case.
    
    This change updates the conditions to check directly the properties of
    MASK so that they work even if the scalarization chain variable is not used.
    
    gcc/fortran/ChangeLog:
    
            * trans-intrinsic.cc (gfc_conv_intrinsic_minmaxloc): Use
            conditionals based on the MASK expression rather than on its
            scalarization chains.

Diff:
---
 gcc/fortran/trans-intrinsic.cc | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 81bcca5109cb..60e97ed4528f 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -5746,7 +5746,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * 
expr, enum tree_code op)
 
   gcc_assert (reduction_dimensions == ploop->dimen);
 
-  if (nonempty == NULL && maskss == NULL)
+  if (nonempty == NULL && !(maskexpr && maskexpr->rank > 0))
     {
       nonempty = logical_true_node;
 
@@ -5816,7 +5816,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * 
expr, enum tree_code op)
   gfc_start_scalarized_body (ploop, &body);
 
   /* If we have a mask, only check this element if the mask is set.  */
-  if (maskss)
+  if (maskexpr && maskexpr->rank > 0)
     {
       gcc_assert (!nested_loop);
       gfc_init_se (&maskse, NULL);
@@ -5921,7 +5921,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * 
expr, enum tree_code op)
     }
   gfc_add_expr_to_block (&block, ifbody);
 
-  if (maskss)
+  if (maskexpr && maskexpr->rank > 0)
     {
       /* We enclose the above in if (mask) {...}.  If the mask is an
         optional argument, generate IF (.NOT. PRESENT(MASK)
@@ -5972,7 +5972,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * 
expr, enum tree_code op)
       gfc_add_expr_to_block (outer_block, build1_v (LABEL_EXPR, lab1));
 
       /* If we have a mask, only check this element if the mask is set.  */
-      if (maskss)
+      if (maskexpr && maskexpr->rank > 0)
        {
          gfc_init_se (&maskse, NULL);
          gfc_copy_loopinfo_to_se (&maskse, &loop);
@@ -6038,7 +6038,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * 
expr, enum tree_code op)
 
       gfc_add_expr_to_block (&block, tmp);
 
-      if (maskss)
+      if (maskexpr && maskexpr->rank > 0)
        {
          /* We enclose the above in if (mask) {...}.  If the mask is
         an optional argument, generate IF (.NOT. PRESENT(MASK)
@@ -6063,7 +6063,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * 
expr, enum tree_code op)
     gfc_add_expr_to_block (&loop.pre, build1_v (LABEL_EXPR, lab2));
 
   /* For a scalar mask, enclose the loop in an if statement.  */
-  if (maskexpr && maskss == NULL)
+  if (maskexpr && maskexpr->rank == 0)
     {
       tree ifmask;

Reply via email to