From patchwork Tue Dec 7 22:14:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 48615 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 967B3385803A for ; Tue, 7 Dec 2021 22:15:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 967B3385803A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1638915335; bh=W0QU3FRRyYm9OhaCOXOb8uV+IiEUdKewWqwiYbmlPyE=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=mkQxiudH3kwxy0hbe5DrCxC1LTJKw/BObjxryDc+6J/xLZRkbp6BwsbjIexOvTq7n 9UYHB5jXhUrRl+kN6OPtVne7+5/bzu1Z1x/ydzcfvu0tI79g2rSJhptvBRLMENs5hW yJby1iVcCGzujD/+5GaOyWQ+8DTDZUTpNSo1yzf8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by sourceware.org (Postfix) with ESMTPS id ACBD03858027; Tue, 7 Dec 2021 22:14:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org ACBD03858027 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.251.7.61] ([79.251.7.61]) by web-mail.gmx.net (3c-app-gmx-bap03.server.lan [172.19.172.73]) (via HTTP); Tue, 7 Dec 2021 23:14:31 +0100 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] PR fortran/103610 - ICE in gfc_convert_mpz_to_signed, at fortran/simplify.c:193 Date: Tue, 7 Dec 2021 23:14:31 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:F+Po3cFIpn8SvS+1PYrxnBHV74qeU1mOzzLejqs3digL4ljd8od+KhrXW8C+xzv4+8RSn Qlpm8RSirV/6tyvEHxP+Ei/VaE6eQTPLdc5T0UX42rpF/ZgRtaZc8XKycG5Onl3jJeCZ1OuvDqIy QtGmnqNNSQy1VnCXirdOI3GmhbAO4zfA4v/lqlJRnmrRWrSaJLTOuYSPHAF6x6QcDqGYkWFwMvNw LxSTt2IFrxKVA1s/6zMASDpFJ0koK+sIVI7t4gdsPJruUDMaIj28TBbbsLdz7qI7J8zv9ASNhIlJ FQ= X-UI-Out-Filterresults: notjunk:1;V03:K0:H2KZB+WPT50=:1wZ4/8XH4U5ylCEM6x6OJW GA9gozYDIfnR5OZXMa0prRjmRx6+EcPCEvYJAXdvgp/vskB1zaST4d1caHu+RNnRsua3GA4V3 WPGvZLSNMFdVatlJ6bU0Hbra0R8X+eZipUAIg6Hi9G6rm7tGpzQU+pXYWHo2ua5P4+98y9pTO M2jWLZuB0ItGGm7YPls69b33pQl/i4XEsWOKB0VTuL8KUyBi0niEKQpCGteOCtWRv2t8rWWAX sPC/ho0gbX0ixmQnVnSsil+Ur7m/40zGH59kcfmBFQytE1taYKgiLVKeAWuYly5tRgMr7pf5n iwfOOEOU+8pdYQh2LIC3HyV+t88aCL+hX4m9x/Ksj1BxR62GryQd/D2oDhCv1DXy0aQXyXRXi Jh4SevBAc94aew+7iQcXecm0OK+YD03NHmMqtXs4OgeM3MeUw7XG+rXVqx8zWFNWfBEx8TdC0 YzmwWlxz2HFCkMZSAgoPT40tWIrnCZEGBDoOQ/iRIjNWYjgD3kgE73WZ0yC4Bg0nsYwHubs4U VQ167VZ9vjSvUBStPk8ffN10rK+KReNpdT9aRaSwS1vUiwzQti+VXalR8RnwXhaGhxb7shzY8 zbi6Nd+apCmNz9UA6uUU/t36h21GJOzWJojATGLs+FzwY+v8k7N9/gF5L/Yjrqzs55s1kmDUM /4xSnFXvjzJZXp7XYAfQ23ewmu5Not9iosC899CdOA5r12MNl8fWNaoDRnOaN7kmZ6002Bt1J nqnBGxa3dv8R+8LFmiSKCFXqIuZueP+GiFoczsJMzRUQMmCL6jzqmephCLD0YoImMtaymJUgQ DWQx61U X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, KAM_NUMSUBJECT, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Harald Anlauf via Gcc-patches From: Harald Anlauf Reply-To: Harald Anlauf Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Dear all, when simplifying SHAPE(), we rely on spec_dimen_size returning non-negative dimensions. That actually did not happen in all cases, as the testcase by Gerhard shows. (The testcase is rather fallout from the wrong simplification). The solution is trivial: simply check the dimensions against 0 and fix if needed. Regtested on x86_64-pc-linux-gnu. OK for mainline. As it turns out that we generated "wrong code" by the simplification, I'd backport at least to 11-branch after some waiting time if no issues show up elsewhere. Thanks, Harald From f8d6aae66b1cb3f75b47d50695ef1be7770abc30 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Tue, 7 Dec 2021 23:06:41 +0100 Subject: [PATCH] Fortran: dimensions of an array have to be non-negative gcc/fortran/ChangeLog: PR fortran/103610 * array.c (spec_dimen_size): Fix simplification of SHAPE: dimensions must be non-negative. gcc/testsuite/ChangeLog: PR fortran/103610 * gfortran.dg/shape_11.f90: New test. --- gcc/fortran/array.c | 6 ++++-- gcc/testsuite/gfortran.dg/shape_11.f90 | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/shape_11.f90 diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index e5e22099405..e4891dfef77 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -2296,8 +2296,7 @@ gfc_copy_iterator (gfc_iterator *src) /********* Subroutines for determining the size of an array *********/ /* These are needed just to accommodate RESHAPE(). There are no - diagnostics here, we just return a negative number if something - goes wrong. */ + diagnostics here, we just return false if something goes wrong. */ /* Get the size of single dimension of an array specification. The @@ -2330,6 +2329,9 @@ spec_dimen_size (gfc_array_spec *as, int dimen, mpz_t *result) mpz_add_ui (*result, *result, 1); + if (mpz_cmp_si (*result, 0) < 0) + mpz_set_si (*result, 0); + return true; } diff --git a/gcc/testsuite/gfortran.dg/shape_11.f90 b/gcc/testsuite/gfortran.dg/shape_11.f90 new file mode 100644 index 00000000000..127d221e710 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/shape_11.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! PR fortran/103610 - ICE while simplifying SHAPE +! Contributed by G.Steinmetz + +program p + integer, parameter :: a(-1) = 1 + integer, parameter :: b(1) = maskl(shape(a)) + integer, parameter :: c(1) = shape(a) + integer, parameter :: d(1) = maskr(shape(a)) + if (b(1) /= 0) stop 1 + if (c(1) /= 0) stop 2 + if (d(1) /= 0) stop 3 +end + +! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } } -- 2.26.2