Ah and one more detail:  I'm working with all constraints involving uses and
clobbers disabled (I don't call
gimple-ssa-pta-constraints.cc:find_func_clobbers).  I'm mentioning that in case
you'd be confused that some constraints are missing.

But the mystery of why Andersen decides to fill those sets remains.

Filip

On Mon 2026-06-29 11:57:49, Filip Kastl wrote:
> 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.

Reply via email to