]> gcc.gnu.org Git - gcc.git/commitdiff
Do not continue propagating values which cannot be set properly.
authorAndrew MacLeod <amacleod@redhat.com>
Tue, 22 Jun 2021 21:46:05 +0000 (17:46 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Wed, 23 Jun 2021 14:26:16 +0000 (10:26 -0400)
If the on-entry cache cannot properly represent a range, do not continue
trying to propagate it.

PR tree-optimization/101148
PR tree-optimization/101014
* gimple-range-cache.cc (ranger_cache::ranger_cache): Adjust.
(ranger_cache::~ranger_cache): Adjust.
(ranger_cache::block_range): Check if propagation disallowed.
(ranger_cache::propagate_cache): Disallow propagation if new value
can't be stored properly.
* gimple-range-cache.h (ranger_cache::m_propfail): New member.

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

index bdecd212691053fa53c487861f39201bf4b78b02..a377261c5c78931b5c2ffc763c188d324a9f351e 100644 (file)
@@ -731,10 +731,12 @@ ranger_cache::ranger_cache ()
       if (bb)
        m_gori.exports (bb);
     }
+  m_propfail = BITMAP_ALLOC (NULL);
 }
 
 ranger_cache::~ranger_cache ()
 {
+  BITMAP_FREE (m_propfail);
   if (m_oracle)
     delete m_oracle;
   delete m_temporal;
@@ -990,7 +992,9 @@ ranger_cache::block_range (irange &r, basic_block bb, tree name, bool calc)
 void
 ranger_cache::add_to_update (basic_block bb)
 {
-  if (!m_update_list.contains (bb))
+  // If propagation has failed for BB, or its already in the list, don't
+  // add it again.
+  if (!bitmap_bit_p (m_propfail, bb->index) &&  !m_update_list.contains (bb))
     m_update_list.quick_push (bb);
 }
 
@@ -1007,6 +1011,7 @@ ranger_cache::propagate_cache (tree name)
   int_range_max current_range;
   int_range_max e_range;
 
+  gcc_checking_assert (bitmap_empty_p (m_propfail));
   // Process each block by seeing if its calculated range on entry is
   // the same as its cached value. If there is a difference, update
   // the cache to reflect the new value, and check to see if any
@@ -1063,6 +1068,9 @@ ranger_cache::propagate_cache (tree name)
       if (new_range != current_range)
        {
          bool ok_p = m_on_entry.set_bb_range (name, bb, new_range);
+         // If the cache couldn't set the value, mark it as failed.
+         if (!ok_p)
+           bitmap_set_bit (m_propfail, bb->index);
          if (DEBUG_RANGE_CACHE) 
            {
              if (!ok_p)
@@ -1092,6 +1100,7 @@ ranger_cache::propagate_cache (tree name)
       print_generic_expr (dump_file, name, TDF_SLIM);
       fprintf (dump_file, "\n");
     }
+  bitmap_clear (m_propfail);
 }
 
 // Check to see if an update to the value for NAME in BB has any effect
index 1d2e1b9920006dac51d87958fbc783b4105f2d88..ecf63dc01b304e0a66811bd22d047a5ce8c23394 100644 (file)
@@ -121,6 +121,7 @@ private:
 
   void propagate_updated_value (tree name, basic_block bb);
 
+  bitmap m_propfail;
   vec<basic_block> m_workback;
   vec<basic_block> m_update_list;
 };
This page took 0.063664 seconds and 5 git commands to generate.