Thought on inlining indirect function calls
FRÉDÉRIC RECOULES
frederic.recoules@univ-grenoble-alpes.fr
Sat Mar 14 13:36:29 GMT 2020
> 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" <hubicka@ucw.cz>
À: "Richard Biener" <richard.guenther@gmail.com>
Cc: "gcc" <gcc@gcc.gnu.org>, "FRÉDÉRIC RECOULES" <frederic.recoules@univ-grenoble-alpes.fr>, mjambor@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
>
More information about the Gcc
mailing list