From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by sourceware.org (Postfix) with ESMTPS id E1E623858C62; Thu, 10 Nov 2022 10:20:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E1E623858C62 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x62b.google.com with SMTP id k2so3817659ejr.2; Thu, 10 Nov 2022 02:20:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5mu9Uoiom0oNh4eH756LF74gTWUGFrSz2ltnFgIv70k=; b=Rx7XFwsMzcza8/zLvEaUlubPz8hPx2hbWF6foG31QGBh7+4h9U+FZnSyoHR913VG/5 KtDK98/Br5LWsLRiDmC+PQo571fn2Zk+frq+EEJFxpOueRAovzp2Ic22hkQP+xaLZMvI QUWjHmQztlAZUGZn92A1nutqIyvn+c1zqbW6Ms0wSTY8ugb3S2/xB4yGaDzwkMV5Ztlw X7c/Jb9SDUM6x2/7+gmxmXYRwhVSNVMrEylQOEn7IljvmalXJvKRiToFKcGCBLEN+s/+ 78zxoo2Bzd29mCFtjCWT+3nWEMOCDXYV+jHS3/K3cKt2KJWaL+XypY4kSzGU6cq+p41z agRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5mu9Uoiom0oNh4eH756LF74gTWUGFrSz2ltnFgIv70k=; b=l20UWZSA5j6Qy7tz1urksZln8kbJW7PFGl0/TI9MR1YN1TEjT07F0pEZY93OqfjZN5 dN0bQWRIZYQUNtK67nQMnTknknGTDuEtsGdRKnuIU7BYwK+kulG5zGfL1a+qxJYtMcNc AQJqCRpypE3hBHCZmkOQPpdwPFZCTvMvNzbjRajTSppXBH/Rfdb0f7gDXcPKFnMV1sa2 O7Uaqx+8bPLu+1ppKt+d7EFxLGBjiBeK2/NG2C4ZwS0cIjGduR7h/7KYnNxJdfRA9Duv l00uX0Z5ig/CkVm36bKRK+FWhiUFNz2Lv7xuG07BY/Buh4kJazzHb7GNdVzzFOXgBrq2 +2tg== X-Gm-Message-State: ANoB5pnStVy7CM6YBdagqCEH5VvbfwX+pkOpSbxof6uzLfw1+pDt2FSZ SxryDc1omwTc90CRqSMPIb05BdegIEU= X-Google-Smtp-Source: AA0mqf5oqvlBNFUv8xo+t6vi0IHk1jBtBLJWrkaM2eePhkZmPff+N9y1Ai91Q9pu3FfRobHO8+4jqA== X-Received: by 2002:a17:906:24d7:b0:7ae:4ed4:eede with SMTP id f23-20020a17090624d700b007ae4ed4eedemr2165624ejb.240.1668075634665; Thu, 10 Nov 2022 02:20:34 -0800 (PST) Received: from nbbrfq (80-110-214-113.static.upcbusiness.at. [80.110.214.113]) by smtp.gmail.com with ESMTPSA id q6-20020a1709064cc600b0078d793e7927sm6956624ejt.4.2022.11.10.02.20.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Nov 2022 02:20:33 -0800 (PST) From: Bernhard Reutner-Fischer X-Google-Original-From: Bernhard Reutner-Fischer Received: from b by nbbrfq with local (Exim 4.96) (envelope-from ) id 1ot4fg-005jMu-2L; Thu, 10 Nov 2022 11:20:32 +0100 To: gcc-patches@gcc.gnu.org Cc: Bernhard Reutner-Fischer , Bernhard Reutner-Fischer , gfortran ML Subject: [PATCH 2/2] Fortran: Add attribute flatten Date: Thu, 10 Nov 2022 11:20:31 +0100 Message-Id: <20221110102031.1366016-3-aldot@gcc.gnu.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221110102031.1366016-1-aldot@gcc.gnu.org> References: <20221110102031.1366016-1-aldot@gcc.gnu.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Bootstrapped and regtested cleanly on x86_unknown-linux. The document bits will be rewritten for rst. Ok for trunk if the prerequisite target_clones patch is approved? gcc/fortran/ChangeLog: * decl.cc (gfc_match_gcc_attributes): Handle flatten. * f95-lang.cc (gfc_attribute_table): Add flatten. * gfortran.texi: Document attribute flatten. gcc/testsuite/ChangeLog: * gfortran.dg/attr_flatten-1.f90: New test. --- gcc/fortran/decl.cc | 8 +++- gcc/fortran/f95-lang.cc | 2 + gcc/fortran/gfortran.texi | 8 ++++ gcc/testsuite/gfortran.dg/attr_flatten-1.f90 | 41 ++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/attr_flatten-1.f90 diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index d312d4812b6..3d210c26eb5 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -11841,6 +11841,7 @@ gfc_match_gcc_attributes (void) for(;;) { char ch; + bool known_attr0args = false; if (gfc_match_name (name) != MATCH_YES) return MATCH_ERROR; @@ -11849,7 +11850,9 @@ gfc_match_gcc_attributes (void) if (strcmp (name, ext_attr_list[id].name) == 0) break; - if (id == EXT_ATTR_LAST) + if (strcmp (name, "flatten") == 0) + known_attr0args = true; /* Handled below. We do not need a bit. */ + else if (id == EXT_ATTR_LAST) { gfc_error ("Unknown attribute in !GCC$ ATTRIBUTES statement at %C"); return MATCH_ERROR; @@ -11864,7 +11867,8 @@ gfc_match_gcc_attributes (void) || id == EXT_ATTR_DLLEXPORT || id == EXT_ATTR_CDECL || id == EXT_ATTR_STDCALL - || id == EXT_ATTR_FASTCALL) + || id == EXT_ATTR_FASTCALL + || known_attr0args) attr.ext_attr_args = chainon (attr.ext_attr_args, build_tree_list (get_identifier (name), NULL_TREE)); diff --git a/gcc/fortran/f95-lang.cc b/gcc/fortran/f95-lang.cc index 7154568aec5..ddb5b686cf6 100644 --- a/gcc/fortran/f95-lang.cc +++ b/gcc/fortran/f95-lang.cc @@ -101,6 +101,8 @@ static const struct attribute_spec gfc_attribute_table[] = gfc_handle_omp_declare_target_attribute, NULL }, { "target_clones", 1, -1, true, false, false, false, gfc_handle_omp_declare_target_attribute, NULL }, + { "flatten", 0, 0, true, false, false, false, + gfc_handle_omp_declare_target_attribute, NULL }, { NULL, 0, 0, false, false, false, false, NULL, NULL } }; diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index 06e4c8c00a1..be650f28b62 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -3280,6 +3280,14 @@ contains end module mymod @end smallexample +@node flatten + +Procedures annotated with the @code{flatten} attribute have their +callees inlined, if possible. +Please refer to +@ref{Top,,Common Function Attributes,gcc,Using the GNU Compiler Collection (GCC)} +for details about the respective attribute. + The attributes are specified using the syntax @code{!GCC$ ATTRIBUTES} @var{attribute-list} @code{::} @var{variable-list} diff --git a/gcc/testsuite/gfortran.dg/attr_flatten-1.f90 b/gcc/testsuite/gfortran.dg/attr_flatten-1.f90 new file mode 100644 index 00000000000..0b72f1ba17c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/attr_flatten-1.f90 @@ -0,0 +1,41 @@ +! { dg-do compile } +! { dg-additional-options "-fdump-tree-optimized" } +! Test __attribute__((flatten)) +! +module attr_flttn_1_a + implicit none +contains + subroutine sub1(i) + integer, intent(in) :: i + integer :: n + do n = 1, i + print *, "marker1 ", i, i+n; + enddo + end + subroutine sub2(i) + integer, intent(in) :: i + integer :: n + do n = 1, i + print *, "marker2 ", i, i*i-n; + enddo + end +end module +module attr_flttn_1_b + use attr_flttn_1_a +contains + subroutine sub3 +!GCC$ ATTRIBUTES flatten :: sub3 + print *, "marker3 " + call sub2(4711) + call sub1(42) + end +end module +! Without the attribute flatten we would have 1 character write for each marker. +! That would be 3 _gfortran_transfer_character_write.*marker +! With the attribute, we have one for each sub plus marker1 and marker2 +! which were inlined into sub3. +! So this gives 5 _gfortran_transfer_character_write.*marker +! and there should be no calls to sub1 (); nor sub2 (); +! { dg-final { scan-tree-dump-times { _gfortran_transfer_character_write .*?marker} 5 "optimized" } } +! { dg-final { scan-tree-dump-not { sub1 \([^\)][^\)]*\);} "optimized" } } +! { dg-final { scan-tree-dump-not { sub2 \([^\)][^\)]*\);} "optimized" } } -- 2.38.1