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