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.


?

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