diff mbox series

[v2,04/10] fortran: Remove MINLOC/MAXLOC frontend optimization

Message ID 20240816102227.189290-5-morin-mikael@orange.fr
State New
Headers show
Series fortran: Inline MINLOC/MAXLOC without DIM argument [PR90608] | expand

Commit Message

Mikael Morin Aug. 16, 2024, 10:22 a.m. UTC
From: Mikael Morin <mikael@gcc.gnu.org>

This patch is new in the V2 series.

Regression-tested on x86_64-pc-linux-gnu.
OK for master?

-- >8 --

Remove the frontend pass rewriting calls of MINLOC/MAXLOC without DIM to
calls with one-valued DIM enclosed in an array constructor.  This
transformation was circumventing the limitation of inline MINLOC/MAXLOC code
generation to scalar cases only, allowing inline code to be generated if
ARRAY had rank 1 and DIM was absent.  As MINLOC/MAXLOC has gained support of
inline code generation in that case, the limitation is no longer effective,
and the transformation no longer necessary.

gcc/fortran/ChangeLog:

	* frontend-passes.cc (optimize_minmaxloc): Remove.
	(optimize_expr): Remove dispatch to optimize_minmaxloc.
---
 gcc/fortran/frontend-passes.cc | 57 ----------------------------------
 1 file changed, 57 deletions(-)
diff mbox series

Patch

diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc
index 8e4c6310ba8..31d553e9844 100644
--- a/gcc/fortran/frontend-passes.cc
+++ b/gcc/fortran/frontend-passes.cc
@@ -36,7 +36,6 @@  static bool optimize_op (gfc_expr *);
 static bool optimize_comparison (gfc_expr *, gfc_intrinsic_op);
 static bool optimize_trim (gfc_expr *);
 static bool optimize_lexical_comparison (gfc_expr *);
-static void optimize_minmaxloc (gfc_expr **);
 static bool is_empty_string (gfc_expr *e);
 static void doloop_warn (gfc_namespace *);
 static int do_intent (gfc_expr **);
@@ -356,17 +355,6 @@  optimize_expr (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
   if ((*e)->expr_type == EXPR_OP && optimize_op (*e))
     gfc_simplify_expr (*e, 0);
 
-  if ((*e)->expr_type == EXPR_FUNCTION && (*e)->value.function.isym)
-    switch ((*e)->value.function.isym->id)
-      {
-      case GFC_ISYM_MINLOC:
-      case GFC_ISYM_MAXLOC:
-	optimize_minmaxloc (e);
-	break;
-      default:
-	break;
-      }
-
   if (function_expr)
     count_arglist --;
 
@@ -2262,51 +2250,6 @@  optimize_trim (gfc_expr *e)
   return true;
 }
 
-/* Optimize minloc(b), where b is rank 1 array, into
-   (/ minloc(b, dim=1) /), and similarly for maxloc,
-   as the latter forms are expanded inline.  */
-
-static void
-optimize_minmaxloc (gfc_expr **e)
-{
-  gfc_expr *fn = *e;
-  gfc_actual_arglist *a;
-  char *name, *p;
-
-  if (fn->rank != 1
-      || fn->value.function.actual == NULL
-      || fn->value.function.actual->expr == NULL
-      || fn->value.function.actual->expr->ts.type == BT_CHARACTER
-      || fn->value.function.actual->expr->rank != 1
-      || gfc_inline_intrinsic_function_p (fn))
-    return;
-
-  *e = gfc_get_array_expr (fn->ts.type, fn->ts.kind, &fn->where);
-  (*e)->shape = fn->shape;
-  fn->rank = 0;
-  fn->shape = NULL;
-  gfc_constructor_append_expr (&(*e)->value.constructor, fn, &fn->where);
-
-  name = XALLOCAVEC (char, strlen (fn->value.function.name) + 1);
-  strcpy (name, fn->value.function.name);
-  p = strstr (name, "loc0");
-  p[3] = '1';
-  fn->value.function.name = gfc_get_string ("%s", name);
-  if (fn->value.function.actual->next)
-    {
-      a = fn->value.function.actual->next;
-      gcc_assert (a->expr == NULL);
-    }
-  else
-    {
-      a = gfc_get_actual_arglist ();
-      fn->value.function.actual->next = a;
-    }
-  a->expr = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
-				   &fn->where);
-  mpz_set_ui (a->expr->value.integer, 1);
-}
-
 /* Data package to hand down for DO loop checks in a contained
    procedure.  */
 typedef struct contained_info