On Thu, Oct 11, 2012 at 10:41 PM, Uday P. Khedker <u...@cse.iitb.ac.in> wrote:
>
>
> Andrew Pinski wrote, On Friday 12 October 2012 10:29 AM:
>
>
>>> Here's an example:
>>>
>>> main()
>>> {
>>>          int **p;
>>>          int *a, *d;
>>>          int w, x;
>>>
>>>          a = &w;
>>>          f1(a);
>>>          p = &a;
>>>          a = &x;
>>>          f2(p);
>>>          d = a;
>>>
>>>          return *d;
>>> }
>>>
>>> It is clear that d can only point to x and can never point to w.
>>
>>
>> I think you are wrong there.
>>
>> int *a1;
>> void f1(int *a)
>> {
>>    a1 = a;
>> }
>>
>> void f2(int **p)
>> {
>>    *p = a1;
>> }
>>
>> That will change a to &w after f2 is called.  So it looks like your
>> aliasing analysis does not take into account escaping like it should.
>> This is the whole point of marking a as escaped.  Maybe I missed
>> something here though but d can point w with my functions for f1 and
>> f2.
>
>
> Ah, you caught me there, but I think I can escape, at least in this
> situation :-)
>
> The call to f1 is not central to the point I am making; I had included it
> only to ensure
> that the assignment a=&w doesn't get eliminated by dead code elimination.
> Since you
> decided to hold the address of a into a1 through function f1, let me
> eliminate the
> call to f1 and make the assignment a=&w live in some other way. Here's the
> changed code:
>
>
> main()
> {
>         int **p;
>         int *a, *d;
>         int w, x;
>
>         d = &x;
>         a = &w;
>         if (f1())
>
>         {
>                 p = &a;
>                 a = &x;
>                 f2(p);
>                 d = a;
>         }
>
>         return *d + *a;
> }
>
> Now when f2 is called, a definitely does not point to w. Hence d should not
> point to w.
> And yet, the dump shows that d continue to point to w.
>
> In any case, your point about escaping variables strengthens my point about
> inappropriateness
> of SSA for pointer analysis, although not through this example.


Except the problem here is just about what f1 clobbers.  Since a has
not escaped by the time f1 is called, f1 cannot clobber a (or d).
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23384 for reference on why
GCC gets this incorrect.  GCC does not have a flow sensitive clobber
list yet.

>
> Uday.
>
>

Reply via email to