]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Limit new value calculations to first order effects.
authorAndrew MacLeod <amacleod@redhat.com>
Mon, 14 Jun 2021 19:33:59 +0000 (15:33 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Mon, 14 Jun 2021 21:06:32 +0000 (17:06 -0400)
When utilzing poor values during propagation, we mostly care about values that
were undefined/processed directly used in calcualting the SSA_NAME being
processed.  2nd level derivations of such poor values rarely affect the
inital calculation.  Leave them to when they are directly encountered.

* gimple-range-cache.cc (ranger_cache::ranger_cache): Adjust.
(ranger_cache::enable_new_values): Set to specified value and
return the old value.
(ranger_cache::disable_new_values): Delete.
(ranger_cache::fill_block_cache): Disable non 1st order derived
poor values.
* gimple-range-cache.h (ranger_cache): Adjust prototypes.
* gimple-range.cc (gimple_ranger::range_of_expr): Adjust.

gcc/gimple-range-cache.cc
gcc/gimple-range-cache.h
gcc/gimple-range.cc

index 249515fbaf5bad29f1e5fd0c457b1fe1b48781a8..d9a57c294df25ea61fd63a8734ae429f9eb4ceba 100644 (file)
@@ -727,7 +727,7 @@ ranger_cache::ranger_cache (gimple_ranger &q) : query (q)
       if (bb)
        m_gori.exports (bb);
     }
-  enable_new_values ();
+  enable_new_values (true);
 }
 
 ranger_cache::~ranger_cache ()
@@ -748,21 +748,15 @@ ranger_cache::dump (FILE *f)
   fprintf (f, "\n");
 }
 
-// Allow the cache to flag and query new values when propagation is forced
-// to use an unknown value.
+// Allow or disallow the cache to flag and query new values when propagation
+// is forced to use an unknown value.  The previous state is returned.
 
-void
-ranger_cache::enable_new_values ()
-{
-  m_new_value_p = true;
-}
-
-// Disable new value querying.
-
-void
-ranger_cache::disable_new_values ()
+bool
+ranger_cache::enable_new_values (bool state)
 {
-  m_new_value_p = false;
+  bool ret = m_new_value_p;
+  m_new_value_p = state;
+  return ret;
 }
 
 // Dump the caches for basic block BB to file F.
@@ -1343,7 +1337,12 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
 
          // Calculate a range at the exit from the block so the caches feeding
          // this block will be filled, and we'll get a "better" value.
+         // Disallow additonal "poor values" during this phase to avoid
+         // iterations that are unlikely to be profitable for this name.
+         // See PR 101014.
+         bool state = enable_new_values (false);
          query.range_on_exit (tmp, calc_bb, rec.calc);
+         enable_new_values (state);
          
          // Then ask for NAME to be re-evaluated on outgoing edges and 
          // use any new values.
index ce4449a08db1f746d93c3fcba4d127da53d1f033..1a2aaceb3ed842d648297a51247e46b6a745dde3 100644 (file)
@@ -101,8 +101,7 @@ public:
   bool get_non_stale_global_range (irange &r, tree name);
   void set_global_range (tree name, const irange &r);
 
-  void enable_new_values ();
-  void disable_new_values ();
+  bool enable_new_values (bool state);
   non_null_ref m_non_null;
   gori_compute m_gori;
 
index b534b8e0a2cea679804332fb7e2c3eaf3bedb5b7..481b89b2b80cfbe32d5367670a39113d113215ca 100644 (file)
@@ -1173,9 +1173,9 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt)
   // trigger new value calculations.  PR 100781.
   if (is_gimple_debug (stmt))
     {
-      m_cache.disable_new_values ();
+      bool state = m_cache.enable_new_values (false);
       m_cache.range_of_expr (r, expr, stmt);
-      m_cache.enable_new_values ();
+      m_cache.enable_new_values (state);
       return true;
     }
   basic_block bb = gimple_bb (stmt);