On Sun, Oct 1, 2023 at 6:13 AM Hanke Zhang <hkzhang...@gmail.com> wrote:
>
> Richard Biener <richard.guent...@gmail.com> 于2023年9月27日周三 15:30写道:
> >
> > On Wed, Sep 27, 2023 at 7:21 AM Hanke Zhang via Gcc <gcc@gcc.gnu.org> wrote:
> > >
> > > Thanks! I understand what you mean, then can I think that if the
> > > function here is not an external function, but a function visible to
> > > the compiler and the function doesn't modify `a`, then these two
> > > blocks can be merged?
> >
> > Yes.  The key transform you'd see before any of the merging is
> > CSE of the loads from 'a', then the rest is equivalent to the local
> > variable case.
> >
> > Richard.
>
> Hi, Richard
>
> I'm still a little confused about this.
>
> I want to change the default behavior of gcc. We know that printf
> won't change the value of 'a'. I'd like to let the compiler to get
> this information as well. How can I do that? Or which pass should I
> focus on?

GCC has a builtin for 'printf' so it can handle those specially in
builtins.cc:builtin_fnspec (see attr-fnspec.h for how the magic
strings are encoded).  If that's taught that printf cannot modify
global memory it should already work, note though ...

> By disassembling the exe file generated by icc, I found that icc will
> merge these two blocks with the example code below. So I think there
> maybe some ways to make it.

... glibc for example allows user-provided printf format callbacks so
printf might call back into the current TU and modify globals in such
callback.  That's a GNU extension to printf that ICC likely doesn't
support 
(https://www.gnu.org/software/libc/manual/html_node/Customizing-Printf.html),
so that we're currently not doing this is for correctness.

I'm not sure if this extension is much used or if it is maybe deprecated.

With LTO it _might_ be possible to check whether any of the functions
dealing with this (register_printf_function) is used.  Without LTO for
symbols with hidden visibility that do not escape the TU this analysis
can be done TU-local.

Richard.

> Thanks.
> Hanke Zhang.
>
> >
> > > Marc Glisse <marc.gli...@inria.fr> 于2023年9月27日周三 12:51写道:
> > > >
> > > > On Wed, 27 Sep 2023, Hanke Zhang via Gcc wrote:
> > > >
> > > > > Hi, I have recently been working on merging if-else statement blocks,
> > > > > and I found a rather bizarre phenomenon that I would like to ask
> > > > > about.
> > > > > A rough explanation is that for two consecutive if-else blocks, if
> > > > > their if statements are exactly the same, they should be merged, like
> > > > > the following program:
> > > > >
> > > > > int a = atoi(argv[1]);
> > > > > if (a) {
> > > > >  printf("if 1");
> > > > > } else {
> > > > >  printf("else 1");
> > > > > }
> > > > > if (a) {
> > > > >  printf("if 2");
> > > > > } else {
> > > > >  printf("else 2");
> > > > > }
> > > > >
> > > > > After using the -O3 -flto optimization option, it can be optimized as 
> > > > > follows:
> > > > >
> > > > > int a = atoi(argv[1]);
> > > > > if (a) {
> > > > >  printf("if 1");
> > > > >  printf("if 2");
> > > > > } else {
> > > > >  printf("else 1");
> > > > >  printf("else 2");
> > > > > }
> > > > >
> > > > > But `a` here is a local variable. If I declare a as a global variable,
> > > > > it cannot be optimized as above. I would like to ask why this is? And
> > > > > is there any solution?
> > > >
> > > > If 'a' is a global variable, how do you know 'printf' doesn't modify its
> > > > value? (you could know it for printf, but it really depends on the
> > > > function that is called)
> > > >
> > > > --
> > > > Marc Glisse

Reply via email to