diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2010-09-03 21:21:14 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2010-09-03 21:21:14 +0000 |
commit | 2bfec3687642f933affbfadf580be47150925585 (patch) | |
tree | 580ce409671fc81be7bfde8ec05ed37ef541fa6f | |
parent | d158303227fdca143db5decf983978f635be2ba9 (diff) | |
download | gcc-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.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/trim_optimize_2.f90 | 37 |
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" } } |