> I think it is because during early opts we do not know if f is not > modified by atoi call and at IPA time (where we already know that from > resolution info) we do not have jump functions to track global variables.
I confirm that if I remove the calls to atoi, the function is correctly inlined. Note however that, if I declare f as static, such as it can theoretically not be impacted by atoi, the compiler still doesn't inline the function. Yet, if STEP 1 was an issue, and that your answers has provided some clarification, what is about the STEP 2? As far as I know, it is not supported, it is? Frédéric Recoules ----- Mail original ----- De: "Jan Hubicka" <hubi...@ucw.cz> À: "Richard Biener" <richard.guent...@gmail.com> Cc: "gcc" <gcc@gcc.gnu.org>, "FRÉDÉRIC RECOULES" <frederic.recou...@univ-grenoble-alpes.fr>, mjam...@suse.cz Envoyé: Samedi 14 Mars 2020 14:05:07 Objet: Re: Thought on inlining indirect function calls > >I was pretty disappointed to see that even if the compiler knows we are > >calling f_add, it doesn't inline the call (it ends up with "call > >f_add"). > > It's probably because we know it's only called once and thus not performance > relevant. Try put it into a loop. I think it is because during early opts we do not know if f is not modified by atoi call and at IPA time (where we already know that from resolution info) we do not have jump functions to track global variables. Honza > > Richard. > > >I can but only suppose it is because its address is taken and from a > >blind black box user perspective, it doesn't sound too difficult to > >completely inline it. > > > >STEP 2: statically known as being among a pool of less than > > (arbitrarily fixed = 2) N functions > > > >#include <stdlib.h> > >#include <stdio.h> > >#include <string.h> > > > >int main (int argc, char *argv[]) > >{ > > int x, y, z; > > enum f_e e; > > if (argc < 4) return -1; > > if (strcmp(argv[1], "add") == 0) > > e = ADD; > > else if (strcmp(argv[1], "sub") == 0) > > e = SUB; > > else return -1; > > f_init(e); > > x = atoi(argv[2]); > > y = atoi(argv[3]); > > z = f(x, y); > > printf("%d\n", z); > > return 0; > >} > > > >Here the compiler can't know at compile time the function that will be > >called but I suppose that it knows that it will be either f_add or > >f_sub. > >A simple work around would be for the compiler to test at the call site > >the value of f and inline the call thereafter: > > > > if (f == &f_add) > > z = f_add(x, y); > > else if (f == &f_sub) > > z = f_sub(x, y); > > else __builtin_unreachable(); /* or z = f(x, y) to be conservative */ > > > >Once again, this transformation don't sound too complicated to > >implement. > >Still, easy to say-so without diving into the compiler's code. > > > > > >I hope it will assist you in your reflections, > >Have a nice day, > >Frédéric Recoules >