From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 7AB7B385803D for ; Fri, 7 Jan 2022 16:46:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7AB7B385803D Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-646-x5v6sHlnNLiN-AfOCCbMFA-1; Fri, 07 Jan 2022 11:46:21 -0500 X-MC-Unique: x5v6sHlnNLiN-AfOCCbMFA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2DC6D10168C3; Fri, 7 Jan 2022 16:46:20 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.2.16.169]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9CF1F838C0; Fri, 7 Jan 2022 16:46:19 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 207GkGXS1054933 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 7 Jan 2022 17:46:16 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 207GkEN01054931; Fri, 7 Jan 2022 17:46:14 +0100 Date: Fri, 7 Jan 2022 17:46:14 +0100 From: Jakub Jelinek To: Thomas Koenig Cc: Michael Meissner , Segher Boessenkool , "fortran@gcc.gnu.org" , Peter Bergner , gcc-patches@gcc.gnu.org, Bill Schmidt , David Edelsohn Subject: Re: [power-ieee128] RFH: LTO broken Message-ID: <20220107164614.GM2646553@tucnak> Reply-To: Jakub Jelinek References: <20220103162650.GV2646553@tucnak> <20220103200026.GW2646553@tucnak> <1bd479f6-2ea6-a19d-b8e5-69d3cac7ca98@netcologne.de> <20220104110749.GC2646553@tucnak> <20220107112923.GJ2646553@tucnak> <20220107133103.GN2664@tucnak> <5aa645cf-89bf-a620-a107-9564b7aa8fc3@netcologne.de> MIME-Version: 1.0 In-Reply-To: <5aa645cf-89bf-a620-a107-9564b7aa8fc3@netcologne.de> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, 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: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Jan 2022 16:46:27 -0000 On Fri, Jan 07, 2022 at 03:25:57PM +0100, Thomas Koenig wrote: > > > 0000000000251038 000006ad00000015 R_PPC64_JMP_SLOT 0000000000000000 __cabsieee128 + 0 > > > All these should for POWER_IEEE128 use atan2q@QUADMATH_1.0 etc. > > > > So, seems all these come from f951 compiled sources. > > For user code, I think the agreement was if you want to use successfully > > -mabi=ieeelongdouble, you need glibc 2.32 or later, which is why the Fortran > > FE doesn't conditionalize on whether glibc 2.32 is available or not and just > > emits __WHATEVERieee128 entrypoints. > > That was the idea, I think. > > > But for Fortran compiled sources in libgfortran, we need to use > > __WHATEVERieee128 only if glibc 2.32 or later and WHATEVERq (from > > libquadmath) otherwise. > > I guess easiest would be to do this always in the FE, but we need to > > determine in the FE if the target is glibc 2.32 or later. > > Instead of determining this in the front end, maybe we can add > an option (documented, but marked as useful as only for internal > use and with no guarantee that it will remain) and use that option > when compiling libgfortran. We apparently have already TARGET_GLIBC_MAJOR and TARGET_GLIBC_MINOR target macros, and e.g. libgcc or D testsuite uses internal options like -fbuilding-libgcc. So, the following patch adds -fbuilding-libgfortran option and uses it together with TARGET_GLIBC_M* checks to decide whether to use libquadmath APIs (for the IEEE quad kind=16 if -fbuilding-libgfortran and not glibc or glibc is older than 2.32) or glibc 2.32 APIs (otherwise). This way, libgfortran uses solely the libquadmath APIs on glibc < 2.32 and __*ieee128 APIs on glibc 2.32, while user code always uses the latter. Ok for power-ieee128? 2022-01-07 Jakub Jelinek gcc/fortran/ * trans-types.c (gfc_init_kinds): When setting abi_kind to 17, if not targetting glibc 2.32 or later and -fbuilding-libgfortran, set gfc_real16_is_float128 and c_float128 in gfc_real_kinds. (gfc_build_real_type): Don't set c_long_double if c_float128 is already set. * trans-intrinsic.c (builtin_decl_for_precision): Don't use long_double_built_in if gfc_real16_is_float128 and long_double_type_node == gfc_float128_type_node. * lang.opt (fbuilding-libgfortran): New undocumented option. libgfortran/ * Makefile.am (AM_FCFLAGS): Add -fbuilding-libgfortran after -fallow-leading-underscore. * Makefile.in: Regenerated. --- gcc/fortran/trans-types.c.jj 2022-01-04 10:27:56.498322942 +0000 +++ gcc/fortran/trans-types.c 2022-01-07 16:19:06.737066905 +0000 @@ -516,7 +516,16 @@ gfc_init_kinds (void) { for (int i = 0; i < r_index; ++i) if (gfc_real_kinds[i].kind == 16) - gfc_real_kinds[i].abi_kind = 17; + { + gfc_real_kinds[i].abi_kind = 17; + if (flag_building_libgfortran + && (TARGET_GLIBC_MAJOR < 2 + || (TARGET_GLIBC_MAJOR == 2 && TARGET_GLIBC_MINOR < 32))) + { + gfc_real16_is_float128 = true; + gfc_real_kinds[i].c_float128 = 1; + } + } } /* Choose the default integer kind. We choose 4 unless the user directs us @@ -859,7 +868,7 @@ gfc_build_real_type (gfc_real_info *info info->c_float = 1; if (mode_precision == DOUBLE_TYPE_SIZE) info->c_double = 1; - if (mode_precision == LONG_DOUBLE_TYPE_SIZE) + if (mode_precision == LONG_DOUBLE_TYPE_SIZE && !info->c_float128) info->c_long_double = 1; if (mode_precision != LONG_DOUBLE_TYPE_SIZE && mode_precision == 128) { --- gcc/fortran/trans-intrinsic.c.jj 2022-01-07 09:39:10.222157644 +0000 +++ gcc/fortran/trans-intrinsic.c 2022-01-07 13:57:35.451495059 +0000 @@ -154,7 +154,9 @@ builtin_decl_for_precision (enum built_i i = m->float_built_in; else if (precision == TYPE_PRECISION (double_type_node)) i = m->double_built_in; - else if (precision == TYPE_PRECISION (long_double_type_node)) + else if (precision == TYPE_PRECISION (long_double_type_node) + && (!gfc_real16_is_float128 + || long_double_type_node != gfc_float128_type_node)) i = m->long_double_built_in; else if (precision == TYPE_PRECISION (gfc_float128_type_node)) { --- gcc/fortran/lang.opt.jj 2021-12-31 11:00:15.042190365 +0000 +++ gcc/fortran/lang.opt 2022-01-07 16:18:17.685995005 +0000 @@ -413,6 +413,9 @@ fblas-matmul-limit= Fortran RejectNegative Joined UInteger Var(flag_blas_matmul_limit) Init(30) -fblas-matmul-limit= Size of the smallest matrix for which matmul will use BLAS. +fbuilding-libgfortran +Fortran Undocumented Var(flag_building_libgfortran) + fcheck-array-temporaries Fortran Produce a warning at runtime if a array temporary has been created for a procedure argument. --- libgfortran/Makefile.am.jj 2022-01-04 10:27:56.498322942 +0000 +++ libgfortran/Makefile.am 2022-01-07 16:23:20.052602554 +0000 @@ -1079,8 +1079,8 @@ endif $(patsubst %.c,%.lo,$(notdir $(i_matmull_c))): AM_CFLAGS += -funroll-loops # Add the -fallow-leading-underscore option when needed -$(patsubst %.F90,%.lo,$(patsubst %.f90,%.lo,$(notdir $(gfor_specific_src)))): AM_FCFLAGS += -fallow-leading-underscore -selected_real_kind.lo selected_int_kind.lo: AM_FCFLAGS += -fallow-leading-underscore +$(patsubst %.F90,%.lo,$(patsubst %.f90,%.lo,$(notdir $(gfor_specific_src)))): AM_FCFLAGS += -fallow-leading-underscore -fbuilding-libgfortran +selected_real_kind.lo selected_int_kind.lo: AM_FCFLAGS += -fallow-leading-underscore -fbuilding-libgfortran # Build *_r17.F90 and *_c17.F90 with additional -mabi=ieeelongdouble on powerpc64le-linux. @@ -1097,7 +1097,7 @@ endif if IEEE_SUPPORT # Add flags for IEEE modules -$(patsubst %.F90,%.lo,$(notdir $(gfor_ieee_src))): AM_FCFLAGS += -Wno-unused-dummy-argument -Wno-c-binding-type -ffree-line-length-0 -fallow-leading-underscore +$(patsubst %.F90,%.lo,$(notdir $(gfor_ieee_src))): AM_FCFLAGS += -Wno-unused-dummy-argument -Wno-c-binding-type -ffree-line-length-0 -fallow-leading-underscore -fbuilding-libgfortran endif # Dependencies between IEEE_ARITHMETIC and IEEE_EXCEPTIONS --- libgfortran/Makefile.in.jj 2022-01-04 10:27:56.508323161 +0000 +++ libgfortran/Makefile.in 2022-01-07 16:23:50.853275633 +0000 @@ -7633,8 +7633,8 @@ $(patsubst %.c,%.lo,$(notdir $(i_matmul_ $(patsubst %.c,%.lo,$(notdir $(i_matmull_c))): AM_CFLAGS += -funroll-loops # Add the -fallow-leading-underscore option when needed -$(patsubst %.F90,%.lo,$(patsubst %.f90,%.lo,$(notdir $(gfor_specific_src)))): AM_FCFLAGS += -fallow-leading-underscore -selected_real_kind.lo selected_int_kind.lo: AM_FCFLAGS += -fallow-leading-underscore +$(patsubst %.F90,%.lo,$(patsubst %.f90,%.lo,$(notdir $(gfor_specific_src)))): AM_FCFLAGS += -fallow-leading-underscore -fbuilding-libgfortran +selected_real_kind.lo selected_int_kind.lo: AM_FCFLAGS += -fallow-leading-underscore -fbuilding-libgfortran # Build *_r17.F90 and *_c17.F90 with additional -mabi=ieeelongdouble on powerpc64le-linux. @@ -7648,7 +7648,7 @@ selected_real_kind.lo selected_int_kind. @HAVE_REAL_17_TRUE@$(patsubst %_c17.c,%_c17.lo,$(notdir $(gfor_built_src))): AM_CFLAGS += -mabi=ieeelongdouble # Add flags for IEEE modules -@IEEE_SUPPORT_TRUE@$(patsubst %.F90,%.lo,$(notdir $(gfor_ieee_src))): AM_FCFLAGS += -Wno-unused-dummy-argument -Wno-c-binding-type -ffree-line-length-0 -fallow-leading-underscore +@IEEE_SUPPORT_TRUE@$(patsubst %.F90,%.lo,$(notdir $(gfor_ieee_src))): AM_FCFLAGS += -Wno-unused-dummy-argument -Wno-c-binding-type -ffree-line-length-0 -fallow-leading-underscore -fbuilding-libgfortran # Dependencies between IEEE_ARITHMETIC and IEEE_EXCEPTIONS ieee_arithmetic.lo: ieee/ieee_arithmetic.F90 ieee_exceptions.lo Jakub