trans-stmt.c (gfc_trans_forall_1): Optimize the cases where the mask expression is a compile-time constant...

* trans-stmt.c (gfc_trans_forall_1): Optimize the cases where the
	mask expression is a compile-time constant (".true." or ".false.").

	* gfortran.dg/forall_8.f90: New test case.
	* gfortran.dg/forall_9.f90: Likewise.

From-SVN: r121714
This commit is contained in:
Roger Sayle 2007-02-08 16:41:18 +00:00 committed by Roger Sayle
parent f3062b0d1f
commit e35a0e6476
5 changed files with 49 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2007-02-08 Roger Sayle <roger@eyesopen.com>
* trans-stmt.c (gfc_trans_forall_1): Optimize the cases where the
mask expression is a compile-time constant (".true." or ".false.").
2007-02-04 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/30611

View File

@ -2458,6 +2458,13 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info)
gfc_saved_var *saved_vars;
iter_info *this_forall;
forall_info *info;
bool need_mask;
/* Do nothing if the mask is false. */
if (code->expr
&& code->expr->expr_type == EXPR_CONSTANT
&& !code->expr->value.logical)
return build_empty_stmt ();
n = 0;
/* Count the FORALL index number. */
@ -2557,8 +2564,20 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info)
info->nvar = nvar;
info->size = size;
/* First we need to allocate the mask. */
if (code->expr)
{
/* If the mask is .true., consider the FORALL unconditional. */
if (code->expr->expr_type == EXPR_CONSTANT
&& code->expr->value.logical)
need_mask = false;
else
need_mask = true;
}
else
need_mask = false;
/* First we need to allocate the mask. */
if (need_mask)
{
/* As the mask array can be very big, prefer compact boolean types. */
tree mask_type = gfc_get_logical_type (gfc_logical_kinds[0].kind);
@ -2583,7 +2602,7 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info)
/* Copy the mask into a temporary variable if required.
For now we assume a mask temporary is needed. */
if (code->expr)
if (need_mask)
{
/* As the mask array can be very big, prefer compact boolean types. */
tree mask_type = gfc_get_logical_type (gfc_logical_kinds[0].kind);

View File

@ -1,3 +1,8 @@
2007-02-08 Roger Sayle <roger@eyesopen.com>
* gfortran.dg/forall_8.f90: New test case.
* gfortran.dg/forall_9.f90: Likewise.
2007-02-07 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/builtins-20.c: Add some -~ complex cases.

View File

@ -0,0 +1,9 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
integer a(100)
forall (i=1:100,.true.)
a(i) = 0
end forall
end
! { dg-final { scan-tree-dump-times "temp" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }

View File

@ -0,0 +1,9 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
integer a(100)
forall (i=1:100,.false.)
a(i) = 0
end forall
end
! { dg-final { scan-tree-dump-times "temp" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }