Hi Richi,
I have another question about PTA that may or may not be related to the last
week's question.
I'm debugging a difference between what my Steensgaard-style solver and what
GCC's Andersen-style solver compute. In particular on my testcase (gcc_r from
2017 SPEC CPU) Steensgaard computes these sets...
ix86_encode_section_info.clobber = { }
ix86_encode_section_info.use = { }
ix86_encode_section_info.result = { }
ix86_encode_section_info.arg0 = { NULL ANYTHING STRING ESCAPED N ...
ix86_encode_section_info.arg1 = { NULL ANYTHING STRING ESCAPED N ...
ix86_encode_section_info.arg2 = { }
...while Steensgaard computes this:
ix86_encode_section_info.clobber = { NULL ANYTHING p p }
ix86_encode_section_info.use = { NULL ANYTHING p p }
ix86_encode_section_info.result = { NULL ANYTHING p p }
ix86_encode_section_info.arg0 = { NULL ANYTHING p p }
ix86_encode_section_info.arg1 = { NULL ANYTHING p p }
ix86_encode_section_info.arg2 = { NULL ANYTHING p p }
To figure out how Andersen arrived at these sets I searched the IPA PTA dump
for constraints involving ix86_encode_section_info*. I found only these...
Generating constraints for ix86_encode_section_info/332
(ix86_encode_section_info)
_18 = *ix86_encode_section_info.arg1
_19 = *ix86_encode_section_info.arg1 + 64
_24 = *ix86_encode_section_info.arg0
*_26 + 5 = ix86_encode_section_info.arg0
_30 = *ix86_encode_section_info.arg0
_31 = *ix86_encode_section_info.arg0 + 1165
_32 = *ix86_encode_section_info.arg0 + 1160
*_38 + 5 = ix86_encode_section_info.arg0
_41 = *ix86_encode_section_info.arg0
_44 = *ix86_encode_section_info.arg0 + 472
_46 = *ix86_encode_section_info.arg0 + 24
_1 = *ix86_encode_section_info.arg0
_2 = *ix86_encode_section_info.arg0 + 24
_4 = *ix86_encode_section_info.arg0 + 472
_55 = *ix86_encode_section_info.arg0
_56 = *ix86_encode_section_info.arg0 + 1024
_60 = *ix86_encode_section_info.arg0 + 128
_17 = *ix86_encode_section_info.arg1 + 64
...which is strange. I don't see any assigning into ix86_encode_section_info*
nor assigning &ix86_encode_section_info* into any other set. Shouldn't then
Andersen compute empty sets for all of these? (Although it is a good thing
that Andersen fills those sets. Otherwise, there would be a miscompilation.
I just want to understand what is it that my solver fails to do here.)
First explanation I came up with was expanding of ix86_encode_section_info (the
fninfo) using '+ UNKNOWN' that we discussed last week. But
ix86_encode_section_info is not present in any constraint at all so it cannot
be present in any pt set and therefore it cannot get expanded this way.
Note that ix86_encode_section_info is only ever called indirectly through a
function pointer targetm.encode_section_info. That may be relevant here, I
think.
Do you have any hunch about what is going on here? How does the Andersen
solver decide to fill those sets?
Cheers,
Filip
Btw, here is another thing I'm confused about:
ix86_encode_section_info is a non-pointer variable, eliminating edges.
ix86_encode_section_info.clobber is a non-pointer variable, eliminating edges.
ix86_encode_section_info.use is a non-pointer variable, eliminating edges.
ix86_encode_section_info.result is a non-pointer variable, eliminating edges.
ix86_encode_section_info.arg0 is a non-pointer variable, eliminating edges.
ix86_encode_section_info.arg1 is a non-pointer variable, eliminating edges.
ix86_encode_section_info.arg2 is a non-pointer variable, eliminating edges.
ix86_encode_section_info.arg1 is a non-pointer variable, ignoring
constraint:_18 = *ix86_encode_section_info.arg1
ix86_encode_section_info.arg1 is a non-pointer variable, ignoring
constraint:_19 = *ix86_encode_section_info.arg1 + 64
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_24 = *ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:*_26 + 5 = ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_30 = *ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_31 = *ix86_encode_section_info.arg0 + 1165
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_32 = *ix86_encode_section_info.arg0 + 1160
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:*_38 + 5 = ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_41 = *ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_44 = *ix86_encode_section_info.arg0 + 472
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_46 = *ix86_encode_section_info.arg0 + 24
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring constraint:_1
= *ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring constraint:_2
= *ix86_encode_section_info.arg0 + 24
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring constraint:_4
= *ix86_encode_section_info.arg0 + 472
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_55 = *ix86_encode_section_info.arg0
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_56 = *ix86_encode_section_info.arg0 + 1024
ix86_encode_section_info.arg0 is a non-pointer variable, ignoring
constraint:_60 = *ix86_encode_section_info.arg0 + 128
ix86_encode_section_info.arg1 is a non-pointer variable, ignoring
constraint:_17 = *ix86_encode_section_info.arg1 + 64
The Andersen dump says that ix86_encode_section_info.arg1 is a non-pointer
variable. That's weird since the second argument is of type rtx and that's a
pointer to rtx_def.