Richard Biener <richard.guent...@gmail.com> 于2023年10月21日周六 18:23写道:
>
>
>
> > 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.

Hi Riichard:

Thanks for your replying again.

I choose to clone the IPA reference summaries manually finally and it
works well. But I find the real problem while doing that. The 'foo' in
my real case is going to change the TU but not for real. Like the code
below:

int glob;
void foo() {
  int tmp = glob;
  glob = 12; //
  // do other things that may use glob
  // ...
  glob = tmp; // glob is back
}

So in this case, the condition below will trap (at: 'bitmap_bit_p
(written, id)'), so I think I have to write another IPA Pass to deal
with the situation and pass the information to the conditions here. Or
is there a better way?

if (node
  && (id = ipa_reference_var_uid (base)) != -1
  && (written = ipa_reference_get_written_global (node))
  && !bitmap_bit_p (written, id))
  return false;

Thanks
Hanke Zhang

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

Reply via email to