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))
     {

Reply via email to