diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2009-01-04 11:05:42 -0500 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2009-01-04 11:05:42 -0500 |
commit | 8f2b565d54b4bbf8e1a8e70f1e9bcf660e1cdc5d (patch) | |
tree | a37f556324cdc52a56eec35e04b25d6e91d8d39b /gcc/fortran | |
parent | fea0568fd39fa2582802b29ae3f770cd1b1f70df (diff) | |
download | gcc-8f2b565d54b4bbf8e1a8e70f1e9bcf660e1cdc5d.zip gcc-8f2b565d54b4bbf8e1a8e70f1e9bcf660e1cdc5d.tar.gz gcc-8f2b565d54b4bbf8e1a8e70f1e9bcf660e1cdc5d.tar.bz2 |
re PR fortran/38718 (some simplifiers for elemental intrinsics missing; required for init expressions)
gcc/fortran:
2009-01-04 Daniel Franke <franke.daniel@gmail.com>
PR fortran/38718
* simplify.c (gfc_simplify_merge): New.
* intrinsic.h (gfc_simplify_merge): New prototype.
* intrinsic.c (add_functions): Added simplification for MERGE.
gcc/testsuite:
2009-01-04 Daniel Franke <franke.daniel@gmail.com>
PR fortran/38718
* gfortran.dg/merge_init_expr.f90: New.
From-SVN: r143053
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.c | 2 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.h | 1 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 12 |
4 files changed, 21 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e3c652c..c8b88c5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2009-01-04 Daniel Franke <franke.daniel@gmail.com> + + PR fortran/38718 + * simplify.c (gfc_simplify_merge): New. + * intrinsic.h (gfc_simplify_merge): New prototype. + * intrinsic.c (add_functions): Added simplification for MERGE. + 2009-01-04 Mikael Morin <mikael.morin@tele2.fr> PR fortran/38536 diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index f5bfcf9..489f95b 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -1974,7 +1974,7 @@ add_functions (void) make_generic ("mclock8", GFC_ISYM_MCLOCK8, GFC_STD_GNU); add_sym_3 ("merge", GFC_ISYM_MERGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95, - gfc_check_merge, NULL, gfc_resolve_merge, + gfc_check_merge, gfc_simplify_merge, gfc_resolve_merge, ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED); diff --git a/gcc/fortran/intrinsic.h b/gcc/fortran/intrinsic.h index 0e0bd3a..69aadf6 100644 --- a/gcc/fortran/intrinsic.h +++ b/gcc/fortran/intrinsic.h @@ -270,6 +270,7 @@ gfc_expr *gfc_simplify_llt (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_log (gfc_expr *); gfc_expr *gfc_simplify_log10 (gfc_expr *); gfc_expr *gfc_simplify_logical (gfc_expr *, gfc_expr *); +gfc_expr *gfc_simplify_merge (gfc_expr *, gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_min (gfc_expr *); gfc_expr *gfc_simplify_minval (gfc_expr *, gfc_expr*, gfc_expr*); gfc_expr *gfc_simplify_max (gfc_expr *); diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 6904960..665d1e3d 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -2619,6 +2619,18 @@ gfc_simplify_logical (gfc_expr *e, gfc_expr *k) } +gfc_expr * +gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask) +{ + if (tsource->expr_type != EXPR_CONSTANT + || fsource->expr_type != EXPR_CONSTANT + || mask->expr_type != EXPR_CONSTANT) + return NULL; + + return gfc_copy_expr (mask->value.logical ? tsource : fsource); +} + + /* Selects bewteen current value and extremum for simplify_min_max and simplify_minval_maxval. */ static void |