diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2011-11-04 00:05:51 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2011-11-04 00:05:51 +0000 |
commit | 89d65e2d2f2d5d2aa3e2e4c02f4ad5b80e241c46 (patch) | |
tree | ada356a6255e3327556733b0a19098ecf2b94162 /gcc/fortran | |
parent | fafcf9e64bf502ca628d43f1531e7c39352fb9d0 (diff) | |
download | gcc-89d65e2d2f2d5d2aa3e2e4c02f4ad5b80e241c46.tar.gz |
trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Don't calculate offset twice in generated code.
* trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Don't calculate
offset twice in generated code.
From-SVN: r180907
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 28 |
2 files changed, 13 insertions, 20 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0cebe5fee67..07eff72a87d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,10 @@ 2011-11-04 Mikael Morin <mikael@gcc.gnu.org> + * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Don't calculate + offset twice in generated code. + +2011-11-04 Mikael Morin <mikael@gcc.gnu.org> + * trans-expr.c (gfc_conv_procedure_call): Handle temporaries for arguments to elemental calls. * trans-stmt.c (replace_ss): New function. diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index c3a414b789b..ee162eac6e5 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -3090,6 +3090,14 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op) TREE_USED (lab2) = 1; } + /* An offset must be added to the loop + counter to obtain the required position. */ + gcc_assert (loop.from[0]); + + tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, + gfc_index_one_node, loop.from[0]); + gfc_add_modify (&loop.pre, offset, tmp); + gfc_mark_ss_chain_used (arrayss, 1); if (maskss) gfc_mark_ss_chain_used (maskss, 1); @@ -3123,16 +3131,6 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op) /* Assign the value to the limit... */ gfc_add_modify (&ifblock, limit, arrayse.expr); - /* Remember where we are. An offset must be added to the loop - counter to obtain the required position. */ - if (loop.from[0]) - tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, - gfc_index_one_node, loop.from[0]); - else - tmp = gfc_index_one_node; - - gfc_add_modify (&block, offset, tmp); - if (nonempty == NULL && HONOR_NANS (DECL_MODE (limit))) { stmtblock_t ifblock2; @@ -3232,16 +3230,6 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op) /* Assign the value to the limit... */ gfc_add_modify (&ifblock, limit, arrayse.expr); - /* Remember where we are. An offset must be added to the loop - counter to obtain the required position. */ - if (loop.from[0]) - tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, - gfc_index_one_node, loop.from[0]); - else - tmp = gfc_index_one_node; - - gfc_add_modify (&block, offset, tmp); - tmp = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (pos), loop.loopvar[0], offset); gfc_add_modify (&ifblock, pos, tmp); |