From patchwork Sat Jul 16 13:38:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Koenig X-Patchwork-Id: 649106 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rs9WY0pzZz9sR9 for ; Sat, 16 Jul 2016 23:38:46 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=VmA+YAI0; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=XkFJfc4few9f72Op/0q2ezKcLz6FJf8cNHS/O2EFAG/KUehqn2 W8ZPoXNJM31TOCQJ1gUc8t64sJ4ml4PENW6sgooGnWgp9gYV8I4uxZswKJXcosoc X2Mi47Gx+FP+gXHkRMh6jFthXiMECtsH39OO+P9XtlS30+Mg+rcujZRfA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=XitA/Zj6upUjQCcO0nIVnAAjbgk=; b=VmA+YAI0aAm0cLkYk2xF 8JJJnEQCaa2A+AxQ8WKCyr33EIzne0H8+tHrfUS6rSWqTEEDwfw10/hlmVxlr+37 mc0G/f435j3ZHAucY2U4j85oHMspJD2MDLUKoWT+FxxnOB/Mg9p0nDyw/Ac1dtLO KmkTgQdw2N/ffA0SD34zSe8= Received: (qmail 28189 invoked by alias); 16 Jul 2016 13:38:38 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 28156 invoked by uid 89); 16 Jul 2016 13:38:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=H*r:sk:tkoenig, Arbeitskopie, activated, arbeitskopie X-Spam-User: qpsmtpd, 2 recipients X-HELO: cc-smtpout3.netcologne.de Received: from cc-smtpout3.netcologne.de (HELO cc-smtpout3.netcologne.de) (89.1.8.213) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Sat, 16 Jul 2016 13:38:31 +0000 Received: from cc-smtpin1.netcologne.de (cc-smtpin1.netcologne.de [89.1.8.201]) by cc-smtpout3.netcologne.de (Postfix) with ESMTP id F383D12436; Sat, 16 Jul 2016 15:38:25 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by cc-smtpin1.netcologne.de (Postfix) with ESMTP id E5FEA11E11; Sat, 16 Jul 2016 15:38:25 +0200 (CEST) Received: from [78.35.135.126] (helo=cc-smtpin1.netcologne.de) by localhost with ESMTP (eXpurgate 4.1.8) (envelope-from ) id 578a38d1-25d7-7f0000012729-7f000001c9d5-1 for ; Sat, 16 Jul 2016 15:38:25 +0200 Received: from [192.168.178.20] (xdsl-78-35-135-126.netcologne.de [78.35.135.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by cc-smtpin1.netcologne.de (Postfix) with ESMTPSA; Sat, 16 Jul 2016 15:38:24 +0200 (CEST) To: "fortran@gcc.gnu.org" , gcc-patches From: Thomas Koenig Subject: [patch, Fortran] Fix some string temporaries Message-ID: <4d45b5da-5e28-7d1f-84ac-7aacbbc1733f@netcologne.de> Date: Sat, 16 Jul 2016 15:38:24 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2 MIME-Version: 1.0 Hello world, this fixes PR 71902. The recent fix for PR 71783 introduced a performance and code size regression a string temporary was created for the test case when it was not actually needed. I also took the opportunity of renaming the misnomed temporary variable. Regression-tested. OK for trunk? Do we actually want to backport this? Technically, it is a regression, but people are not likely to notice much. Regards Thomas 2016-07-16 Thomas Koenig PR fortran/71902 * dependency.c (gfc_check_dependency): Use dep_ref. Handle case if identical is true and two array element references differ. (gfc_dep_resovler): Move most of the code to dep_ref. (dep_ref): New function. * frontend-passes.c (realloc_string_callback): Name temporary variable "realloc_string". 2016-07-16 Thomas Koenig PR fortran/71902 * gfortran.dg/dependency_47.f90: New test. Index: dependency.c =================================================================== --- dependency.c (Revision 238223) +++ dependency.c (Arbeitskopie) @@ -54,6 +54,8 @@ enum gfc_dependency static gfc_dependency check_section_vs_section (gfc_array_ref *, gfc_array_ref *, int); +static gfc_dependency dep_ref (gfc_ref *, gfc_ref *, gfc_reverse *); + /* Returns 1 if the expr is an integer constant value 1, 0 if it is not or def if the value could not be determined. */ @@ -1316,14 +1318,34 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *e return 0; } - if (identical) - return 1; - /* Identical and disjoint ranges return 0, overlapping ranges return 1. */ if (expr1->ref && expr2->ref) - return gfc_dep_resolver (expr1->ref, expr2->ref, NULL); + { + gfc_dependency dep; + dep = dep_ref (expr1->ref, expr2->ref, NULL); + switch (dep) + { + case GFC_DEP_EQUAL: + return identical; + case GFC_DEP_FORWARD: + return 0; + + case GFC_DEP_BACKWARD: + return 1; + + case GFC_DEP_OVERLAP: + return 1; + + case GFC_DEP_NODEP: + return 0; + + case GFC_DEP_ERROR: + return 0; + } + } + return 1; case EXPR_FUNCTION: @@ -2052,11 +2074,44 @@ ref_same_as_full_array (gfc_ref *full_ref, gfc_ref 2 : array references are overlapping but reversal of one or more dimensions will clear the dependency. 1 : array references are overlapping. - 0 : array references are identical or not overlapping. */ + 0 : array references are identical or can be handled in a forward loop. */ int gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) { + enum gfc_dependency dep; + dep = dep_ref (lref, rref, reverse); + switch (dep) + { + case GFC_DEP_EQUAL: + return 0; + + case GFC_DEP_FORWARD: + return 0; + + case GFC_DEP_BACKWARD: + return 2; + + case GFC_DEP_OVERLAP: + return 1; + + case GFC_DEP_NODEP: + return 0; + + case GFC_DEP_ERROR: + return 0; + + default: + gcc_unreachable(); + } +} + +/* Compare two references, returning an enum gfc_dependency depending on the + "worst" type of dependency found. */ + +static gfc_dependency +dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) +{ int n; int m; gfc_dependency fin_dep; @@ -2079,21 +2134,21 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf /* The two ranges can't overlap if they are from different components. */ if (lref->u.c.component != rref->u.c.component) - return 0; + return GFC_DEP_NODEP; break; case REF_SUBSTRING: /* Substring overlaps are handled by the string assignment code if there is not an underlying dependency. */ - return (fin_dep == GFC_DEP_OVERLAP) ? 1 : 0; + return fin_dep; case REF_ARRAY: if (ref_same_as_full_array (lref, rref)) - return 0; + return GFC_DEP_EQUAL; if (ref_same_as_full_array (rref, lref)) - return 0; + return GFC_DEP_EQUAL; if (lref->u.ar.dimen != rref->u.ar.dimen) { @@ -2104,7 +2159,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf fin_dep = gfc_full_array_ref_p (lref, NULL) ? GFC_DEP_EQUAL : GFC_DEP_OVERLAP; else - return 1; + return GFC_DEP_OVERLAP; break; } @@ -2148,7 +2203,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf /* If any dimension doesn't overlap, we have no dependency. */ if (this_dep == GFC_DEP_NODEP) - return 0; + return GFC_DEP_NODEP; /* Now deal with the loop reversal logic: This only works on ranges and is activated by setting @@ -2215,7 +2270,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf /* Exactly matching and forward overlapping ranges don't cause a dependency. */ if (fin_dep < GFC_DEP_BACKWARD) - return 0; + return fin_dep; /* Keep checking. We only have a dependency if subsequent references also overlap. */ @@ -2233,7 +2288,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf /* Assume the worst if we nest to different depths. */ if (lref || rref) - return 1; + return GFC_DEP_OVERLAP; - return fin_dep == GFC_DEP_OVERLAP; + return fin_dep; } Index: frontend-passes.c =================================================================== --- frontend-passes.c (Revision 238223) +++ frontend-passes.c (Arbeitskopie) @@ -185,7 +185,7 @@ realloc_string_callback (gfc_code **c, int *walk_s current_code = c; inserted_block = NULL; changed_statement = NULL; - n = create_var (expr2, "trim"); + n = create_var (expr2, "realloc_string"); co->expr2 = n; return 0; }