mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 21:41:14 +08:00
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
This commit is contained in:
parent
c849c938da
commit
90f58ec8ed
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
@ -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. */
|
||||
mask_type = gfc_get_logical_type (gfc_logical_kinds[0].kind);
|
||||
|
||||
/* Allocate temporary for where mask. */
|
||||
cmask = allocate_temp_for_forall_nest_1 (mask_type, size, block, &pcmask);
|
||||
|
||||
if (cblock->block)
|
||||
/* Allocate temporary for WHERE mask. We only need a "cmask" if
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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,
|
||||
&ppmask);
|
||||
}
|
||||
@ -2980,17 +2996,18 @@ gfc_trans_where_2 (gfc_code * code, tree mask,
|
||||
/* Has mask-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). */
|
||||
if (! cblock->block)
|
||||
pmask = NULL_TREE;
|
||||
|
||||
/* Ensure that the WHERE mask be evaluated only once. */
|
||||
gfc_evaluate_where_mask (cblock->expr, nested_forall_info,
|
||||
mask, cmask, pmask, mask_type, block);
|
||||
gfc_evaluate_where_mask (cblock->expr, nested_forall_info, mask,
|
||||
cblock->next ? cmask : NULL_TREE,
|
||||
cblock->block ? pmask : NULL_TREE,
|
||||
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
|
||||
cmask = mask;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user