Commit 90f58ec8 by Roger Sayle Committed by Roger Sayle

trans-stmt.c (gfc_trans_where_2): Avoid updating unused current execution mask…

trans-stmt.c (gfc_trans_where_2): Avoid updating unused current execution mask for empty WHERE/ELSEWHERE clauses.


	* trans-stmt.c (gfc_trans_where_2): Avoid updating unused current
	execution mask for empty WHERE/ELSEWHERE clauses.  Don't allocate
	temporary mask arrays if they won't be used.

From-SVN: r111303
parent c849c938
2006-02-20 Roger Sayle <roger@eyesopen.com> 2006-02-20 Roger Sayle <roger@eyesopen.com>
* trans-stmt.c (gfc_trans_where_2): Avoid updating unused current
execution mask for empty WHERE/ELSEWHERE clauses. Don't allocate
temporary mask arrays if they won't be used.
2006-02-20 Roger Sayle <roger@eyesopen.com>
* trans-stmt.c (gfc_trans_where_assign): Remove code to handle * trans-stmt.c (gfc_trans_where_assign): Remove code to handle
traversing a linked list of MASKs. The MASK is now always a traversing a linked list of MASKs. The MASK is now always a
single element requiring no ANDing during the assignment. single element requiring no ANDing during the assignment.
......
...@@ -2960,12 +2960,28 @@ gfc_trans_where_2 (gfc_code * code, tree mask, ...@@ -2960,12 +2960,28 @@ gfc_trans_where_2 (gfc_code * code, tree mask,
/* As the mask array can be very big, prefer compact boolean types. */ /* As the mask array can be very big, prefer compact boolean types. */
mask_type = gfc_get_logical_type (gfc_logical_kinds[0].kind); mask_type = gfc_get_logical_type (gfc_logical_kinds[0].kind);
/* Allocate temporary for where mask. */ /* Allocate temporary for WHERE mask. We only need a "cmask" if
cmask = allocate_temp_for_forall_nest_1 (mask_type, size, block, &pcmask); there are statements to be executed. The following test only
checks the first ELSEWHERE to catch the F90 cases. */
if (cblock->next
|| (cblock->block && cblock->block->next && cblock->block->expr)
|| (cblock->block && cblock->block->block))
{
cmask = allocate_temp_for_forall_nest_1 (mask_type, size, block,
&pcmask);
}
else
{
pcmask = NULL_TREE;
cmask = NULL_TREE;
}
if (cblock->block) /* Allocate temporary for !mask. We only need a "pmask" if there
is an ELSEWHERE clause containing executable statements. Again
we only lookahead a single ELSEWHERE to catch the F90 cases. */
if ((cblock->block && cblock->block->next)
|| (cblock->block && cblock->block->block))
{ {
/* Allocate temporary for !mask. */
pmask = allocate_temp_for_forall_nest_1 (mask_type, size, block, pmask = allocate_temp_for_forall_nest_1 (mask_type, size, block,
&ppmask); &ppmask);
} }
...@@ -2980,17 +2996,18 @@ gfc_trans_where_2 (gfc_code * code, tree mask, ...@@ -2980,17 +2996,18 @@ gfc_trans_where_2 (gfc_code * code, tree mask,
/* Has mask-expr. */ /* Has mask-expr. */
if (cblock->expr) if (cblock->expr)
{ {
/* If this is the last clause of the WHERE construct, then /* Ensure that the WHERE mask will be evaluated exactly once.
If there are no statements in this WHERE/ELSEWHERE clause,
then we don't need to update the control mask (cmask).
If this is the last clause of the WHERE construct, then
we don't need to update the pending control mask (pmask). */ we don't need to update the pending control mask (pmask). */
if (! cblock->block) gfc_evaluate_where_mask (cblock->expr, nested_forall_info, mask,
pmask = NULL_TREE; cblock->next ? cmask : NULL_TREE,
cblock->block ? pmask : NULL_TREE,
/* Ensure that the WHERE mask be evaluated only once. */ mask_type, block);
gfc_evaluate_where_mask (cblock->expr, nested_forall_info,
mask, cmask, pmask, mask_type, block);
} }
/* It's a elsewhere-stmt. No mask-expr is present. */ /* It's a final elsewhere-stmt. No mask-expr is present. */
else else
cmask = mask; cmask = mask;
......
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