From patchwork Mon Sep 5 06:23:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aldy Hernandez X-Patchwork-Id: 960 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5044:0:0:0:0:0 with SMTP id h4csp39667wrt; Sun, 4 Sep 2022 23:24:25 -0700 (PDT) X-Google-Smtp-Source: AA6agR5uDWDLxUlFWR3W6f+IgCL4TD34kqjcaz18jtk/idClunJLbPP2ybDhVwqwMV6QeZptF0Bx X-Received: by 2002:a05:6402:3489:b0:448:5486:fa10 with SMTP id v9-20020a056402348900b004485486fa10mr31644546edc.386.1662359065253; Sun, 04 Sep 2022 23:24:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1662359065; cv=none; d=google.com; s=arc-20160816; b=yA9BwQLvVP8iQik6iitIzFidkYatHoKmQlINY/zi9BtL5TogTJu4KW7nUqAjbR6YqT PjnnIBBnWhU7mJ3xI+3/wyjygayF75L1W3A66zff1JC6LM4MneyUN3u3afdAkZ+3qEHJ nzW/MiovFo+dSClFo5avCPrd5o1mcCh5oiAxPau8jh9SsnloEzOSqbSd7EiDnZQmaIYH E/cC66o5u5sYiLWypQUj0jeNXB+UmJGmsztvRVFNQbeLM+9uO/4gKJdn8JtaxDSVCgwo TRQ1QAjx5GFOAvqxPgKaMYBagah5AY0py7KztLF7J7GVO661IRgmsbGUi+mWqr4qtC/W CdCw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:reply-to:from:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:message-id:date:subject:to :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=jFASjG2pA3Ial+/p+DiJtOM6F8eC/V+ou/cJdEF0ZtI=; b=cv/3OQFfcn3hVAldMLq+zIt6XNNh9Vbr5S5vv9ViBu9WWJwqqW779vg9AFlys/5BZt FpXt1x6sQ6+UbY2HGSKf5pFQG9NFGbJMZsnE+8P+NJGGYHnxUYndC4l5JLyv6Gqgd1+P a4RQJ0T0/6L+UXTHmlGXQ7lcE6FTU7TZBuU1UIimt7+R55+b+kKCdJYGnTaLRZ7zHn+U iK+OtzUSDm6i/YEuEstuhjQ6O3W82hnlbZKp2NXMe4+SQq2arG+VMohX1M9S4LVw47LM MPAODDS6jARPDu/1+NNArhhvcNpUphbWO3U8BQaWaOTEPCQB8ACN8GQUEPkXeyicJnSK su6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=V1WYgTmA; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id h3-20020a17090791c300b0073dd390029asi5459441ejz.535.2022.09.04.23.24.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 04 Sep 2022 23:24:25 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=V1WYgTmA; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 17B6E3857412 for ; Mon, 5 Sep 2022 06:24:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 17B6E3857412 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1662359064; bh=jFASjG2pA3Ial+/p+DiJtOM6F8eC/V+ou/cJdEF0ZtI=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=V1WYgTmAFs1hukvy6BDCsj+bfcKZvKA8hV3RVZN5Fw2Vyd+gI43g+Ir8h489wfogT k6WEkCWUlHVhy3hhuyhYk/zib9tkHxvP8wdlWLImyFpWocpuc+1aV4s9JdrhXL45Fy kBgr9V/xTDyLChXBf223944ZXXK6v0pP78+Qc4Ks= 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 ESMTPS id EBD283857000 for ; Mon, 5 Sep 2022 06:23:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EBD283857000 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-599-WHMbRrUZPraXpBhIbSSSaA-1; Mon, 05 Sep 2022 02:23:34 -0400 X-MC-Unique: WHMbRrUZPraXpBhIbSSSaA-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 34E02805B9A for ; Mon, 5 Sep 2022 06:23:34 +0000 (UTC) Received: from abulafia.quesejoda.com (unknown [10.39.192.210]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6D11D492C3B; Mon, 5 Sep 2022 06:23:33 +0000 (UTC) Received: from abulafia.quesejoda.com (localhost [127.0.0.1]) by abulafia.quesejoda.com (8.17.1/8.17.1) with ESMTPS id 2856NU4Q3240218 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 5 Sep 2022 08:23:30 +0200 Received: (from aldyh@localhost) by abulafia.quesejoda.com (8.17.1/8.17.1/Submit) id 2856NUe83240217; Mon, 5 Sep 2022 08:23:30 +0200 To: GCC patches Subject: [COMMITTED] Be even more conservative in intersection of NANs. Date: Mon, 5 Sep 2022 08:23:03 +0200 Message-Id: <20220905062301.3240191-1-aldyh@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Aldy Hernandez via Gcc-patches From: Aldy Hernandez Reply-To: Aldy Hernandez Cc: Jakub Jelinek Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1743109819324256152?= X-GMAIL-MSGID: =?utf-8?q?1743109819324256152?= Intersecting two ranges where one is a NAN is keeping the sign bit of the NAN range. This is not correct as the sign bits may not match. I think the only time we're absolutely sure about the intersection of a NAN and something else, is when both are a NAN with exactly the same properties (sign bit). If we're intersecting two NANs of differing sign, we can decide later whether that's undefined or just a NAN with no known sign. For now I've done the latter. I'm still mentally working on intersections involving NANs, especially if we want to keep track of signbits. For now, let's be extra careful and only do things we're absolutely sure about. Later we may want to fold the intersect of [NAN,NAN] and say [3,5] with the posibility of NAN, to a NAN, but I'm not 100% sure. As I've said before, setting varying is always a safe choice, because it means we know nothing and ranger won't attempt to optimize anything. gcc/ChangeLog: * value-range.cc (early_nan_resolve): Remove. (frange::intersect): Handle NANs. --- gcc/value-range.cc | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/gcc/value-range.cc b/gcc/value-range.cc index c9f42fe272c..9c561415971 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -444,24 +444,6 @@ frange::normalize_kind () return false; } -// If both operands are definitely NAN, do nothing as they combine -// perfectly. If OTOH, only one is a NAN, set R to VARYING as they -// can't be neither unioned nor intersected. Return TRUE if we -// changed anything. - -static inline bool -early_nan_resolve (frange &r, const frange &other) -{ - gcc_checking_assert (r.get_nan ().yes_p () || other.get_nan ().yes_p ()); - - // There's nothing to do for both NANs. - if (r.get_nan ().yes_p () == other.get_nan ().yes_p ()) - return false; - // ?? Perhaps the intersection of a NAN and anything is a NAN ??. - r.set_varying (r.type ()); - return true; -} - bool frange::union_ (const vrange &v) { @@ -532,8 +514,23 @@ frange::intersect (const vrange &v) *this = r; return true; } + + // If two NANs are not exactly the same, drop to an unknown NAN, + // otherwise there's nothing to do. + if (get_nan ().yes_p () && r.get_nan ().yes_p ()) + { + if (m_props == r.m_props) + return false; + + *this = frange_nan (m_type); + return true; + } + // ?? Perhaps the intersection of a NAN and anything is a NAN ??. if (get_nan ().yes_p () || r.get_nan ().yes_p ()) - return early_nan_resolve (*this, r); + { + set_varying (m_type); + return true; + } bool changed = m_props.intersect (r.m_props);