aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-stmt.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2007-02-08 16:41:18 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2007-02-08 16:41:18 +0000
commite35a0e6476c15c34df002f698dbfbbcc44338238 (patch)
tree75e0d7456cf8fa5760ed4e45b9344dabaa89e88e /gcc/fortran/trans-stmt.c
parentf3062b0d1f9cc6f8fdf31fc9e00617e1319d20fa (diff)
downloadgcc-e35a0e6476c15c34df002f698dbfbbcc44338238.zip
gcc-e35a0e6476c15c34df002f698dbfbbcc44338238.tar.gz
gcc-e35a0e6476c15c34df002f698dbfbbcc44338238.tar.bz2
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
Diffstat (limited to 'gcc/fortran/trans-stmt.c')
-rw-r--r--gcc/fortran/trans-stmt.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index daf68db..db92c02 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,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);