Commit 89d65e2d by Mikael Morin

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
parent fafcf9e6
2011-11-04 Mikael Morin <mikael@gcc.gnu.org> 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 * trans-expr.c (gfc_conv_procedure_call): Handle temporaries for
arguments to elemental calls. arguments to elemental calls.
* trans-stmt.c (replace_ss): New function. * trans-stmt.c (replace_ss): New function.
......
...@@ -3090,6 +3090,14 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op) ...@@ -3090,6 +3090,14 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op)
TREE_USED (lab2) = 1; 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); gfc_mark_ss_chain_used (arrayss, 1);
if (maskss) if (maskss)
gfc_mark_ss_chain_used (maskss, 1); 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) ...@@ -3123,16 +3131,6 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op)
/* Assign the value to the limit... */ /* Assign the value to the limit... */
gfc_add_modify (&ifblock, limit, arrayse.expr); 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))) if (nonempty == NULL && HONOR_NANS (DECL_MODE (limit)))
{ {
stmtblock_t ifblock2; stmtblock_t ifblock2;
...@@ -3232,16 +3230,6 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op) ...@@ -3232,16 +3230,6 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op)
/* Assign the value to the limit... */ /* Assign the value to the limit... */
gfc_add_modify (&ifblock, limit, arrayse.expr); 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), tmp = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (pos),
loop.loopvar[0], offset); loop.loopvar[0], offset);
gfc_add_modify (&ifblock, pos, tmp); gfc_add_modify (&ifblock, pos, tmp);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment