diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2017-12-11 17:39:07 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2017-12-11 17:39:07 +0000 |
commit | 317fa0647833daa24c3b82333a75f64814cda8b5 (patch) | |
tree | 7ae25d60bf85259234a89fb1ea7e803126e883a0 /gcc/fortran | |
parent | ad3f54ab8e70aba72eb278d12d5e3c5d8b0de912 (diff) | |
download | gcc-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/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 72 |
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); } |