summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2021-09-27 09:20:56 +0200
committerAldy Hernandez <aldyh@redhat.com>2021-09-27 12:23:59 +0200
commitd5f8abe1d3f718a75cbff0a453c1d961be5939b7 (patch)
tree2daf0cc101c3d63d7df5e86c3fc269f236442954
parente1d01f4973eee8d229ddc326ff7c3bd5f4cf32c1 (diff)
downloadgcc-d5f8abe1d3f718a75cbff0a453c1d961be5939b7.tar.gz
Use on-demand ranges in ssa_name_has_boolean_range before querying nonzero bits.
The function ssa_name_has_boolean_range looks at the nonzero bits stored in SSA_NAME_RANGE_INFO. These are global in nature and are the result of a previous evrp/VRP run (technically other passes can also set them). However, we can do better if we use get_range_query. Doing so will use a ranger if enabled in a pass, or global ranges otherwise. The call to get_nonzero_bits remains, as there are passes that will set them independently of the global range info. Tested on x86-64 Linux with a regstrap as well as in a DOM environment using an on-demand ranger instead of evrp. gcc/ChangeLog: * tree-ssanames.c (ssa_name_has_boolean_range): Use get_range_query.
-rw-r--r--gcc/tree-ssanames.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
index 2165ad71cf3..f427c5a789b 100644
--- a/gcc/tree-ssanames.c
+++ b/gcc/tree-ssanames.c
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa.h"
#include "cfgloop.h"
#include "tree-scalar-evolution.h"
+#include "value-query.h"
/* Rewriting a function into SSA form can create a huge number of SSA_NAMEs,
many of which may be thrown away shortly after their creation if jumps
@@ -484,7 +485,7 @@ get_nonzero_bits (const_tree name)
This can be because it is a boolean type, any unsigned integral
type with a single bit of precision, or has known range of [0..1]
- via VRP analysis. */
+ via range analysis. */
bool
ssa_name_has_boolean_range (tree op)
@@ -502,12 +503,20 @@ ssa_name_has_boolean_range (tree op)
return true;
/* An integral type with more precision, but the object
- only takes on values [0..1] as determined by VRP
+ only takes on values [0..1] as determined by range
analysis. */
if (INTEGRAL_TYPE_P (TREE_TYPE (op))
- && (TYPE_PRECISION (TREE_TYPE (op)) > 1)
- && wi::eq_p (get_nonzero_bits (op), 1))
- return true;
+ && (TYPE_PRECISION (TREE_TYPE (op)) > 1))
+ {
+ int_range<2> onezero (build_zero_cst (TREE_TYPE (op)),
+ build_one_cst (TREE_TYPE (op)));
+ int_range<2> r;
+ if (get_range_query (cfun)->range_of_expr (r, op) && r == onezero)
+ return true;
+
+ if (wi::eq_p (get_nonzero_bits (op), 1))
+ return true;
+ }
return false;
}