On Wed, Jan 23, 2013 at 8:12 PM, Uday Khedker <u...@cse.iitb.ac.in> wrote: > Hi Richard, > > I am trying to understand the full implications of your statement: > > >>> Yes, that's what I say. Any pointer that is dereferenced is first >>> copied to >>> an SSA name. Basically everything residing in memory first has to be >>> loaded to an SSA name before it can be dereferenced. That load is >>> explicit >>> in the IL > > There are many parts and let me take one by one: > > - You talk about dereference. So a statement p=q would not mean loading > q into memory. Had q been a global scalar variable, it would have been > loaded into an SSA name. Then why is it not loaded when it is global > pointer. Why a load only for p=*q and not for p=q?
If q is a global pointer it is of course also first loaded into an SSA name. > - When we have p=*q, agreed that we are loading a value from memory but > then it is *q that is being loaded. Why should an SSA name be created > for q even when q is a local pointer? If q is a local pointer that does not have its address taken then it will be in SSA form. If it is not in SSA form then q is first loaded into an SSA name before it can be dereferenced. > > What am I missing? If I remember the discussion correctly it was about where to put points-to results. I said that fully flow-sensitive points-to info can be attached to SSA name definitions via SSA_NAME_PTR_INFO (as it is done now) and that this is the only place where we are looking at this information via the alias oracle. Because all indirect memory references - which are those with a non-trivial points-to set - happen through an SSA name pointer. The existing points-to solver of course keeps points-to sets for more things internally to be able to precisely deal with (sub-)memory objects. Internally it does so in a flow-insensitive way. At the end of the solving process all is translated to points-to solutions for the existing SSA name pointers in the program. Maybe that clarifies my answer - if not, can you re-phrase your question again? Thanks, Richard. > Uday. > > On Friday 12 October 2012 03:25 PM, Uday P. Khedker wrote: >> >> Excellent! Thanks. >> >> Uday. >> >> Richard Biener wrote, On Friday 12 October 2012 03:20 PM: >>> >>> On Fri, Oct 12, 2012 at 11:46 AM, Uday P. Khedker >>> <u...@cse.iitb.ac.in> wrote: >>>> >>>> >>>> >>>> Richard Biener wrote, On Friday 12 October 2012 02:51 PM: >>>> >>>>> >>>>> we _always_ see >>>>> >>>>> ssa_name_1 = a; >>>>> use (ssa_name_1); >>>>> >>>>> so you have a place to associate your flow-sensitive and >>>>> context-sensitive >>>>> points-to-info with (the SSA name). My point is that for _using_ the >>>>> points-to info flow-sensitivity provided by SSA form is enough. For >>>>> computing >>>>> it you of course need to flow-sensitively process assignments to 'a'. >>>> >>>> >>>> >>>> This is VERY interesting! I had not thought about the difference between >>>> computing >>>> and using values. Now that you point it out, I think all we need to >>>> do is to >>>> map >>>> flow-sensitively computed values to ssa names. >>>> >>>> What about variables that do not have ssa names? Or are you saying >>>> that all >>>> such >>>> variables would be copied into an artificial variables that have ssa >>>> names? >>>> I seem >>>> to observe this in the dumps but I don't know if it holds in general. >>> >>> >>> Yes, that's what I say. Any pointer that is dereferenced is first >>> copied to >>> an SSA name. Basically everything residing in memory first has to be >>> loaded to an SSA name before it can be dereferenced. That load is >>> explicit >>> in the IL so you should already compute points-to sets for the SSA name >>> destination of the load. >>> >>> Richard. >>> >>> >>>> Uday.