aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2012-06-07 14:33:51 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2012-06-07 14:33:51 +0000
commit1acbf7a1bfb1bddb24ea3fc3710f0ddbb097aa72 (patch)
treeac735e58e700b48825a6f46d36538fddc78a11b0
parent17c4f786f5e5933b39604bf3ed13368b89d76edc (diff)
downloadgcc-1acbf7a1bfb1bddb24ea3fc3710f0ddbb097aa72.zip
gcc-1acbf7a1bfb1bddb24ea3fc3710f0ddbb097aa72.tar.gz
gcc-1acbf7a1bfb1bddb24ea3fc3710f0ddbb097aa72.tar.bz2
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.c (optimize_assignment): Don't set the length of an empty string for deferred-length character variables. 2012-06-07 Thomas König <tkoenig@gcc.gnu.org> PR fortran/52861 * gfortran.dg/string_assign_2.f90: New test case. From-SVN: r188305
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/frontend-passes.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/string_assign_2.f909
4 files changed, 26 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c882a41..e51d507 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,7 +1,14 @@
2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/52861
- * frontend-passes (empty_string): Add prototype.
+ * frontend-passes.c (optimize_assignment): Don't set the
+ length of an empty string for deferred-length character
+ variables.
+
+2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
+
+ PR fortran/52861
+ * frontend-passes.c (empty_string): Add prototype.
(optimize_assignment): Set the length of an empty string
constant to zero.
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index 4fd24c2..bcc1bdc 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -740,8 +740,10 @@ optimize_assignment (gfc_code * c)
/* 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))
+ /* Replace a = ' ' by a = '' to optimize away a memcpy, but only
+ for strings with non-deferred length (otherwise we would
+ reallocate the length. */
+ if (empty_string(rhs) && ! lhs->ts.deferred)
rhs->value.character.length = 0;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5819c00..776012c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,11 @@
2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/52861
+ * gfortran.dg/string_assign_2.f90: New test case.
+
+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>
diff --git a/gcc/testsuite/gfortran.dg/string_assign_2.f90 b/gcc/testsuite/gfortran.dg/string_assign_2.f90
new file mode 100644
index 0000000..f3cfa45
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/string_assign_2.f90
@@ -0,0 +1,9 @@
+! { dg-do run }
+! { dg-options "-ffrontend-optimize" }
+program main
+ character (len=:), allocatable :: a
+ a = 'a'
+ if (len(a) /= 1) call abort
+ a = ' '
+ if (len(a) /= 2) call abort
+end program main