Patchwork [fortran] Optimize assignment of empty strings

login
register
mail settings
Submitter Thomas Koenig
Date June 6, 2012, 9:30 p.m.
Message ID <4FCFCBF7.2050805@netcologne.de>
Download mbox | patch
Permalink /patch/163431/
State New
Headers show

Comments

Thomas Koenig - June 6, 2012, 9:30 p.m.
Hello world,

this rather simple patch makes sure that only memset is used for
assigning empty strings when front-end optimization is used.

Regression-tested.  OK for trunk?

	Thomas

2012-06-06  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-06  Thomas König  <tkoenig@gcc.gnu.org>

         PR fortran/52861
         * gfortran.dg/string_assign_1.f90:  New test case.
Tobias Burnus - June 7, 2012, 8:53 a.m.
Thomas Koenig wrote:
> his rather simple patch makes sure that only memset is used for
> assigning empty strings when front-end optimization is used.
>
> Regression-tested.  OK for trunk?

OK, thanks for the quick patch.

Tobias

>
> 2012-06-06  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-06  Thomas König <tkoenig@gcc.gnu.org>
>
>         PR fortran/52861
>         * gfortran.dg/string_assign_1.f90:  New test case.

Patch

Index: frontend-passes.c
===================================================================
--- frontend-passes.c	(Revision 188138)
+++ frontend-passes.c	(Arbeitskopie)
@@ -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_i
 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,11 +735,16 @@  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);
 }