diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 27a236b9243..59636dbc6c4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2007-02-08 Roger Sayle + + * 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 PR fortran/30611 diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index daf68db4246..db92c02d3d4 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce9a32015a1..8454452f303 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-02-08 Roger Sayle + + * gfortran.dg/forall_8.f90: New test case. + * gfortran.dg/forall_9.f90: Likewise. + 2007-02-07 Kaveh R. Ghazi * gcc.dg/builtins-20.c: Add some -~ complex cases. diff --git a/gcc/testsuite/gfortran.dg/forall_8.f90 b/gcc/testsuite/gfortran.dg/forall_8.f90 new file mode 100644 index 00000000000..b06f3028a0f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/forall_8.f90 @@ -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" } } diff --git a/gcc/testsuite/gfortran.dg/forall_9.f90 b/gcc/testsuite/gfortran.dg/forall_9.f90 new file mode 100644 index 00000000000..12084b16744 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/forall_9.f90 @@ -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" } }