> Am 21.10.2023 um 10:58 schrieb Hanke Zhang <hkzhang...@gmail.com>:
> 
> Richard Biener <richard.guent...@gmail.com> 于2023年10月20日周五 23:27写道:
>> 
>> 
>> 
>>>> Am 20.10.2023 um 16:33 schrieb Hanke Zhang <hkzhang...@gmail.com>:
>>> 
>>> Richard Biener <richard.guent...@gmail.com> 于2023年10月20日周五 21:33写道:
>>>> 
>>>>> On Fri, Oct 20, 2023 at 1:48 PM Hanke Zhang via Gcc <gcc@gcc.gnu.org> 
>>>>> wrote:
>>>>> 
>>>>> Hi, I'm trying to make pass_fre work better for me. But I got a
>>>>> problem. Like the code below:
>>>>> 
>>>>> int glob;
>>>>> 
>>>>> void __attribute__((oninline))
>>>>> foo() {
>>>>> // do nothing meaningful
>>>>> }
>>>>> 
>>>>> int main() {
>>>>> if (glob) {
>>>>>   foo();
>>>>> } else {
>>>>>   // do something that won't change glob
>>>>> }
>>>>> 
>>>>> if (glob) {
>>>>>   foo();
>>>>> } else {
>>>>>   // do something that won't change glob
>>>>> }
>>>>> }
>>>>> 
>>>>> I'm trying to merge the two if blocks. And of course it won't work. I
>>>>> see the code in tree-ssa-structalias.cc, it will do this check:
>>>>> 
>>>>> static bool
>>>>> pt_solution_includes_1 (struct pt_solution *pt, const_tree decl) {
>>>>> // xxxx
>>>>> if (pt->nonlocal
>>>>>     && is_global_var (decl))
>>>>>   return true;
>>>>> // xxxx
>>>>> }
>>>>> 
>>>>> So the pt->nonlocal will prevent the merge. I would like to ask if I
>>>>> can make this check less rigid by providing more information about
>>>>> function foo(). Because obviously the foo function does not change the
>>>>> value of glob here, but it is caused by the fact that it is noinline.
>>>>> 
>>>>> So if I can prove that foo won't change glob and pass this infomation
>>>>> to this check, my goal was achieved. Is this possible?
>>>> 
>>>> In case 'glob' were static IPA reference has this info and we'd already
>>>> use it from call_may_clobber_ref_p.  There's IPA mod-ref which is
>>>> a bit more powerful than IPA reference but I think it does not record
>>>> this precise info.
>>>> 
>>>> Note that the problem with non-static globals is that we do not know
>>>> whether they get modified indirectly because they might have their
>>>> address take in another TU and that address passed back into the TU.
>>>> Usually using LTO helps here and we can promote the decl to hidden
>>>> visibility.
>>> 
>>> Hi Richard:
>>> 
>>> Thanks for your replying.
>>> 
>>> Yeah, I know that. (We do not know whether they get modified
>>> indirectly because they might have their address take in another TU
>>> and that address passed back into the TU.)
>>> 
>>> But I think in my case, I think I have to let go of some security
>>> concerns. And LTO is enabled already in my case, but that doesn't
>>> help.
>> 
>> It’s not security it’s correctness.
>> 
>>> 
>>> So I can understand that the information includes whether Foo uses
>>> glob directly is actually used, but for security reasons, GCC does not
>>> use it as a basis here (pt_solution_includes_1). Right?
>> 
>> I don’t think this function is the correct place for the fix.  I’d instead 
>> put it into …
>> 
>>> So if I want to change the default behavior of GCC, can I use
>>> call_may_clobber_ref_p to check out and
>> 
>> … this function where it would be more targeted.
>> 
>> As said, you are going to miscompile valid code.  Note it should be possible 
>> to enhance IPA reference dependent on how foo actually looks like (like if 
>> there are no pointer based accesses in it).
> 
> Hi Richard:
> 
> Thanks. I understand it now. But I got another problem while handling
> this. I create new nodes from existing nodes in my own passes which
> are located at all_late_ipa_passes. So when I tried to get the
> ipa_reference_optimization_summary in pass_fre, I got nothing because
> old nodes were replaced by the new nodes I created before. Is there a
> way that I can get the ipa_reference_summay via my new nodes? The main
> code of getting ipa_reference_summary is here:
> 
> written = ipa_reference_get_written_global (node);
> 
> Or is it because I'm replacing nodes in the wrong way?

Maybe there’s a possibility to create IPA reference info for late introduced 
clones, Honza might be of help here.  Any reason your pass cannot run during 
regular IPA processing?  If your clones do not semantically differ you could 
possibly clone the IPA reference summaries manually.

Richard 

> 
> Thanks
> Hanke Zhang
> 
>> 
>> Richard.
>> 
>>> make it merge here?
>>> 
>>> Thanks
>>> Hanke Zhang
>>> 
>>>> 
>>>> Richard.
>>>> 
>>>>> 
>>>>> Thanks
>>>>> Hanke Zhang

Reply via email to