From patchwork Tue Oct 29 08:59:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 99750 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 3874C3858C35 for ; Tue, 29 Oct 2024 08:59:54 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTP id 1A7A63858D34 for ; Tue, 29 Oct 2024 08:59:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1A7A63858D34 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1A7A63858D34 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1730192360; cv=none; b=heIzzl8IhZlvRr7hLea30nA0tHxnBHHXCyHRytmSg1euMknQA0NtvHB0pPuncFSuZ5sm90JxvGaCEfLbVY5Blav4HFuRaQ8H7zZS3BK0EZdBa9QzXg5toi5XBymkr+zw5LryMa3KB2yX4JjsBYeGVdVp1CILVlO+GiavQCfZMNM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1730192360; c=relaxed/simple; bh=ar7661OGxzTnPV6bXNPExPOV1R06sbufcvpMNHoRmJc=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=F29SzTvpufCbd3fyUG9jmcMyQM+RgcMLqx/cI6oAxg4xd10WB3yVR/XkCV7w96y0J7VSZq/isTR29Z3gKNIOgg+GiAdXV0ZGEacnPwUDzwdXQPyAxyFSN9blB3YgDOm9q5Ub4N7o/CRWACa77Tk53cbV/yOzgSlwKtMigFRtIN4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1730192357; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=w8xUlXZttA8T5E4RrNV4IjP67e5G6y4ogFbxwLAaAkE=; b=Lbw6s1qhY0xYP55MowJZehvuznTdJ/foraUxwPE2Y8Ag2Xm6h8pwsAxCT6lXxVc92xGRTb QRvY9Mx7XYdK1mw/6BScMvZFx69s2AUDISxWBU+xTH6X6l5hQvmQJwEXZ6MaO7uA3r+ZkE ROvH4fyI5ICzgKT53cz/GrOypnDR5cU= Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-393-9NGghykCNIuPwb0oCObyAw-1; Tue, 29 Oct 2024 04:59:16 -0400 X-MC-Unique: 9NGghykCNIuPwb0oCObyAw-1 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5074C195604F; Tue, 29 Oct 2024 08:59:15 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.45.224.16]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8E5F41956052; Tue, 29 Oct 2024 08:59:13 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 49T8xAQr3081727 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 29 Oct 2024 09:59:10 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 49T8xAm93081726; Tue, 29 Oct 2024 09:59:10 +0100 Date: Tue, 29 Oct 2024 09:59:10 +0100 From: Jakub Jelinek To: libstdc++@gcc.gnu.org Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] libstdc++: Use if consteval rather than if (std::__is_constant_evaluated()) for {,b}float16_t nextafter [PR117321] Message-ID: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-3.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP, URI_HEX autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Jakub Jelinek Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org Hi! The nextafter_c++23.cc testcase fails to link at -O0. The problem is that eventhough std::__is_constant_evaluated() has always_inline attribute, that at -O0 just means that we inline the call, but its result is still assigned to a temporary which is tested later, nothing at -O0 propagates that false into the if and optimizes away the if body. And the __builtin_nextafterf16{,b} calls are meant to be used solely for constant evaluation, the C libraries don't define nextafterf16 these days. As __STDCPP_FLOAT16_T__ and __STDCPP_BFLOAT16_T__ are predefined right now only by GCC, not by clang which doesn't implement the extended floating point types paper, and as they are predefined in C++23 and later modes only, I think we can just use if consteval which is folded already during the FE and the body isn't included even at -O0. I've added a feature test for that just in case clang implements those and implements those in some weird way. Note, if (__builtin_is_constant_evaluted()) would work correctly too, that is also folded to false at gimplification time and the corresponding if block not emitted at all. But for -O0 it can't be wrapped into a helper inline function. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-10-29 Jakub Jelinek PR libstdc++/117321 * include/c_global/cmath (nextafter(_Float16, _Float16)): Use if consteval rather than if (std::__is_constant_evaluated()) around the __builtin_nextafterf16 call. (nextafter(__gnu_cxx::__bfloat16_t, __gnu_cxx::__bfloat16_t)): Use if consteval rather than if (std::__is_constant_evaluated()) around the __builtin_nextafterf16b call. * testsuite/26_numerics/headers/cmath/117321.cc: New test. Jakub --- libstdc++-v3/include/c_global/cmath.jj 2024-09-25 17:25:07.227360607 +0200 +++ libstdc++-v3/include/c_global/cmath 2024-10-28 13:10:46.348655046 +0100 @@ -2880,8 +2880,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Float16 nextafter(_Float16 __x, _Float16 __y) { - if (std::__is_constant_evaluated()) - return __builtin_nextafterf16(__x, __y); +#if __cpp_if_consteval >= 202106L + // Can't use if (std::__is_constant_evaluated()) here, as it + // doesn't guarantee optimizing the body away at -O0 and + // nothing defines nextafterf16. + if consteval { return __builtin_nextafterf16(__x, __y); } +#endif #ifdef __INT16_TYPE__ using __float16_int_type = __INT16_TYPE__; #else @@ -3598,8 +3602,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr __gnu_cxx::__bfloat16_t nextafter(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y) { - if (std::__is_constant_evaluated()) - return __builtin_nextafterf16b(__x, __y); +#if __cpp_if_consteval >= 202106L + // Can't use if (std::__is_constant_evaluated()) here, as it + // doesn't guarantee optimizing the body away at -O0 and + // nothing defines nextafterf16b. + if consteval { return __builtin_nextafterf16b(__x, __y); } +#endif #ifdef __INT16_TYPE__ using __bfloat16_int_type = __INT16_TYPE__; #else --- libstdc++-v3/testsuite/26_numerics/headers/cmath/117321.cc.jj 2024-10-28 12:56:10.699876240 +0100 +++ libstdc++-v3/testsuite/26_numerics/headers/cmath/117321.cc 2024-10-28 12:56:59.875189173 +0100 @@ -0,0 +1,5 @@ +// { dg-do run { target c++23 } } +// { dg-require-cmath "" } +// { dg-additional-options "-O0" } + +#include "nextafter_c++23.cc"