From 90f58ec8ed9cbf26dce58c867e204afd19298509 Mon Sep 17 00:00:00 2001
From: Roger Sayle <roger@eyesopen.com>
Date: Mon, 20 Feb 2006 14:22:33 +0000
Subject: [PATCH] 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
---
 gcc/fortran/ChangeLog    |  6 ++++++
 gcc/fortran/trans-stmt.c | 41 ++++++++++++++++++++++++++++------------
 2 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 885cdee39f00..b54c9df33921 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 2ee881a16528..14a2a23e4f9c 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;
 
-- 
GitLab