Commit e35a0e64 by Roger Sayle Committed by Roger Sayle

trans-stmt.c (gfc_trans_forall_1): Optimize the cases where the mask expression…

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
parent f3062b0d
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
......
......@@ -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,9 +2564,21 @@ 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);
mask = allocate_temp_for_forall_nest (nested_forall_info, mask_type,
......@@ -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);
......
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.
! { 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" } }
! { 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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment