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
This commit is contained in:
Thomas Koenig 2010-09-03 21:21:14 +00:00
parent d158303227
commit 2bfec36876
2 changed files with 51 additions and 2 deletions

View File

@ -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

View File

@ -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" } }