Correctly unify recomputation with existing range.
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 23 Jun 2021 19:25:45 +0000 (15:25 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Thu, 24 Jun 2021 17:25:58 +0000 (13:25 -0400)
When propagating the on-entry cache, new block ranges are calculated
by combining all the incoming edges and comparing to the old value.
When a recomputation was performed on an edge, it didn't take into account
that the value in the block may already be better than a potential
recompuation... Thus a worse values was sometimes propagated.
Fixed by simply calling the now correct range_on_edge the cache provides.

* gimple-range-cache.cc (ranger_cache::propagate_cache): Call
range_on_edge instead of manually calculating.

gcc/gimple-range-cache.cc

index a377261..98ecdbb 100644 (file)
@@ -1037,27 +1037,12 @@ ranger_cache::propagate_cache (tree name)
       new_range.set_undefined ();
       FOR_EACH_EDGE (e, ei, bb->preds)
        {
+         range_on_edge (e_range, e, name);
          if (DEBUG_RANGE_CACHE)
-           fprintf (dump_file, "   edge %d->%d :", e->src->index, bb->index);
-         // Get whatever range we can for this edge.
-         if (!m_gori.outgoing_edge_range_p (e_range, e, name, *this))
            {
-             exit_range (e_range, name, e->src);
-             if (DEBUG_RANGE_CACHE)
-               {
-                 fprintf (dump_file, "No outgoing edge range, picked up ");
-                 e_range.dump (dump_file);
-                 fprintf (dump_file, "\n");
-               }
-           }
-         else
-           {
-             if (DEBUG_RANGE_CACHE)
-               {
-                 fprintf (dump_file, "outgoing range :");
-                 e_range.dump (dump_file);
-                 fprintf (dump_file, "\n");
-               }
+             fprintf (dump_file, "   edge %d->%d :", e->src->index, bb->index);
+             e_range.dump (dump_file);
+             fprintf (dump_file, "\n");
            }
          new_range.union_ (e_range);
          if (new_range.varying_p ())
@@ -1074,7 +1059,11 @@ ranger_cache::propagate_cache (tree name)
          if (DEBUG_RANGE_CACHE) 
            {
              if (!ok_p)
-               fprintf (dump_file, "     Cache failure to store value.");
+               {
+                 fprintf (dump_file, "   Cache failure to store value:");
+                 print_generic_expr (dump_file, name, TDF_SLIM);
+                 fprintf (dump_file, "  ");
+               }
              else
                {
                  fprintf (dump_file, "      Updating range to ");