+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
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. */
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);
/* 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.
--- /dev/null
+! { 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" } }
--- /dev/null
+! { 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" } }