On Thu, Nov 11, 2021 at 1:42 PM Jan Hubicka <hubi...@kam.mff.cuni.cz> wrote: > > Hi, > > > > No, I think if it turns out useful then we want a way to have such ref > > represented by an ao_ref. Note that when we come from a > > ref tree we know handled-components only will increase offset, > > only the base MEM_REF can contain a pointer subtraction (but > > the result of that is the base then). > > Yep, that is why I introduced the parm_offset at first place - it can be > negative or unknown... > > > > In what cases does parm_offset_known end up false? Is that > > when seeing a POINTER_PLUS_EXPR with unknown offset? > > Yep, a typical example is a loop with pointer walking an array . > > > So yes, that's a case we cannot capture right now - the only > > thing that remains is a pointer with a known points-to-set - a > > similar problem as with the pure call PRE. You could in theory > > allocate a scratch SSA name and attach points-to-info > > to it. And when the call argument is &decl based then you could set > > offset to zero. > > Hmm, I could try to do this, but possibly incrementally?
You mean handle a &decl argument specially for unknown param offset? Yeah, I guess so. > Basically I want to have > > foo (&decl) > decl = {} > > To be matched since even if I do not know the offset I know it is dead > after end of lifetime of the decl. I am not quite sure PTA will give me > that? for this case PTA should tell you the alias is to 'decl' only but then I'm not sure if stmt_kills_ref_p is up to the task to determine that 'decl = {}', from a quick look it doesn't. So indeed the only interesting case will be a &decl based parameter which we can special-case. > > > It was my initial plan. However I was not sure how much I would get from > > > that. > > > > > > The function starts with: > > > > > > /* Don't return early on *this_2(D) ={v} {CLOBBER}. */ > > > if (gimple_has_volatile_ops (stmt) > > > && (!gimple_clobber_p (stmt) > > > || TREE_CODE (gimple_assign_lhs (stmt)) != MEM_REF)) > > > return; > > > > > > ao_ref ref; > > > if (!initialize_ao_ref_for_dse (stmt, &ref)) > > > return; > > > > > > The check about clobber does not apply to calls and then it gives up on > > > functions not returning aggregates (that is a common case). > > > > > > For functions returing aggregates it tries to prove that retval is dead > > > and replace it. > > > > > > I guess I can simply call my analysis from the second return above and > > > from the code removing dead LHS call instead of doing it from the main > > > walker and drop the LHS handling? > > > > Yeah, something like that. > OK, I will prepare updated patch, thanks! > > Honza > > > > Richard. > > > > > Thank you, > > > Honza > > > > > > > > Thanks, > > > > Richard. > > > > > > > > > + } > > > > > else if (def_operand_p > > > > > def_p = single_ssa_def_operand (stmt, > > > > > SSA_OP_DEF)) > > > > > {