Commit 94d145bf by Thomas Koenig

re PR fortran/52861 ((missed optimisation) missed transformation to memset with -O3)

2012-06-07  Thomas König  <tkoenig@gcc.gnu.org>

	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  <tkoenig@gcc.gnu.org>

	PR fortran/52861
	* gfortran.dg/string_assign_1.f90:  New test case.

From-SVN: r188300
parent d8a5e488
2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
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 <burnus@net-b.de> 2012-06-04 Tobias Burnus <burnus@net-b.de>
PR fortran/50619 PR fortran/50619
......
/* Pass manager for Fortran front end. /* 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. Contributed by Thomas König.
This file is part of GCC. This file is part of GCC.
...@@ -37,6 +37,7 @@ static bool optimize_comparison (gfc_expr *, gfc_intrinsic_op); ...@@ -37,6 +37,7 @@ static bool optimize_comparison (gfc_expr *, gfc_intrinsic_op);
static bool optimize_trim (gfc_expr *); static bool optimize_trim (gfc_expr *);
static bool optimize_lexical_comparison (gfc_expr *); static bool optimize_lexical_comparison (gfc_expr *);
static void optimize_minmaxloc (gfc_expr **); static void optimize_minmaxloc (gfc_expr **);
static bool empty_string (gfc_expr *e);
/* How deep we are inside an argument list. */ /* How deep we are inside an argument list. */
...@@ -734,10 +735,15 @@ optimize_assignment (gfc_code * c) ...@@ -734,10 +735,15 @@ optimize_assignment (gfc_code * c)
lhs = c->expr1; lhs = c->expr1;
rhs = c->expr2; rhs = c->expr2;
/* Optimize away a = trim(b), where a is a character variable. */
if (lhs->ts.type == BT_CHARACTER) 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) if (lhs->rank > 0 && gfc_check_dependency (lhs, rhs, true) == 0)
optimize_binop_array_assignment (c, &rhs, false); optimize_binop_array_assignment (c, &rhs, false);
......
2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/52861
* gfortran.dg/string_assign_1.f90: New test case.
2012-06-07 Jakub Jelinek <jakub@redhat.com> 2012-06-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/53580 PR middle-end/53580
......
! { 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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment