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! >>>