From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x136.google.com (mail-lf1-x136.google.com [IPv6:2a00:1450:4864:20::136]) by sourceware.org (Postfix) with ESMTPS id 23731395B405 for ; Wed, 16 Nov 2022 16:04:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 23731395B405 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-lf1-x136.google.com with SMTP id c1so30237028lfi.7 for ; Wed, 16 Nov 2022 08:04:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=zNzyL9ngvjWdXTAnluFwmUe4hBWoFuF3XtZgSyHu8hE=; b=huL17WqPhb2yz4kOwrfxC9Ea7tbfd1BoMaxEscRDnQGPUO0ygbEB2k+3nJkb8PH3PX prj4h7sGCLNzb8L5GXac5GZe+qXIWxk4jgqaLgvY0GQboIYRgogmtQAbLzCkh6WjAn2x vLBLtw50htpTsMNMW1f2UuXSwISvY9ILIlXaISQZ27CaotFE5bTSfGxAxrX3fB8Qa+yN TnTsNZGta0zkhK6Nj/JIgxQSfyd5IgNdCBBapA5rX0kNEOOlRyDhFTY5Ixw0cmIHXHBf AUW3jc1rK1U4LvTDcr8zWXHGkEfiumRoW5qBDVuetq2/7CDZDSoujBqaD96c4pF0SrdM Nddw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=zNzyL9ngvjWdXTAnluFwmUe4hBWoFuF3XtZgSyHu8hE=; b=Ym3lKRUgubHGm99cu5Pp9BMs1MbvDgZVmjbZWzC5e0Gf6HeQdbsLp82frTSuXpCAlh o97yuZK5nLNpz7rH//l5+FVG4LJCVjs2i+UcD8BTp1ms11VrQpHrCHgqrjMnEgfMdnTP 9yRUt8uIs/bnqTdYLjcLQdc2tdLR4XCgo0q8hYXwVsZKReBOcqYRGnkTpvrqqP/E4vr0 OP2+cEBM3mc0b7L5ZuTnh0Cc6BopftuIY/HAfpz1Vfq2IL9czDAN/he54sd5VnBXBPvr C9BV1FQ0+Zczy+XuAftW3azb40bofzIF3uQCBXZ1i7+V2sE9x+lWRXCAUATQJ0bNVtSu 5GPg== X-Gm-Message-State: ANoB5pmb+e2F0PHJYyl1u6XAg2BfU+lqTvll//Um43ZFl4uVc8Hjm5RP jEnwBsRDxHPrRvBpTjsPOxQ0OqxWmhxkYzdp14c= X-Google-Smtp-Source: AA0mqf7aRgzffYp6qqd4x62teww54XSM7Ys7+VcM+1uqBjiwBX+lcWo+wkSplKTuVhdVxwWPkwHtimsYziS8A8949Hk= X-Received: by 2002:a05:6512:3132:b0:4aa:1754:9ae3 with SMTP id p18-20020a056512313200b004aa17549ae3mr7117777lfd.344.1668614676101; Wed, 16 Nov 2022 08:04:36 -0800 (PST) MIME-Version: 1.0 References: <20221112183048.389811-1-aldyh@redhat.com> <1ea5fc0e-fcc4-a354-b71b-3da3008ea5f2@redhat.com> <503f89de-8e88-2e20-5b14-5493191b19f5@redhat.com> In-Reply-To: <503f89de-8e88-2e20-5b14-5493191b19f5@redhat.com> From: Richard Biener Date: Wed, 16 Nov 2022 17:04:22 +0100 Message-ID: Subject: Re: [PATCH] [PR68097] Try to avoid recursing for floats in tree_*_nonnegative_warnv_p. To: Aldy Hernandez Cc: GCC patches , Andrew MacLeod , richard.sandiford@arm.com Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,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: On Tue, Nov 15, 2022 at 11:46 AM Aldy Hernandez wrote: > > > > On 11/15/22 08:15, Richard Biener wrote: > > On Mon, Nov 14, 2022 at 8:05 PM Aldy Hernandez wrote: > >> > >> > >> > >> On 11/14/22 10:12, Richard Biener wrote: > >>> On Sat, Nov 12, 2022 at 7:30 PM Aldy Hernandez wrote: > >>>> > >>>> It irks me that a PR named "we should track ranges for floating-point > >>>> hasn't been closed in this release. This is an attempt to do just > >>>> that. > >>>> > >>>> As mentioned in the PR, even though we track ranges for floats, it has > >>>> been suggested that avoiding recursing through SSA defs in > >>>> gimple_assign_nonnegative_warnv_p is also a goal. We can do this with > >>>> various ranger components without the need for a heavy handed approach > >>>> (i.e. a full ranger). > >>>> > >>>> I have implemented two versions of known_float_sign_p() that answer > >>>> the question whether we definitely know the sign for an operation or a > >>>> tree expression. > >>>> > >>>> Both versions use get_global_range_query, which is a wrapper to query > >>>> global ranges. This means, that no caching or propagation is done. > >>>> In the case of an SSA, we just return the global range for it (think > >>>> SSA_NAME_RANGE_INFO). In the case of a tree code with operands, we > >>>> also use get_global_range_query to resolve the operands, and then call > >>>> into range-ops, which is our lowest level component. There is no > >>>> ranger or gori involved. All we're doing is resolving the operation > >>>> with the ranges passed. > >>>> > >>>> This is enough to avoid recursing in the case where we definitely know > >>>> the sign of a range. Otherwise, we still recurse. > >>>> > >>>> Note that instead of get_global_range_query(), we could use > >>>> get_range_query() which uses a ranger (if active in a pass), or > >>>> get_global_range_query if not. This would allow passes that have an > >>>> active ranger (with enable_ranger) to use a full ranger. These passes > >>>> are currently, VRP, loop unswitching, DOM, loop versioning, etc. If > >>>> no ranger is active, get_range_query defaults to global ranges, so > >>>> there's no additional penalty. > >>>> > >>>> Would this be acceptable, at least enough to close (or rename the PR ;-))? > >>> > >>> I think the checks would belong to the gimple_stmt_nonnegative_warnv_p function > >>> only (that's the SSA name entry from the fold-const.cc ones)? > >> > >> That was my first approach, but I thought I'd cover the unary and binary > >> operators as well, since they had other callers. But I'm happy with > >> just the top-level tweak. It's a lot less code :). > > > > @@ -9234,6 +9235,15 @@ bool > > gimple_stmt_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p, > > int depth) > > { > > + tree type = gimple_range_type (stmt); > > + if (type && frange::supports_p (type)) > > + { > > + frange r; > > + bool sign; > > + return (get_global_range_query ()->range_of_stmt (r, stmt) > > + && r.signbit_p (sign) > > + && sign == false); > > + } > > > > the above means we never fall through to the switch below if > > frange::supports_p (type) - that's eventually good enough, I > > don't think we ever call this very function directly but it gets > > invoked via recursion through operands only. But of course > > Woah, sorry. That was not intended. For that matter, the patch as > posted caused: > > FAIL: gcc.dg/builtins-10.c (test for excess errors) > FAIL: gcc.dg/builtins-57.c (test for excess errors) > FAIL: gcc.dg/torture/builtin-nonneg-1.c -O1 (test for excess errors) > FAIL: gcc.dg/torture/builtin-nonneg-1.c -O2 (test for excess errors) > FAIL: gcc.dg/torture/builtin-nonneg-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none (test for excess errors) > FAIL: gcc.dg/torture/builtin-nonneg-1.c -O3 -g (test for excess errors) > FAIL: gcc.dg/torture/builtin-nonneg-1.c -Os (test for excess errors) > FAIL: gcc.dg/torture/builtin-power-1.c -O1 (test for excess errors) > FAIL: gcc.dg/torture/builtin-power-1.c -O2 (test for excess errors) > FAIL: gcc.dg/torture/builtin-power-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none (test for excess errors) > FAIL: gcc.dg/torture/builtin-power-1.c -O3 -g (test for excess errors) > FAIL: gcc.dg/torture/builtin-power-1.c -Os (test for excess errors) Did you investigate why? Because the old patch removed the recursion while the new keeps it in case the global range isn't present which isn't as nice. > Note that ranger folding calls this function, though it won't run the > risk of endless recursion because range_of_stmt uses the LHS, and only > use global ranges to solve the LHS. > > Also, frange::supports_p() does not support all floats: > > static bool supports_p (const_tree type) > { > // ?? Decimal floats can have multiple representations for the > // same number. Supporting them may be as simple as just > // disabling them in singleton_p. No clue. > return SCALAR_FLOAT_TYPE_P (type) && !DECIMAL_FLOAT_TYPE_P (type); > } OK, _Complex types are obviously missing, so are vector ones. > Finally, my patch is more conservative than what the *nonnegative_warn* > friends do. We only return true when we're sure about the sign bit and > it's FALSE. As I mentioned elsewhere, tree_call_nonnegative_warn_p() > always returns true for: > > CASE_CFN_ACOS: > CASE_CFN_ACOS_FN: > CASE_CFN_ACOSH: > CASE_CFN_ACOSH_FN: > CASE_CFN_CABS: > CASE_CFN_CABS_FN: > ... > ... > /* Always true. */ > return true; > > This means that we'll return true for a NAN, but we're incorrectly > assuming the NAN will be +NAN. In my proposed patch, we don't make such > assumptions. We only return true if the range is non-negative, > including the NAN. Yep, the usual issue whether nonnegative means copysign (1, x) produces 1 or whether !(x < 0) is true. > > I wonder what types are not supported by frange and whether > > the manual processing we fall through to does anything meaningful > > for those? > > > > I won't ask you to thoroughly answer this now but please put in > > a comment reflecting the above before the switch stmt. > > > > switch (gimple_code (stmt)) > > > > > > Otherwise OK, in case you tree gets back to bootstrapping ;) > > Updated patch that passes test. > > OK? And if so, can I close the PR? Yes, I think we now track float ranges - improvements are of course always possible. Richard. > Thanks. > Aldy