From: Thomas Koenig Date: Tue, 1 Nov 2016 08:12:00 +0000 (+0000) Subject: backport: re PR fortran/71902 (Unneeded temporary on reallocatable character assignment) X-Git-Tag: releases/gcc-5.5.0~730 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=245dd1fc8032e369b2e1d237bdd9da4deea2bcd6;p=thirdparty%2Fgcc.git backport: re PR fortran/71902 (Unneeded temporary on reallocatable character assignment) 2016-10-31 Thomas Koenig Backport from trunk PR fortran/71902 * frontend-passes.c (realloc_string_callback): Also check for the lhs being deferred. Name temporary variable "realloc_string". 2016-10-31 Thomas Koenig Backport from trunk PR fortran/71902 * gfortran.dg/dependency_47.f90: New test. * gfortran.dg/dependency_49.f90: New test. From-SVN: r241732 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1f812f78c95d..0cb900e9e920 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016-11-01 Thomas Koenig + + Backport from trunk + PR fortran/71902 + * frontend-passes.c (realloc_string_callback): Also check for the + lhs being deferred. Name temporary variable "realloc_string". + 2016-10-24 Thomas Koenig Backport from trunk diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 38d7a100e749..c051cc09d0ae 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -144,19 +144,34 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees, gfc_expr *expr1, *expr2; gfc_code *co = *c; gfc_expr *n; + gfc_ref *ref; + bool found_substr; if (co->op != EXEC_ASSIGN) return 0; expr1 = co->expr1; if (expr1->ts.type != BT_CHARACTER || expr1->rank != 0 - || !expr1->symtree->n.sym->attr.allocatable) + || !gfc_expr_attr(expr1).allocatable + || !expr1->ts.deferred) return 0; expr2 = gfc_discard_nops (co->expr2); if (expr2->expr_type != EXPR_VARIABLE) return 0; + found_substr = false; + for (ref = expr2->ref; ref; ref = ref->next) + { + if (ref->type == REF_SUBSTRING) + { + found_substr = true; + break; + } + } + if (!found_substr) + return 0; + if (!gfc_check_dependency (expr1, expr2, true)) return 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cf77a64be9d9..e34697c2ad4f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-10-31 Thomas Koenig + + Backport from trunk + PR fortran/71902 + * gfortran.dg/dependency_47.f90: New test. + * gfortran.dg/dependency_49.f90: New test. + 2016-10-31 Jerry DeLisle Backport from trunk diff --git a/gcc/testsuite/gfortran.dg/dependency_47.f90 b/gcc/testsuite/gfortran.dg/dependency_47.f90 new file mode 100644 index 000000000000..4888771c1837 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_47.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! Make sure there is only one instance of a temporary variable here. +! { dg-options "-fdump-tree-original" } + +SUBROUTINE prtdata(ilen) + INTEGER :: ilen + character(len=ilen), allocatable :: cline(:) + allocate(cline(2)) + cline(1) = 'a' + cline(1)(2:3) = cline(1)(1:2) + cline(2) = cline(1) + print *,c +END SUBROUTINE prtdata +! { dg-final { scan-tree-dump-not "__var_" "original" } } diff --git a/gcc/testsuite/gfortran.dg/dependency_49.f90 b/gcc/testsuite/gfortran.dg/dependency_49.f90 new file mode 100644 index 000000000000..73d517e8f765 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_49.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! PR fortran/71902 - make sure that component references are followed +! for dependency analysis. +program main + type foo + character(len=:), allocatable :: x + end type foo + type(foo) :: a + a%x = 'asdf' + a%x = a%x(2:3) + print *,a%x +end program main +! { dg-final { scan-tree-dump-times "__var_1" 4 "original" } }