aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2017-12-11 17:39:07 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2017-12-11 17:39:07 +0000
commit317fa0647833daa24c3b82333a75f64814cda8b5 (patch)
tree7ae25d60bf85259234a89fb1ea7e803126e883a0 /gcc/fortran
parentad3f54ab8e70aba72eb278d12d5e3c5d8b0de912 (diff)
downloadgcc-317fa0647833daa24c3b82333a75f64814cda8b5.zip
gcc-317fa0647833daa24c3b82333a75f64814cda8b5.tar.gz
gcc-317fa0647833daa24c3b82333a75f64814cda8b5.tar.bz2
re PR fortran/45689 ([F03] Missing transformational intrinsic in the trans_func_f2003 list)
2017-12-11 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/45689 * simplify.c (min_max_choose): Add prototype. (gfc_count): Format correctly. (simplify_transformation): Pass array argument to init_result_expr. (gfc_simplify_minval_maxval): Remove. (gfc_min): New function. (gfc_simplify_minval): Call simplify_transformation. (gfc_max): New function. (gfc_simplify_maxval): Call simplify_transformation. 2017-12-11 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/45689 * gfortran.dg/minval_parameter_1.f90: New test. * gfortran.dg/maxval_parameter_1.f90: New test. From-SVN: r255542
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/simplify.c72
2 files changed, 37 insertions, 47 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a668e12..7817b1e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,15 @@
+2017-12-11 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/45689
+ * simplify.c (min_max_choose): Add prototype.
+ (gfc_count): Format correctly.
+ (simplify_transformation): Pass array argument to init_result_expr.
+ (gfc_simplify_minval_maxval): Remove.
+ (gfc_min): New function.
+ (gfc_simplify_minval): Call simplify_transformation.
+ (gfc_max): New function.
+ (gfc_simplify_maxval): Call simplify_transformation.
+
2017-12-10 Dominique d'Humieres <dominiq@lps.ens.fr>
PR fortran/53478
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index f11ea42..7c3fefe 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -29,6 +29,9 @@ along with GCC; see the file COPYING3. If not see
#include "constructor.h"
#include "version.h" /* For version_string. */
+/* Prototypes. */
+
+static void min_max_choose (gfc_expr *, gfc_expr *, int);
gfc_expr gfc_bad_expr;
@@ -436,7 +439,8 @@ typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
Interface and implementation mimics arith functions as
gfc_add, gfc_multiply, etc. */
-static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
+static gfc_expr *
+gfc_count (gfc_expr *op1, gfc_expr *op2)
{
gfc_expr *result;
@@ -666,7 +670,7 @@ simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
result = transformational_result (array, dim, array->ts.type,
array->ts.kind, &array->where);
- init_result_expr (result, init_val, NULL);
+ init_result_expr (result, init_val, array);
return !dim || array->rank == 1 ?
simplify_transformation_to_scalar (result, array, mask, op) :
@@ -4539,67 +4543,41 @@ gfc_simplify_max (gfc_expr *e)
return simplify_min_max (e, 1);
}
-
-/* This is a simplified version of simplify_min_max to provide
- simplification of minval and maxval for a vector. */
+/* Helper function for gfc_simplify_minval. */
static gfc_expr *
-simplify_minval_maxval (gfc_expr *expr, int sign)
+gfc_min (gfc_expr *op1, gfc_expr *op2)
{
- gfc_constructor *c, *extremum;
- gfc_intrinsic_sym * specific;
-
- extremum = NULL;
- specific = expr->value.function.isym;
-
- for (c = gfc_constructor_first (expr->value.constructor);
- c; c = gfc_constructor_next (c))
- {
- if (c->expr->expr_type != EXPR_CONSTANT)
- return NULL;
-
- if (extremum == NULL)
- {
- extremum = c;
- continue;
- }
-
- min_max_choose (c->expr, extremum->expr, sign);
- }
-
- if (extremum == NULL)
- return NULL;
-
- /* Convert to the correct type and kind. */
- if (expr->ts.type != BT_UNKNOWN)
- return gfc_convert_constant (extremum->expr,
- expr->ts.type, expr->ts.kind);
-
- if (specific->ts.type != BT_UNKNOWN)
- return gfc_convert_constant (extremum->expr,
- specific->ts.type, specific->ts.kind);
-
- return gfc_copy_expr (extremum->expr);
+ min_max_choose (op1, op2, -1);
+ gfc_free_expr (op1);
+ return op2;
}
+/* Simplify minval for constant arrays. */
gfc_expr *
gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
{
- if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
- return NULL;
+ return simplify_transformation (array, dim, mask, INT_MAX, gfc_min);
+}
+
+/* Helper function for gfc_simplify_maxval. */
- return simplify_minval_maxval (array, -1);
+static gfc_expr *
+gfc_max (gfc_expr *op1, gfc_expr *op2)
+{
+ min_max_choose (op1, op2, 1);
+ gfc_free_expr (op1);
+ return op2;
}
+/* Simplify maxval for constant arrays. */
+
gfc_expr *
gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
{
- if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
- return NULL;
-
- return simplify_minval_maxval (array, 1);
+ return simplify_transformation (array, dim, mask, INT_MIN, gfc_max);
}