On 4/11/23 05:21, Richard Biener via Gcc-patches wrote:
On Wed, Apr 5, 2023 at 11:53 PM Jeff Law via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:


On 4/5/23 14:10, Andrew MacLeod via Gcc-patches wrote:
When a statement is first processed, any SSA_NAMEs that are dependencies
are cached for quick future access.

if we ;later rewrite the statement (say propagate a constant into it),
its possible the ssa-name in this cache is no longer active.   Normally
this is not a problem, but the changed to may_recompute_p forgot to take
that into account, and was checking a dependency from the cache that was
in the SSA_NAME_FREE_LIST. It thus had no SSA_NAME_DEF_STMT when we were
expecting one.

This patch simply rejects dependencies from consideration if they are in
the free list.

Bootstrapping on x86_64-pc-linux-gnu  and presuming no regressio0ns, OK
for trunk?
eek.  So you've got a released name in the cache?  What happens if the
name gets released, then re-used?  Aren't you going to get bogus results
in that case?

Its not a real cache..  its merely a statement shortcut in dependency analysis to avoid re-parsing statements every time we look at them for dependency analysis

It is not suppose to be used for anything other than dependency checking.   ie, if an SSA_NAME changes, we can check if it matches either of the 2 "cached" names on this DEF, and if so, we know this name is stale.  we are never actually suppose to use the dependency cached values to drive anything, merely respond to the question if either matches a given name.   So it doesnt matter if the name here has been freed


We never re-use SSA names from within the pass releasing it.  But if
the ranger cache
persists across passes this could be a problem.  See


This particular valueswould never persist beyond a current pass.. its just the dependency chains and they would get rebuilt every time because the IL has changed.


flush_ssaname_freelist which
for example resets the SCEV hash table which otherwise would have the
same issue.

IIRC ranger never outlives a pass so the patch should be OK.

_But_ I wonder how ranger gets at the tree SSA name in the first place - usually
caches are indexed by SSA_NAME_VERSION (because that's cheaper and


Its stored when we process a statement the first time when building dependency chains.  All comparisons down the road for staleness/dependency chain existence are against a pointer.. but we could simple change it to be an "unsigned int",  we'd then just have to compare again SSA_NAME_VERSION(name) instead..


better than a pointer to the tree) and ssa_name (ver) will return NULL
for released
SSA names.  So range_def_chain::rdc could be just

   struct rdc {
    int ssa1;           // First direct dependency
    int ssa2;           // Second direct dependency
    bitmap bm;           // All dependencies
    bitmap m_import;
   };

and ::depend1 return ssa_name (m_def_chain[v].ssa1) and everything woul
if the ssa-name is no longer in existence, does ssa_name (x) it return NULL?
work automatically (and save 8 bytes of storage).

Richard.

jeff

Reply via email to