From patchwork Sat Nov 27 20:56:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 48229 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 612A53857C70 for ; Sat, 27 Nov 2021 20:57:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 612A53857C70 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1638046636; bh=sfm3TvQvHW7hFg0TPL080VMB1vklFADeUkSd0/3ZYjk=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=jQMH+73jik8hPp+RWCBoCdRadL9dBhELuVX8k2+bweyIie+T7lCOStfJym2A91JuG NOU5Czj/I4xJXYQaZzHBLRmufYLkyh+zKMdZ/QaXRsE1JM8IreDp9LgGBKb/Q8maIE bTpICPK+s8MzDQIB7tX/86KgL1DcZOBu2FwksdQ0= 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.15.18]) by sourceware.org (Postfix) with ESMTPS id 5AA503858C3A; Sat, 27 Nov 2021 20:56:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5AA503858C3A X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.232.147.227] ([79.232.147.227]) by web-mail.gmx.net (3c-app-gmx-bs26.server.lan [172.19.170.78]) (via HTTP); Sat, 27 Nov 2021 21:56:27 +0100 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH, fortran] Improve expansion of constant array expressions within constructors Date: Sat, 27 Nov 2021 21:56:27 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:Fc4MkmlbyTwyISdAXfK+OPC9YZtf52otXwEtLQ8GKyKB+sE02eglQeBmONgzD9lIjXTVv MIwkmTLST1PNkS31DKWa8d1bZD9qBCZegs7uRO23CkuunPhnOBzZf8HugGQ1wr7bVLZxJ5rMs+Jo UiXgDDdleb8U/chINO+GYBWVAkhuHNykpBffKTdac7hvdgF9BY4+KMRDsUxr7+0yleZf+L3Leacz wYKrkpO9OHEQHJIaAaOHwWV3Vi0zVDJszNE+prAdGjCATzJ2w4PZfxeV5GPlelzOG48HbCRKOISA 8E= X-UI-Out-Filterresults: notjunk:1;V03:K0:fIzS6MuzdPA=:tmgzABERFmfNEChkXeh7uB /TY01ZJSGFllYGvmfWyewWzD+RK8vHS1aOFWvqo2sGeml79PSHA/GeDGi8upEs1XiBgE1UgG4 8g5ryuntp/gfDckL5XPovLD7J1KyMozrq9wVEp+1CiBG515s7jNgOnQCyhxJAufecigimr0Bd 7Lfb0qAat30gXl6TjYSXSIN3ZyZ8JDSe6nNRmw3R8IVn6derJMvNv4y+1gBP7Uah0SweISicn 1sulWO6rABWqNKS0pJsHilX2TcYIzXOcVudfEfTtQxK8rfStA8NzcUEmLBOcQQDpmeUKBAIEd iUJ8EYf2fv/nah60Fd0/IeMYRXbR+gI4ypY4ywU+5PnZ/suokSlbPX+BeyNWryR2K8tsftuWe IAx7X397OqMhDuhC0XxvZi4S2hVoiXefsqWpt91gLypPoSa2BLFRIugQ5+lKzihInprzUYdvv J8sET/wB59tVyg3GeJIsz0ytUFhxXWM5o34nf4a01BZ8qTLG01KKKOBLy6MpmiPX0Zq2s0b+m LHyZYZh64m9tiW8yJA8FRtP/gyFxJoS51pigmEcbBqJ3rGW2ygwVoGE/JzcXcy7otFjUD47ar ZBo7ccRWEVi16O/2EMhXf770G1HQ/CM3BM0FQDdAqmfr6lwrqAI1hpfUhd73vyBG8oH1rTFli dsYqP6tdJ3nytC8oubPopOiz/lWREV0J//7IiA0nK1ayJBTesZdRPDjnwmPTT5Q8IOiyiVvIt zfFs1ZEb8YEi5b7N8H0zJM4LpTg2EP4FoXV5JvSwm4GPnpUM/pvY4Vmv3wONr5RLJ92es5h7g iTmFlf9 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, 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, while analyzing several issues involving constructors and constant array expressions, such as in PR102717 and PR102787, a common problem showed up: we did not always properly expand parameter arrays, array sections, or sections with vector subscripts. Besides several ICEs as in these PRs, the incomplete expansion led to an unnecessary creation of array temporaries. This is improved by the attached patch. Regtested on x86_64-pc-linux-gnu. OK for mainline? Thanks, Harald From 6aced0b26e54cea48cca36637f3616054391864b Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sat, 27 Nov 2021 21:43:52 +0100 Subject: [PATCH] Fortran: improve expansion of constant array expressions within constructors gcc/fortran/ChangeLog: PR fortran/102787 * array.c (expand_constructor): When encountering a constant array expression or array section within a constructor, simplify it to enable better expansion. gcc/testsuite/ChangeLog: * gfortran.dg/array_constructor_54.f90: New test. --- gcc/fortran/array.c | 6 +++++ .../gfortran.dg/array_constructor_54.f90 | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/array_constructor_54.f90 diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index 6552eaf3b0c..fbc66097c80 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -1804,6 +1804,12 @@ expand_constructor (gfc_constructor_base base) if (empty_constructor) empty_ts = e->ts; + /* Simplify constant array expression/section within constructor. */ + if (e->expr_type == EXPR_VARIABLE && e->rank > 0 && e->ref + && e->symtree && e->symtree->n.sym + && e->symtree->n.sym->attr.flavor == FL_PARAMETER) + gfc_simplify_expr (e, 0); + if (e->expr_type == EXPR_ARRAY) { if (!expand_constructor (e->value.constructor)) diff --git a/gcc/testsuite/gfortran.dg/array_constructor_54.f90 b/gcc/testsuite/gfortran.dg/array_constructor_54.f90 new file mode 100644 index 00000000000..44d2f9fdf42 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/array_constructor_54.f90 @@ -0,0 +1,23 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original -Warray-temporaries" } +! { dg-final { scan-tree-dump-not "stride" "original" } } +! Verify that no temporary array is generated for a constant array constructor +! See e.g. PR fortran/102717, PR fortran/102787 + +program p + integer, parameter :: a(*) = [1,2,3,4] + integer, parameter :: b(2,3) = reshape([1,2,3,4,5,6], shape (b)) + print *, [a] + print *, [a( : ) ] + print *, [a( ::1)] + print *, [a( ::2)] + print *, [a(1:2:1)] + print *, [a(4:1:-2)] + print *, [a([3,2])] + print *, [a,1] + print *, [1,a] + print *, [a,a] + print *, [b(:,3:1:-2)] + print *, [1,b(1,[2,1,3])] + print *, [a,b] +end -- 2.26.2