From: sayle Date: Mon, 20 Feb 2006 14:22:33 +0000 (+0000) Subject: * trans-stmt.c (gfc_trans_where_2): Avoid updating unused current X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=c5cf6b687438ac86a103d0ddc85b8260a3681a1a * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111303 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 885cdee39f0..b54c9df3392 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,11 @@ 2006-02-20 Roger Sayle + * 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 + * trans-stmt.c (gfc_trans_where_assign): Remove code to handle traversing a linked list of MASKs. The MASK is now always a single element requiring no ANDing during the assignment. diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 2ee881a1652..14a2a23e4f9 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -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); + /* 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; + } - 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, &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;