> Am 28.11.2023 um 18:38 schrieb Jan Hubicka <hubi...@ucw.cz>:
> 
> 
>> 
>> 
>> 
>>>> Am 28.11.2023 um 17:59 schrieb Jan Hubicka <hubi...@ucw.cz>:
>>> 
>>> 
>>>> 
>>>>> On Tue, 28 Nov 2023, Martin Jambor wrote:
>>>>> 
>>>>> On Tue, Nov 28 2023, Richard Biener wrote:
>>>>>> On Mon, 27 Nov 2023, Martin Jambor wrote:
>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> The enhancement to address PR 109849 contained an importsnt thinko,
>>>>>>> and that any reference that is passed to a function and does not
>>>>>>> escape, must also not happen to be aliased by the return value of the
>>>>>>> function.  This has quickly transpired as bugs PR 112711 and PR
>>>>>>> 112721.
>>>>>>> 
>>>>>>> Just as IPA-modref does a good enough job to allow us to rely on the
>>>>>>> escaped set of variables, it sems to be doing well also on updating
>>>>>>> EAF_NOT_RETURNED_DIRECTLY call argument flag which happens to address
>>>>>>> exactly the situation we need to avoid.  Of course, if a call
>>>>>>> statement ignores any returned value, we also do not need to check the
>>>>>>> flag.
>>>>>> 
>>>>>> But what about EAF_NOT_RETURNED_INDIRECTLY?  Don't you need to
>>>>>> verify the parameter doesn't escape through the return at all?
>>>>>> 
>>>>> 
>>>>> I thought EAF_NOT_RETURNED_INDIRECTLY prohibits things like "return
>>>>> param->next" but those are not a problem (whatever next points to cannot
>>>>> be an SRA candidate and any ADDR_EXPR storing its address there would
>>>>> trigger a disqualification or at least an assert).  But I guess I am
>>>>> wrong, what is actually the exact meaning of the flag?
>>>> 
>>>> I thought it's return (x.ptr = param, &x);
>>>> 
>>>> so the parameter is reachable from the return value.
>>>> 
>>>> But let's Honza answer...
>>> It is same difference as direct/indirect escape. so it check whether
>>> values pointed to by arg can be possibly returned.  Indeed maybe we
>>> should think of better name - the other interpretation did not even
>>> occur to me, but it makes sense.
>> 
>> So does the directly returned flag cover my interpretation of indirect or is 
>> there a hole?
> 
> Stores goes through:
> 
>          /* Handle *lhs = name.  */
>          if (assign && gimple_assign_rhs1 (assign) == name)
>            {                             
>              if (dump_file)             
>                fprintf (dump_file, "%*s  ssa name saved to memory\n",
>                         m_depth * 4, "");
>              m_lattice[index].merge (0);
>            }
> 
> So we give up on any flags.  So far modref does not try to track values
> in memory at all. I suppose PTA info does not help me here, since the
> memory values is stored to may not escape but later it may be read and
> copied into something that does escape?

Yeah, we currently don’t track (reliably) what parameters point to and whether 
that escapes.  Or rather, you can’t query this info.

Richard 

> Honza
>> 
>> Richard
>> 
>>> Honza
>>>> 
>>>> Richard.

Reply via email to