]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
path solver: Use only one ssa_global_cache.
authorAldy Hernandez <aldyh@redhat.com>
Mon, 29 Nov 2021 13:49:59 +0000 (14:49 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Wed, 1 Dec 2021 16:11:12 +0000 (17:11 +0100)
We're using a temporary range cache while computing ranges for PHIs to
make sure the real cache doesn't get set until all PHIs are computed.
With the ltrans beast in LTO mode this causes undue overhead.

Since we already have a bitmap to indicate whether there's a cache
entry, we can avoid the extra cache object by clearing it while PHIs
are being calculated.

gcc/ChangeLog:

PR tree-optimization/103409
* gimple-range-path.cc (path_range_query::compute_ranges_in_phis):
Do all the work with just one ssa_global_cache.
* gimple-range-path.h: Remove m_tmp_phi_cache.

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

index b9c71226c1c7ff2999f73d5bbc5b4edf07ba4fa8..15ef72fd4925a464c6c3f177c491711831a16005 100644 (file)
@@ -375,30 +375,29 @@ void
 path_range_query::compute_ranges_in_phis (basic_block bb)
 {
   int_range_max r;
-  gphi_iterator iter;
+  auto_bitmap phi_set;
 
   // PHIs must be resolved simultaneously on entry to the block
   // because any dependencies must be satistifed with values on entry.
   // Thus, we calculate all PHIs first, and then update the cache at
   // the end.
 
-  m_tmp_phi_cache.clear ();
-  for (iter = gsi_start_phis (bb); !gsi_end_p (iter); gsi_next (&iter))
+  for (auto iter = gsi_start_phis (bb); !gsi_end_p (iter); gsi_next (&iter))
     {
       gphi *phi = iter.phi ();
       tree name = gimple_phi_result (phi);
 
       if (import_p (name) && range_defined_in_block (r, name, bb))
-       m_tmp_phi_cache.set_global_range (name, r);
-    }
-  for (iter = gsi_start_phis (bb); !gsi_end_p (iter); gsi_next (&iter))
-    {
-      gphi *phi = iter.phi ();
-      tree name = gimple_phi_result (phi);
-
-      if (m_tmp_phi_cache.get_global_range (r, name))
-       set_cache (r, name);
+       {
+         unsigned v = SSA_NAME_VERSION (name);
+         set_cache (r, name);
+         bitmap_set_bit (phi_set, v);
+         // Pretend we don't have a cache entry for this name until
+         // we're done with all PHIs.
+         bitmap_clear_bit (m_has_cache_entry, v);
+       }
     }
+  bitmap_ior_into (m_has_cache_entry, phi_set);
 }
 
 // Compute ranges defined in the current block, or exported to the
index 57a9ae9bdcd86192d180abd3fd74583330cfe1dd..77c92c07bc130a56c06d01bba565a2ed644fdb62 100644 (file)
@@ -82,8 +82,6 @@ private:
   // Range cache for SSA names.
   ssa_global_cache *m_cache;
 
-  ssa_global_cache m_tmp_phi_cache;
-
   // Set for each SSA that has an active entry in the cache.
   bitmap m_has_cache_entry;