Hi richi,

I found a case where the function.clobber varinfo gets included in a points-to
set.  That shouldn't happen right?  It causes trouble for my PTA Steensgaard
project.

Here is a testcase:

---- pr35065-reduced.c ----
enum vlc_module_properties { VLC_MODULE_CB_OPEN };
char ParseNALBlock_p_frag_0;
int vlc_entry__0_9_0f_p_submodule;
void Open();
void vlc_module_set(int *, enum vlc_module_properties, void *);
void vlc_entry__0_9_0f() {
  vlc_module_set(&vlc_entry__0_9_0f_p_submodule, VLC_MODULE_CB_OPEN, Open);
}
void ParseNALBlock();
void Open() { ParseNALBlock(); }
void bs_read_ue();
void ParseNALBlock() {
  if (ParseNALBlock_p_frag_0)
    bs_read_ue();
}
---- ----

I compile it with trunk GCC using these flags:
gcc -c pr35065-reduced.c -fipa-pta -O2 -march=native -fno-inline 
-fdump-ipa-pta2-details-alias

In the dump you can see this set:
callarg(34) = { ESCAPED Open Open.clobber Open.use Open.result }

I've stepped through PTA in GDB and found that initially,
callarg(34) = { Open }
When we process the constraints callarg(34) = callarg(34) + UNKNOWN,
pta-andersen.cc:solution_set_expand() happilly expands the Open varinfo into
all the subvariables Open.clobber Open.use Open.result.

Is this intentional?

Open.clobber, Open.use, Open.result all have is_full_var = 1, but Open does
not.  What's your gut feeling about setting is_full_var = 1 for fninfos?  It
does help with this testcase but I didn't yet look through the sources to see
if it doesn't break something else.

Filip

Reply via email to