https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112372
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #7) > Created attachment 60871 [details] > Patch which I will be submitting for GCC 16 +FAIL: gcc.dg/ipa/ipa-icf-20.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-20.c scan-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->bar/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-21.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-21.c scan-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->bar/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-23.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-23.c scan-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->bar/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-25.c scan-ipa-dump icf "Equal symbols: 2" +FAIL: gcc.dg/ipa/ipa-icf-25.c scan-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->bar/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-25.c scan-ipa-dump icf "Semantic equality hit:zip/[0-9+]+->zap/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-26.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-26.c scan-ipa-dump icf "Semantic equality hit:destroy/[0-9+]+->remove/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-28.c scan-ipa-dump icf "different decl attributes" +FAIL: gcc.dg/ipa/ipa-icf-3.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-3.c scan-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->bar/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-35.c scan-ipa-dump icf "Equal symbols: 3" +FAIL: gcc.dg/ipa/ipa-icf-35.c scan-ipa-dump icf "Semantic equality hit:f1/[0-9+]+->f2/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-38.c scan-ltrans-tree-dump-not optimized "Function bar" +FAIL: gcc.dg/ipa/ipa-icf-38.c scan-wpa-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-38.c scan-wpa-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->bar/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-5.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-5.c scan-ipa-dump icf "Semantic equality hit:f1/[0-9+]+->f2/[0-9+]+" +FAIL: gcc.dg/ipa/ipa-icf-7.c scan-ipa-dump icf "Equal symbols: 1" +FAIL: gcc.dg/ipa/ipa-icf-7.c scan-ipa-dump icf "Semantic equality hit:foo/[0-9+]+->foo2/[0-9+]+" +FAIL: g++.dg/ipa/ipa-icf-2.C -std=gnu++17 scan-ipa-dump icf "Equal symbols: 1" +FAIL: g++.dg/ipa/ipa-icf-2.C -std=gnu++17 scan-ipa-dump icf "Semantic equality hit:" +FAIL: g++.dg/ipa/ipa-icf-2.C -std=gnu++26 scan-ipa-dump icf "Equal symbols: 1" +FAIL: g++.dg/ipa/ipa-icf-2.C -std=gnu++26 scan-ipa-dump icf "Semantic equality hit:" +FAIL: g++.dg/ipa/ipa-icf-2.C -std=gnu++98 scan-ipa-dump icf "Equal symbols: 1" +FAIL: g++.dg/ipa/ipa-icf-2.C -std=gnu++98 scan-ipa-dump icf "Semantic equality hit:" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++17 scan-ipa-dump icf "Equal symbols: 2" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++17 scan-ipa-dump icf "Semantic equality hit:.*bar.*->.*foo.*" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++17 scan-ipa-dump icf "Semantic equality hit:.*nula.*->.*zero.*" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++26 scan-ipa-dump icf "Equal symbols: 2" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++26 scan-ipa-dump icf "Semantic equality hit:.*bar.*->.*foo.*" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++26 scan-ipa-dump icf "Semantic equality hit:.*nula.*->.*zero.*" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++98 scan-ipa-dump icf "Equal symbols: 2" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++98 scan-ipa-dump icf "Semantic equality hit:.*bar.*->.*foo.*" +FAIL: g++.dg/ipa/ipa-icf-3.C -std=gnu++98 scan-ipa-dump icf "Semantic equality hit:.*nula.*->.*zero.*" +FAIL: g++.dg/ipa/ipa-icf-4.C -std=gnu++17 scan-ipa-dump icf "Equal symbols: [67]" +FAIL: g++.dg/ipa/ipa-icf-4.C -std=gnu++26 scan-ipa-dump icf "Equal symbols: [67]" +FAIL: g++.dg/ipa/ipa-icf-4.C -std=gnu++98 scan-ipa-dump icf "Equal symbols: [67]" Because who wrote the testcases decided not have a complex testcases. None of these ICF are useful either. ipa-icf-20.c for an example is just: ``` __attribute__ ((noinline)) float foo() { return sin(12.4f); } __attribute__ ((noinline)) float bar() { return sin(12.4f); } ``` which gets optimized to a return of a constant. So I think -fno-builtins here might be good thing to add. ipa-icf-21.c is: ``` __attribute__ ((noinline)) void foo() { float x = 1.2345f; __m128 v =_mm_load1_ps(&x); } ``` And those statements get optimized away. Maybe `-fno-tree-dce ` is needed here. I think most of these were written before we did some simple cleanups before IPA passes; I have noticed that most of the functions do become empty functions and not actually testing ICF at all. 23.c is `return 123;` which is exactly one where we don't need to do it. 25.c shows why maybe not doing ICF for functions with just a return might cause issues BUT it is artificial testcase and requires noinline and -fno-ipa-vrp (so it does cause function call be turned into a value due to return value being constant). 35.c might be another reason why NOT doing it for functions just returning is worse off; but I suspect it does not matter because a, b, c, and d all should be inlined anyways afterwards so I doubt it.