From patchwork Thu Sep 2 19:32:59 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Koenig X-Patchwork-Id: 63522 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]) by ozlabs.org (Postfix) with SMTP id C514AB7187 for ; Fri, 3 Sep 2010 05:33:36 +1000 (EST) Received: (qmail 24591 invoked by alias); 2 Sep 2010 19:33:34 -0000 Received: (qmail 24579 invoked by uid 22791); 2 Sep 2010 19:33:33 -0000 X-SWARE-Spam-Status: No, hits=1.5 required=5.0 tests=BAYES_40, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp5.netcologne.de (HELO smtp5.netcologne.de) (194.8.194.25) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 02 Sep 2010 19:33:02 +0000 Received: from [192.168.0.196] (xdsl-87-79-187-111.netcologne.de [87.79.187.111]) by smtp5.netcologne.de (Postfix) with ESMTP id 4A61040D2D9; Thu, 2 Sep 2010 21:32:59 +0200 (CEST) Subject: Re: [patch, fortran] Further dependency improvements From: Thomas Koenig To: fortra@gcc.gnu.org Cc: gcc-patches@gcc.gnu.org Date: Thu, 02 Sep 2010 21:32:59 +0200 Message-ID: <1283455979.3554.0.camel@linux-fd1f.site> Mime-Version: 1.0 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 Ping? After some more checking, I found that one useful case was missed: Conversion functions weren't 'PURE. This should also open the way to resolving PR 34145. OK for trunk? Thomas 2010-08-28 Thomas Koenig PR fortran/45159 * dependency.c (gfc_deb_compare_expr): Compare equal for equal arglists for pure user functions, or for those intrinsic functions which are also pure. * intrinsics.c (add_conv): Mark conversion functions as pure. (add_char_conversions): Likewise. 2010-08-28 Thomas Koenig PR fortran/45159 * gfortran.dg/dependency_34.f90: New test. Index: intrinsic.c =================================================================== --- intrinsic.c (Revision 163581) +++ intrinsic.c (Arbeitskopie) @@ -3022,6 +3022,7 @@ add_conv (bt from_type, int from_kind, bt to_type, sym->simplify.cc = gfc_convert_constant; sym->standard = standard; sym->elemental = 1; + sym->pure = 1; sym->conversion = 1; sym->ts = to; sym->id = GFC_ISYM_CONVERSION; @@ -3172,6 +3173,7 @@ add_char_conversions (void) char_conversions[n].simplify.cc = gfc_convert_char_constant; char_conversions[n].standard = GFC_STD_F2003; char_conversions[n].elemental = 1; + char_conversions[n].pure = 1; char_conversions[n].conversion = 0; char_conversions[n].ts = to; char_conversions[n].id = GFC_ISYM_CONVERSION; Index: dependency.c =================================================================== --- dependency.c (Revision 163584) +++ dependency.c (Arbeitskopie) @@ -353,39 +353,32 @@ gfc_dep_compare_expr (gfc_expr *e1, gfc_expr *e2) return -2; case EXPR_FUNCTION: - /* We can only compare calls to the same intrinsic function. */ - if (e1->value.function.isym == 0 || e2->value.function.isym == 0 - || e1->value.function.isym != e2->value.function.isym) - return -2; - args1 = e1->value.function.actual; - args2 = e2->value.function.actual; - - /* We should list the "constant" intrinsic functions. Those - without side-effects that provide equal results given equal - argument lists. */ - switch (e1->value.function.isym->id) + /* PURE functions can be compared for argument equality. */ + if ((e1->value.function.esym && e2->value.function.esym + && e1->value.function.esym == e2->value.function.esym + && e1->value.function.esym->result->attr.pure) + || (e1->value.function.isym && e2->value.function.isym + && e1->value.function.isym == e2->value.function.isym + && e1->value.function.isym->pure)) { + args1 = e1->value.function.actual; + args2 = e2->value.function.actual; - case GFC_ISYM_REAL: - case GFC_ISYM_LOGICAL: - case GFC_ISYM_DBLE: - break; - - default: - return -2; + /* Compare the argument lists for equality. */ + while (args1 && args2) + { + if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0) + return -2; + args1 = args1->next; + args2 = args2->next; + } + return (args1 || args2) ? -2 : 0; } + else + return -2; + break; - /* Compare the argument lists for equality. */ - while (args1 && args2) - { - if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0) - return -2; - args1 = args1->next; - args2 = args2->next; - } - return (args1 || args2) ? -2 : 0; - default: return -2; }