diff mbox series

[COMMITTED] Return undefined range on edges which are not executed.

Message ID b9ada531-3987-0d4d-e4b6-497ff814e5fb@redhat.com
State New
Headers show
Series [COMMITTED] Return undefined range on edges which are not executed. | expand

Commit Message

Andrew MacLeod July 28, 2021, 12:48 p.m. UTC
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
diff mbox series

Patch

commit 04600a47224b1ff85c6fb870218b51969cceff21
Author: Andrew MacLeod <amacleod@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))
     {