aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2010-09-03 21:21:14 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2010-09-03 21:21:14 +0000
commit2bfec3687642f933affbfadf580be47150925585 (patch)
tree580ce409671fc81be7bfde8ec05ed37ef541fa6f
parentd158303227fdca143db5decf983978f635be2ba9 (diff)
downloadgcc-2bfec3687642f933affbfadf580be47150925585.zip
gcc-2bfec3687642f933affbfadf580be47150925585.tar.gz
gcc-2bfec3687642f933affbfadf580be47150925585.tar.bz2
dump_parse_tree (gfc_run_passes): Call optimize_namespace instead of optimize_code.
2010-09-03 Thomas Koenig <tkoenig@gcc.gnu.org> * dump_parse_tree (gfc_run_passes): Call optimize_namespace instead of optimize_code. (optimize_namespace): New function. 2010-09-03 Thomas Koenig <tkoenig@gcc.gnu.org> * gfortran.dg/trim_optimize_2.f90: New test. From-SVN: r163846
-rw-r--r--gcc/fortran/frontend-passes.c16
-rw-r--r--gcc/testsuite/gfortran.dg/trim_optimize_2.f9037
2 files changed, 51 insertions, 2 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index 27ff0fe..14c5fe4 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see
/* Forward declarations. */
static void strip_function_call (gfc_expr *);
+static void optimize_namespace (gfc_namespace *);
static void optimize_assignment (gfc_code *);
static void optimize_expr_0 (gfc_expr *);
static bool optimize_expr (gfc_expr *);
@@ -41,10 +42,21 @@ static void optimize_actual_arglist (gfc_actual_arglist *);
optimization pass is run. */
void
-gfc_run_passes (gfc_namespace * ns)
+gfc_run_passes (gfc_namespace *ns)
{
if (optimize)
- optimize_code (ns->code);
+ optimize_namespace (ns);
+}
+
+/* Optimize a namespace, including all contained namespaces. */
+
+static void
+optimize_namespace (gfc_namespace *ns)
+{
+ optimize_code (ns->code);
+
+ for (ns = ns->contained; ns; ns = ns->sibling)
+ optimize_namespace (ns);
}
static void
diff --git a/gcc/testsuite/gfortran.dg/trim_optimize_2.f90 b/gcc/testsuite/gfortran.dg/trim_optimize_2.f90
new file mode 100644
index 0000000..b7ae1e3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/trim_optimize_2.f90
@@ -0,0 +1,37 @@
+! { dg-do run }
+! { dg-options "-O -fdump-tree-original" }
+! Optimize unnecessary TRIMs in contained namespaces too.
+module faz
+ implicit none
+contains
+ subroutine bar
+ character(len=3) :: a
+ character(len=4) :: b,c
+ b = 'abcd'
+ a = trim(b)
+ c = trim(trim(a))
+ if (a /= 'abc') call abort
+ if (c /= 'abc') call abort
+ end subroutine bar
+end module faz
+
+program main
+ use faz
+ implicit none
+ call foo
+ call bar
+contains
+ subroutine foo
+ character(len=3) :: a
+ character(len=4) :: b,c
+ b = 'abcd'
+ a = trim(b)
+ c = trim(trim(a))
+ if (a /= 'abc') call abort
+ if (c /= 'abc') call abort
+ end subroutine foo
+end program main
+
+! { dg-final { scan-tree-dump-times "memmove" 4 "original" } }
+! { dg-final { scan-tree-dump-times "string_trim" 0 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }