OSDN Git Service

* trans-stmt.c (gfc_trans_where_2): Avoid updating unused current
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Feb 2006 14:22:33 +0000 (14:22 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Feb 2006 14:22:33 +0000 (14:22 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-stmt.c

index 885cdee..b54c9df 100644 (file)
@@ -1,5 +1,11 @@
 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
        traversing a linked list of MASKs.  The MASK is now always a
        single element requiring no ANDing during the assignment.
index 2ee881a..14a2a23 100644 (file)
@@ -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;