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?

Thanks
Hanke Zhang

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

Reply via email to