https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115097
--- Comment #7 from Jan Hubicka <hubicka at ucw dot cz> --- > and then we inline them back, introducing the extra copy. Why do we use > tail-calls here instead of aliases? Why do we lack cost modeling here? Because the function is exported and we must keep addresses different. Cost modeling is somewhat hard here, since it is not clear what will help inliner and whether inliner will inline back. For example if we icf two function calling third function. the third one may become called once and we get better code by inlining it and eliding offline copy rather than keeping the caller duplicated. So the idea is to get code into as canonical form as possible (with no obvious duplicates) and then let the inliner heuristics to decide what should and what should not be duplicated in the final code.