From af87b36a63faa205fc1a2f4b7072ba16b9a4898f Mon Sep 17 00:00:00 2001 From: tkoenig Date: Thu, 7 Jun 2012 11:11:55 +0000 Subject: [PATCH] =?utf8?q?2012-06-07=20=20Thomas=20K=C3=B6nig=20=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit PR fortran/52861 * frontend-passes (empty_string): Add prototype. (optimize_assignment): Set the length of an empty string constant to zero. 2012-06-07 Thomas König PR fortran/52861 * gfortran.dg/string_assign_1.f90: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188300 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/frontend-passes.c | 14 ++++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/string_assign_1.f90 | 11 +++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/string_assign_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b3342ab..c882a41 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2012-06-07 Thomas König + + PR fortran/52861 + * frontend-passes (empty_string): Add prototype. + (optimize_assignment): Set the length of an empty string + constant to zero. + 2012-06-04 Tobias Burnus PR fortran/50619 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 40ca074..4fd24c2 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -1,5 +1,5 @@ /* Pass manager for Fortran front end. - Copyright (C) 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. Contributed by Thomas König. This file is part of GCC. @@ -37,6 +37,7 @@ static bool optimize_comparison (gfc_expr *, gfc_intrinsic_op); static bool optimize_trim (gfc_expr *); static bool optimize_lexical_comparison (gfc_expr *); static void optimize_minmaxloc (gfc_expr **); +static bool empty_string (gfc_expr *e); /* How deep we are inside an argument list. */ @@ -734,10 +735,15 @@ optimize_assignment (gfc_code * c) lhs = c->expr1; rhs = c->expr2; - /* Optimize away a = trim(b), where a is a character variable. */ - if (lhs->ts.type == BT_CHARACTER) - remove_trim (rhs); + { + /* Optimize away a = trim(b), where a is a character variable. */ + remove_trim (rhs); + + /* Replace a = ' ' by a = '' to optimize away a memcpy. */ + if (empty_string(rhs)) + rhs->value.character.length = 0; + } if (lhs->rank > 0 && gfc_check_dependency (lhs, rhs, true) == 0) optimize_binop_array_assignment (c, &rhs, false); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ba217f..5819c00 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-06-07 Thomas König + + PR fortran/52861 + * gfortran.dg/string_assign_1.f90: New test case. + 2012-06-07 Jakub Jelinek PR middle-end/53580 diff --git a/gcc/testsuite/gfortran.dg/string_assign_1.f90 b/gcc/testsuite/gfortran.dg/string_assign_1.f90 new file mode 100644 index 0000000..8a520ff --- /dev/null +++ b/gcc/testsuite/gfortran.dg/string_assign_1.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! { dg-options "-ffrontend-optimize -fdump-tree-original" } +! PR 52861 - optimize this to c = '' so that there is +! no memcpy in the generated code. +program main + character (len=20) :: c + c = ' ' + print *,c +end program main +! { dg-final { scan-tree-dump-times "memcpy" 0 "original" } } +! { dg-final { cleanup-tree-dump "original" } } -- 2.7.4