aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-08-24 12:13:24 -0400
committerAndrew MacLeod <amacleod@redhat.com>2021-09-20 16:32:35 -0400
commit73cf73af2392e00917de042a4692f6a0b6329ee8 (patch)
tree6cd6cfb9b9569ddf87064cc4563655b74efd3135 /gcc/gimple-range.cc
parent5d110fe90afcd850ea21aee6429f22edd6b1b592 (diff)
downloadgcc-73cf73af2392e00917de042a4692f6a0b6329ee8.zip
gcc-73cf73af2392e00917de042a4692f6a0b6329ee8.tar.gz
gcc-73cf73af2392e00917de042a4692f6a0b6329ee8.tar.bz2
Use EDGE_EXECUTABLE in ranger and return UNDEFINED for those edges.
If an incoming edge is UNDEFINED, don't process it. Track if other edges equate to a single value, and add an equivalence if appropriate. gcc/ * gimple-range-fold.cc (fold_using_range::range_of_phi): Ignore undefined edges, apply an equivalence if appropriate. * gimple-range-gori.cc (gori_compute::outgoing_edge_range_p): Return UNDEFINED if EDGE_EXECUTABLE is not set. * gimple-range.cc (gimple_ranger::gimple_ranger): Set all edges as EXECUTABLE upon startup. (gimple_ranger::range_on_edge): Return UNDEFINED for edges without EDGE_EXECUTABLE set. * vr-values.c (set_and_propagate_unexecutable): New. (simplify_using_ranges::fold_cond): Call set_and_propagate. (simplify_using_ranges::simplify_switch_using_ranges): Ditto. * vr-values.h: Add prototype. gcc/testsuite/ * gcc.dg/tree-ssa/evrp-ignore.c: New.
Diffstat (limited to 'gcc/gimple-range.cc')
-rw-r--r--gcc/gimple-range.cc36
1 files changed, 25 insertions, 11 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index d74cea3..625d136 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. If not see
#include "cfgloop.h"
#include "tree-scalar-evolution.h"
#include "gimple-range.h"
+#include "domwalk.h"
gimple_ranger::gimple_ranger () : tracer ("")
{
@@ -41,6 +42,7 @@ gimple_ranger::gimple_ranger () : tracer ("")
m_oracle = m_cache.oracle ();
if (dump_file && (param_evrp_mode & EVRP_MODE_TRACE))
tracer.enable_trace ();
+ set_all_edges_as_executable (cfun);
}
bool
@@ -164,10 +166,6 @@ gimple_ranger::range_on_edge (irange &r, edge e, tree name)
int_range_max edge_range;
gcc_checking_assert (irange::supports_type_p (TREE_TYPE (name)));
- // PHI arguments can be constants, catch these here.
- if (!gimple_range_ssa_p (name))
- return range_of_expr (r, name);
-
unsigned idx;
if ((idx = tracer.header ("range_on_edge (")))
{
@@ -175,16 +173,32 @@ gimple_ranger::range_on_edge (irange &r, edge e, tree name)
fprintf (dump_file, ") on edge %d->%d\n", e->src->index, e->dest->index);
}
- range_on_exit (r, e->src, name);
- gcc_checking_assert (r.undefined_p ()
- || range_compatible_p (r.type(), TREE_TYPE (name)));
+ // Check to see if the edge is executable.
+ if ((e->flags & EDGE_EXECUTABLE) == 0)
+ {
+ r.set_undefined ();
+ if (idx)
+ tracer.trailer (idx, "range_on_edge [Unexecutable] ", true,
+ name, r);
+ return true;
+ }
- // Check to see if NAME is defined on edge e.
- if (m_cache.range_on_edge (edge_range, e, name))
- r.intersect (edge_range);
+ bool res = true;
+ if (!gimple_range_ssa_p (name))
+ res = range_of_expr (r, name);
+ else
+ {
+ range_on_exit (r, e->src, name);
+ gcc_checking_assert (r.undefined_p ()
+ || range_compatible_p (r.type(), TREE_TYPE (name)));
+
+ // Check to see if NAME is defined on edge e.
+ if (m_cache.range_on_edge (edge_range, e, name))
+ r.intersect (edge_range);
+ }
if (idx)
- tracer.trailer (idx, "range_on_edge", true, name, r);
+ tracer.trailer (idx, "range_on_edge", res, name, r);
return true;
}