From patchwork Thu Jul 28 11:28:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Renlin Li X-Patchwork-Id: 653680 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 3s0V3c1Z1Sz9t1J for ; Thu, 28 Jul 2016 21:28:28 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=pnc35DXV; 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:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=X3IQgbLswNmfxxSd1Gy9WqzJVsDy7EfQIX+aI6gmzV8cR2iO1i rEqmCmVkOtym4Cd6up5dqNJIcDyzrf9aShOtrSHQa/ZbGdMw+83YEfvzx0owpvfl 7PTT24WRemLjvly6V/Ocj+JjCzFGAUSWaBHOjUKCSMK97xL2fywo0Lndc= 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:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=H9Xa3GDRn0HSDkWH09eRvkg3G+g=; b=pnc35DXVYCc++k2seAnU eNhV0vHBvSs73QOnW39BFbYto/TrxSmowaQBiiSwJdiKbngsyuq1ovNC0+3kIhY1 mtRFaMO4GEiohneMgDDRYyqdfvCDJgQNgfD4Z72cwPDufo+017jST+Iyv4OAse2v /Qfb2YB+EjnIvKgvyBii8Zs= Received: (qmail 71476 invoked by alias); 28 Jul 2016 11:28:20 -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 71439 invoked by uid 89); 28 Jul 2016 11:28:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=BAYES_05, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=HTo:U*tkoenig, gfc_expr, cline, expr2 X-Spam-User: qpsmtpd, 3 recipients X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 28 Jul 2016 11:28:09 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BF99F28; Thu, 28 Jul 2016 04:29:24 -0700 (PDT) Received: from [10.2.207.43] (e104453-lin.cambridge.arm.com [10.2.207.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C53E03F215; Thu, 28 Jul 2016 04:28:06 -0700 (PDT) To: "gcc-patches@gcc.gnu.org" , tkoenig@gcc.gnu.org Cc: hjl.tools@gmail.com, pthaugen@gcc.gnu.org, Joost.VandeVondele@mat.ethz.ch From: Renlin Li Subject: [PATCH][COMMITTED] Revert r238497 because of PR 71961. Message-ID: <5799EC45.2030901@foss.arm.com> Date: Thu, 28 Jul 2016 12:28:05 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 X-IsSubscribed: yes Hi all, This patch reverts the change for PR 71902 since it causes 178.gagel miscompile in spec2000 as reported in PR 71961 which was observed in x86_64, aarch64, powerpc64. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71961 As a consequence, I will reopen PR 71902: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71902 Regards, Renlin Li gcc/fortran/ChangeLog: c 2016-07-28 Renlin Li Revert 2016-07-19 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". gcc/testsuite/ChangeLog: 2016-07-28 Renlin Li Revert 2016-07-19 Thomas Koenig PR fortran/71902 * gfortran.dg/dependency_47.f90: New test. diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index a873dbe..f117de0 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -54,8 +54,6 @@ 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. */ @@ -1318,33 +1316,13 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical) return 0; } + if (identical) + return 1; + /* Identical and disjoint ranges return 0, overlapping ranges return 1. */ if (expr1->ref && expr2->ref) - { - 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; - - default: - gcc_unreachable(); - } - } + return gfc_dep_resolver (expr1->ref, expr2->ref, NULL); return 1; @@ -2074,39 +2052,11 @@ ref_same_as_full_array (gfc_ref *full_ref, gfc_ref *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 can be handled in a forward loop. */ + 0 : array references are identical or not overlapping. */ 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; - - default: - gcc_unreachable(); - } -} - - -static gfc_dependency -dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) -{ int n; int m; gfc_dependency fin_dep; @@ -2129,22 +2079,21 @@ dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) /* The two ranges can't overlap if they are from different components. */ if (lref->u.c.component != rref->u.c.component) - return GFC_DEP_NODEP; + return 0; 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_ERROR ? GFC_DEP_NODEP : fin_dep; + return (fin_dep == GFC_DEP_OVERLAP) ? 1 : 0; case REF_ARRAY: if (ref_same_as_full_array (lref, rref)) - return GFC_DEP_EQUAL; + return 0; if (ref_same_as_full_array (rref, lref)) - return GFC_DEP_EQUAL; + return 0; if (lref->u.ar.dimen != rref->u.ar.dimen) { @@ -2155,7 +2104,7 @@ dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) fin_dep = gfc_full_array_ref_p (lref, NULL) ? GFC_DEP_EQUAL : GFC_DEP_OVERLAP; else - return GFC_DEP_OVERLAP; + return 1; break; } @@ -2199,7 +2148,7 @@ dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) /* If any dimension doesn't overlap, we have no dependency. */ if (this_dep == GFC_DEP_NODEP) - return GFC_DEP_NODEP; + return 0; /* Now deal with the loop reversal logic: This only works on ranges and is activated by setting @@ -2266,7 +2215,7 @@ dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) /* Exactly matching and forward overlapping ranges don't cause a dependency. */ if (fin_dep < GFC_DEP_BACKWARD) - return fin_dep == GFC_DEP_ERROR ? GFC_DEP_NODEP : fin_dep; + return 0; /* Keep checking. We only have a dependency if subsequent references also overlap. */ @@ -2284,7 +2233,7 @@ dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) /* Assume the worst if we nest to different depths. */ if (lref || rref) - return GFC_DEP_OVERLAP; + return 1; - return fin_dep; + return fin_dep == GFC_DEP_OVERLAP; } diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index d333c68..a543ab2 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -185,7 +185,7 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, current_code = c; inserted_block = NULL; changed_statement = NULL; - n = create_var (expr2, "realloc_string"); + n = create_var (expr2, "trim"); co->expr2 = n; return 0; } diff --git a/gcc/testsuite/gfortran.dg/dependency_47.f90 b/gcc/testsuite/gfortran.dg/dependency_47.f90 deleted file mode 100644 index eebc910..0000000 --- a/gcc/testsuite/gfortran.dg/dependency_47.f90 +++ /dev/null @@ -1,15 +0,0 @@ -! { 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_2" "original" } } -! { dg-final { scan-tree-dump-times "__var_1" 3 "original" } }