https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99862
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Zhendong Su from comment #1) > [578] % gcctk -O1 -S -o O1.s small.c > [579] % gcctk -O3 -S -o O3.s small.c > [580] % > [580] % wc O1.s O3.s > 22 43 410 O1.s > 37 77 682 O3.s > 59 120 1092 total > [581] % > [581] % grep foo O1.s > [582] % grep foo O3.s > call foo > [583] % > [583] % cat small.c > extern void foo(void); > static int a, b; > static void c() { > if (a) { > foo(); > for (; b < 1; b++) > ; > } > } > int main() { > c(); > c(); > return 0; > } This is another case of failing to elide a no longer called function. We end up partially inlining c() at -O3, inlining the if (a) head and thus we eliminate the calls to c() in main rather than the call to foo in c(). I'd say the -O3 result is superior but still we fail to remove the c.part() function definition from the assembly. We have duplicates for this case.