On August 25, 2020 6:36:19 PM GMT+02:00, Erick Ochoa 
<erick.oc...@theobroma-systems.com> wrote:
>
>
>On 25/08/2020 17:19, Erick Ochoa wrote:
>> 
>> 
>> On 25/08/2020 17:10, Richard Biener wrote:
>>> On August 25, 2020 3:09:13 PM GMT+02:00, Erick Ochoa 
>>> <erick.oc...@theobroma-systems.com> wrote:
>>>> Hi,
>>>>
>>>> I'm trying to understand how the escape analysis in IPA-PTA works.
>I
>>>> was
>>>> testing a hypothesis where if a structure contains an array of
>>>> characters and this array of characters is passed to fopen, the
>>>> structure and all subfields will escape.
>>>>
>>>> To do this, I made a program that has a global structure variable
>foo2
>>>> that is has a field passed as an argument to fopen. I also made
>another
>>>>
>>>> variable foo whose array is initialized by the result of rand.
>>>>
>>>> However, after compiling this program with -flto
>-flto-partition=none
>>>> -fipa -fdump-ipa-pta -fdump-tree-all-all -Ofast (gcc --version
>10.2.0)
>>>>
>>>> E.g.
>>>>
>>>> #include <stdio.h>
>>>> #include <math.h>
>>>> #include <string.h>
>>>>
>>>> struct foo_t {
>>>>    char buffer1[100];
>>>>    char buffer2[100];
>>>> };
>>>>
>>>> struct foo_t foo;
>>>> struct foo_t foo2;
>>>>
>>>> int
>>>> main(int argc, char** argv)
>>>> {
>>>>
>>>>    fopen(foo2.buffer1, "r");
>>>>    for (int i = 0; i < 100; i++)
>>>>    {
>>>>      foo.buffer1[i] = rand();
>>>>    }
>>>>    int i = rand();
>>>>    int retval = foo.buffer1[i % 100];
>>>>    return retval;
>>>> }
>>>>
>>>> I see the PTA dump state the following:
>>>>
>>>> ESCAPED = { STRING ESCAPED NONLOCAL foo2 }
>>>> foo = { ESCAPED NONLOCAL }
>>>> foo2 = { ESCAPED NONLOCAL }
>>>>
>>>> which I understand as
>>>> * something externally visible might point to foo2
>>>> * foo2 might point to something externally visible
>>>> * foo might point to something externally visible
>>>
>>> Yes. So it's exactly as your hypothesis.
>>>
>>>> I have seen that global variables are stored in the .gnu.lto_.decls
>LTO
>>>>
>>>> file section. In the passes I have worked on I have ignored global
>>>> variables. But can foo and foo2 be marked as escaping because the
>>>> declarations are not streamed in yet? Or is there another reason I
>am
>>>> not seeing? I am aware of aware of the several TODOs at the
>beginning
>>>> of
>>>> gcc/tree-ssa-structalias.c but I am unsure if they contribute to
>these
>>>> variables being marked as escaping. (Maybe TODO 1 and TODO 2?)
>>>
>>> Not sure what the problem is. Foo2 escapes because it's address is 
>>> passed to a function.
>>>
>> 
>> foo2 is not the problem, it is foo. foo is not passed to a function
>and 
>> it is also escaping.
>
>
>Sorry, I meant: foo might point to something which is externally 
>visible. Which I don't think is the case in the program. I understand 
>this might be due to the imprecision in the escape-analysis and what
>I'm 
>trying to find out is the source of imprecision.

Foo is exported and thus all function calls can store to it making it point to 
escaped and nonlocal variables. 

Richard. 

>> 
>>> ?
>>>
>>> Richard.
>>>
>>>> Just FYI, I've been reading:
>>>> * Structure Aliasing in GCC
>>>> * Gimple Alias Improvements for GCC 4.5
>>>> * Memory SSA - A Unified Approach for Sparsely Representing Memory
>>>> Operations
>>>>
>>>> Thanks, I appreciate all help!
>>>

Reply via email to