From patchwork Thu Aug 23 20:12:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Thomas_K=C3=B6nig?= X-Patchwork-Id: 961584 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-484330-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=tkoenig.net Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="QQ0kDi7K"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=tkoenig.net header.i=@tkoenig.net header.b="fZjGZvNc"; dkim-atps=neutral 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 41xFvP29Wfz9s0n for ; Fri, 24 Aug 2018 06:12:31 +1000 (AEST) 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=akL56zilGMDiFKH5CQYuw5l1iZCs7YbR0kuY6+EFWp34bZPcEC pAkRl3/9xHYi1Qz8+O25NB9r5T7WqJKU403SZjOLw+Y0hSZPQz4Kvx5f6guef1ng j7Thb3hMcpx5l5O1JI3zckVyBAr9izo+J8T4CuHcxYNjEnp+nNce6Dyuk= 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=0Jp72Pqd5V8tKsmQ3sb7WJ0PfOg=; b=QQ0kDi7K7uqqRF/bsAXl Qjak9uDCibyqYb5ZOVuYNAXXONIbxDiWHQR6q+LHud0XCwwGOM1+HR3C5DdW0LoQ kv466d6mhlf5LHa85aSUmkmoslizpVU3dVJ58K6gfuJ+6QIT/Qopxc1ywwx/L79K 35LTDU1efGu9k1xglBXsCNA= Received: (qmail 101178 invoked by alias); 23 Aug 2018 20:12:24 -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 101124 invoked by uid 89); 23 Aug 2018 20:12:14 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=cells, symtree, H*r:AUTH, pascal X-HELO: mo4-p00-ob.smtp.rzone.de Received: from mo4-p00-ob.smtp.rzone.de (HELO mo4-p00-ob.smtp.rzone.de) (81.169.146.221) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 23 Aug 2018 20:12:12 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1535055130; s=strato-dkim-0002; d=tkoenig.net; h=Date:Message-ID:Subject:From:To:X-RZG-CLASS-ID:X-RZG-AUTH:From: Subject:Sender; bh=OuMr+JW5hrX+exipjh6KLj1TxC77qHK32b+K+JKxJKE=; b=fZjGZvNcsh8hl8L/co2ITcZ6OJkEacvyoWffAdQoMl6Se5W2nvZBiUH79AQNa9Urcb wvDrG3fG/iiJvX53PCjfqvsV4eHfCiAunz38uVoU8aBHSIZIF7QPlpAq30Yw9MGhivV+ g6dVV1ah6pZ9VruBarc+pQXZGVMOxIQI8uG0UfKPbITfuM6k2Mo/n5ikOi+U502jvYZ3 eyBHgEr8tMSaFf872aKyroVNqwz+0mUSAHBMC86rAIV3okdHC7eHz3WfQDaxxSzddUIo 7cFEUDvam4+G9MWCuWj88T8sPuidVF87ASOaQBFkHgWtyoAWq0y0lqKOrdMs8bG5Cn0T empA== Received: from [192.168.178.68] by smtp.strato.de (RZmta 43.20 DYNA|AUTH) with ESMTPSA id h078deu7NKC92NW (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Thu, 23 Aug 2018 22:12:09 +0200 (CEST) To: "fortran@gcc.gnu.org" , gcc-patches From: =?utf-8?q?Thomas_K=C3=B6nig?= Subject: [patch, fortran] Fix PR 86837, wrong code regression in implied do loop in i/o Message-ID: Date: Thu, 23 Aug 2018 22:12:09 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Hello world, this patch fixes a regression by correctly checking that the innner start, step or end values of an implied do loop do not depend on an outer loop variable. The check was actually done before, but gfc_check_dependency wasn't finding all relevant cases. Regression-tested. OK for trunk and 8.x? Regards Thomas 2018-08-23 Thomas Koenig PR fortran/86837 * frontend-passes.c (var_in_expr_callback): New function. (var_in_expr): New function. (traverse_io_block): Use var_in_expr instead of gfc_check_dependency for checking if the variable depends on the previous interators. 2018-08-23 Thomas Koenig PR fortran/86837 * gfortran.dg/implied_do_io_6.f90: New test. Index: frontend-passes.c =================================================================== --- frontend-passes.c (Revision 263752) +++ frontend-passes.c (Arbeitskopie) @@ -1104,6 +1104,31 @@ convert_elseif (gfc_code **c, int *walk_subtrees A return 0; } +/* Callback function to var_in_expr - return true if expr1 and + expr2 are identical variables. */ +static int +var_in_expr_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, + void *data) +{ + gfc_expr *expr1 = (gfc_expr *) data; + gfc_expr *expr2 = *e; + + if (expr2->expr_type != EXPR_VARIABLE) + return 0; + + return expr1->symtree->n.sym == expr2->symtree->n.sym; +} + +/* Return true if expr1 is found in expr2. */ + +static bool +var_in_expr (gfc_expr *expr1, gfc_expr *expr2) +{ + gcc_assert (expr1->expr_type == EXPR_VARIABLE); + + return gfc_expr_walker (&expr2, var_in_expr_callback, (void *) expr1); +} + struct do_stack { struct do_stack *prev; @@ -1256,9 +1281,9 @@ traverse_io_block (gfc_code *code, bool *has_reach for (int j = i - 1; j < i; j++) { if (iters[j] - && (gfc_check_dependency (var, iters[j]->start, true) - || gfc_check_dependency (var, iters[j]->end, true) - || gfc_check_dependency (var, iters[j]->step, true))) + && (var_in_expr (var, iters[j]->start) + || var_in_expr (var, iters[j]->end) + || var_in_expr (var, iters[j]->step))) return false; } }