diff mbox series

[COMMITTED,2/2] tree-optimization/101148 - Do not continue propagating values which cannot be set properly.

Message ID 84b8a37c-c633-385d-bbfa-00da1cf99064@redhat.com
State New
Headers show
Series [COMMITTED,1/2] Adjust on_entry cache to indicate if the value was set properly. | expand

Commit Message

Andrew MacLeod June 23, 2021, 2:27 p.m. UTC
As described in PR 101014, this patch should fix both PRs.

The cache propagation engine works by combining incoming ranges to a 
block and if that is different than that current on-entry range, 
proceeds to push this new value on outgoing edges.

What was happening here is this new value that was calculated was beyond 
the 15 allowed by the sparse bitmap implem,entation. When it was stored, 
it was storing a different value (VARYING).  This block was in a cycle 
feeding back to itself.  When it calculated the on-entry value again and 
compared, it thought it needed to update again.  Which of course failed 
again... and the endless loop of trying to propagate was born.

This patch checks that the value being stored to the cache was 
successful.  If it was not, then this block is flagged to deny future 
attempts to propagate from this block (during this update cycle).

Bootstrap on x86_64-pc-linux-gnu with no regressions.  pushed.

Andrew
diff mbox series

Patch

From a03e944e92ee51ae583382079d4739b64bd93b35 Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <amacleod@redhat.com>
Date: Tue, 22 Jun 2021 17:46:05 -0400
Subject: [PATCH 3/4] Do not continue propagating values which cannot be set
 properly.

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 | 11 ++++++++++-
 gcc/gimple-range-cache.h  |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index bdecd212691..a377261c5c7 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -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
diff --git a/gcc/gimple-range-cache.h b/gcc/gimple-range-cache.h
index 1d2e1b99200..ecf63dc01b3 100644
--- a/gcc/gimple-range-cache.h
+++ b/gcc/gimple-range-cache.h
@@ -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;
 };
-- 
2.17.2