aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/trans-stmt.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/forall_8.f909
-rw-r--r--gcc/testsuite/gfortran.dg/forall_9.f909
5 files changed, 49 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 27a236b..59636db 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ce9a320..8454452 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gfortran.dg/forall_8.f90 b/gcc/testsuite/gfortran.dg/forall_8.f90
new file mode 100644
index 0000000..b06f302
--- /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 0000000..12084b1
--- /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" } }