diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2023-04-25 15:33:52 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2023-04-26 15:17:08 -0400 |
commit | 40c7f943e882e8c5eccf45fc28146559f446764d (patch) | |
tree | 395f93c6cc9d44f9c3f82122efb30daccfd795d1 | |
parent | 469b655b30dae58b41232b0dea5d1ccc072356a9 (diff) | |
download | gcc-40c7f943e882e8c5eccf45fc28146559f446764d.zip gcc-40c7f943e882e8c5eccf45fc28146559f446764d.tar.gz gcc-40c7f943e882e8c5eccf45fc28146559f446764d.tar.bz2 |
Don't save ssa-name pointer in dependency cache.
If the direct dependence fields point directly to an ssa-name,
its possible that an optimization frees an ssa-name, and the value
pointed to may now be in the free list. Simply maintain the ssa
version number instead.
PR tree-optimization/109417
* gimple-range-gori.cc (range_def_chain::register_dependency):
Save the ssa version number, not the pointer.
(gori_compute::may_recompute_p): No need to check if a dependency
is in the free list.
* gimple-range-gori.h (class range_def_chain): Change ssa1 and ssa2
fields to be unsigned int instead of trees.
(ange_def_chain::depend1): Adjust.
(ange_def_chain::depend2): Adjust.
* gimple-range.h: Include "ssa.h" to inline ssa_name().
-rw-r--r-- | gcc/gimple-range-gori.cc | 8 | ||||
-rw-r--r-- | gcc/gimple-range-gori.h | 14 | ||||
-rw-r--r-- | gcc/gimple-range.h | 1 |
3 files changed, 15 insertions, 8 deletions
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc index d77e1f5..5bba77c 100644 --- a/gcc/gimple-range-gori.cc +++ b/gcc/gimple-range-gori.cc @@ -182,9 +182,9 @@ range_def_chain::register_dependency (tree name, tree dep, basic_block bb) // Set the direct dependency cache entries. if (!src.ssa1) - src.ssa1 = dep; - else if (!src.ssa2 && src.ssa1 != dep) - src.ssa2 = dep; + src.ssa1 = SSA_NAME_VERSION (dep); + else if (!src.ssa2 && src.ssa1 != SSA_NAME_VERSION (dep)) + src.ssa2 = SSA_NAME_VERSION (dep); // Don't calculate imports or export/dep chains if BB is not provided. // This is usually the case for when the temporal cache wants the direct @@ -1316,7 +1316,7 @@ gori_compute::may_recompute_p (tree name, basic_block bb, int depth) // If the first dependency is not set, there is no recomputation. // Dependencies reflect original IL, not current state. Check if the // SSA_NAME is still valid as well. - if (!dep1 || SSA_NAME_IN_FREE_LIST (dep1)) + if (!dep1) return false; // Don't recalculate PHIs or statements with side_effects. diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h index 3ea4b45..526edc2 100644 --- a/gcc/gimple-range-gori.h +++ b/gcc/gimple-range-gori.h @@ -46,8 +46,8 @@ protected: bitmap_obstack m_bitmaps; private: struct rdc { - tree ssa1; // First direct dependency - tree ssa2; // Second direct dependency + unsigned int ssa1; // First direct dependency + unsigned int ssa2; // Second direct dependency bitmap bm; // All dependencies bitmap m_import; }; @@ -66,7 +66,10 @@ range_def_chain::depend1 (tree name) const unsigned v = SSA_NAME_VERSION (name); if (v >= m_def_chain.length ()) return NULL_TREE; - return m_def_chain[v].ssa1; + unsigned v1 = m_def_chain[v].ssa1; + if (!v1) + return NULL_TREE; + return ssa_name (v1); } // Return the second direct dependency for NAME, if there is one. @@ -77,7 +80,10 @@ range_def_chain::depend2 (tree name) const unsigned v = SSA_NAME_VERSION (name); if (v >= m_def_chain.length ()) return NULL_TREE; - return m_def_chain[v].ssa2; + unsigned v2 = m_def_chain[v].ssa2; + if (!v2) + return NULL_TREE; + return ssa_name (v2); } // GORI_MAP is used to accumulate what SSA names in a block can diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h index 7ed4d38..b8ddca5 100644 --- a/gcc/gimple-range.h +++ b/gcc/gimple-range.h @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #ifndef GCC_GIMPLE_RANGE_H #define GCC_GIMPLE_RANGE_H +#include "ssa.h" #include "range.h" #include "value-query.h" #include "gimple-range-op.h" |