outgoing_edge_range_p() is the GORI work engine which starts with the
TRUE/FALSE/switch range from an edge at the bottom of the block, and
calculates the outgoing range of any other ssa-name which can be changed
by that.
When we rewrite a branch to always be true or false, we get slightly
better results if we recognize it, and and simply return UNDEFINED for
any ranges requested on the edge that cannot be taken. The edge is
slated to be removed and any values on the edge should henceforth be
ignored. The cache updating mechanism will propagate/update any
range-on-entry values in successor blocks.
Bootstrapped on x86_64-pc-linux-gnu with no regressions. pushed.
Andrew
commit 04600a47224b1ff85c6fb870218b51969cceff21
Author: Andrew MacLeod <amacl...@redhat.com>
Date: Wed Jul 28 08:30:02 2021 -0400
Return undefined on edges which are not executed.
When a branch has been folded, mark any range requests on the unexecutable edge as
UNDEFINED.
* gimple-range-gori.cc (gori_compute::outgoing_edge_range_p): Check for
cond_false and cond_true on branches.
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index 17032acf8d7..c124b3c1ce4 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -1104,6 +1104,21 @@ gori_compute::outgoing_edge_range_p (irange &r, edge e, tree name,
fur_stmt src (stmt, &q);
+ // If this edge is never taken, return undefined.
+ gcond *gc = dyn_cast<gcond *> (stmt);
+ if (gc)
+ {
+ if (((e->flags & EDGE_TRUE_VALUE) && gimple_cond_false_p (gc))
+ || ((e->flags & EDGE_FALSE_VALUE) && gimple_cond_true_p (gc)))
+ {
+ r.set_undefined ();
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Outgoing edge %d->%d unexecutable.\n",
+ e->src->index, e->dest->index);
+ return true;
+ }
+ }
+
// If NAME can be calculated on the edge, use that.
if (is_export_p (name, e->src))
{