2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jun 2012 11:11:55 +0000 (11:11 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jun 2012 11:11:55 +0000 (11:11 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188300 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/frontend-passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/string_assign_1.f90 [new file with mode: 0644]

index b3342ab..c882a41 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        PR fortran/50619
index 40ca074..4fd24c2 100644 (file)
@@ -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);
index 2ba217f..5819c00 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        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 (file)
index 0000000..8a520ff
--- /dev/null
@@ -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" } }