aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-11-12 11:58:07 +0100
committerAldy Hernandez <aldyh@redhat.com>2022-11-17 09:53:49 +0100
commit822a0823c012b912f0108a4da257cd97cbcdb7a3 (patch)
tree1b8b9c9bd05a0cac01a7d3b9df585a8b78e22b00 /gcc
parent156f523f9582f1e6bcce27ece03f2776960408c8 (diff)
downloadgcc-822a0823c012b912f0108a4da257cd97cbcdb7a3.zip
gcc-822a0823c012b912f0108a4da257cd97cbcdb7a3.tar.gz
gcc-822a0823c012b912f0108a4da257cd97cbcdb7a3.tar.bz2
[PR68097] Try to avoid recursing for floats in gimple_stmt_nonnegative_warnv_p.
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. This patch uses a global range query (no on-demand lookups, just global ranges and minimal folding) to determine if the range of a statement is known to be non-negative. PR tree-optimization/68097 gcc/ChangeLog: * gimple-fold.cc (gimple_stmt_nonnegative_warnv_p): Call range_of_stmt for floats.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-fold.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index f8a1875..c2d9c80 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -68,6 +68,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-strlen.h"
#include "varasm.h"
#include "internal-fn.h"
+#include "gimple-range.h"
enum strlen_range_kind {
/* Compute the exact constant string length. */
@@ -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;
+ if (get_global_range_query ()->range_of_stmt (r, stmt)
+ && r.signbit_p (sign))
+ return !sign;
+ }
switch (gimple_code (stmt))
{
case GIMPLE_ASSIGN: