ipa pta: How did this .arg1 pt set get filled?
Filip Kastl <[email protected]> Mon, 29 Jun 2026 11:57:49 +0200
| Newsgroups | gmane.comp.gcc.devel |
|---|---|
| Message-ID | <[email protected]> |
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.