The test case below fails with during IPA pass: cp /home/erozen/gcc4/gcc/testsuite/gcc.dg/tree-prof/pr11111.c:93:1: internal compiler error: in good_cloning_opportunity_p, at ipa-cp.cc:3545 0x1d7ee83 good_cloning_opportunity_p /home/erozen/gcc4_objdir/../gcc4/gcc/ipa-cp.cc:3545 0x1d7fa66 estimate_local_effects /home/erozen/gcc4_objdir/../gcc4/gcc/ipa-cp.cc:3752 0x1d8098d propagate_constants_topo /home/erozen/gcc4_objdir/../gcc4/gcc/ipa-cp.cc:4080 0x1d80fa5 ipcp_propagate_stage /home/erozen/gcc4_objdir/../gcc4/gcc/ipa-cp.cc:4267 0x1d86fc5 ipcp_driver /home/erozen/gcc4_objdir/../gcc4/gcc/ipa-cp.cc:6574 0x1d87192 execute /home/erozen/gcc4_objdir/../gcc4/gcc/ipa-cp.cc:6651 #include <stdlib.h> volatile int flag; const int array_size = 10; int* array; int iterations = 10000000; #define BAR(num) \ int __attribute__((noinline)) \ bar##num (int i, int j) \ { \ if (i == 0) \ return 2*num - 1; \ else \ return 2*num; \ } BAR(1) BAR(2) BAR(3) BAR(4) BAR(5) BAR(6) BAR(7) BAR(8) BAR(9) BAR(10) BAR(11) BAR(12) BAR(13) BAR(14) BAR(15) BAR(16) BAR(17) BAR(18) BAR(19) int __attribute__((noinline)) foo () { switch (flag) { case 1: return bar1 (0, 0); case 2: return bar2 (0, 0); case 3: return bar3 (0, 0); case 4: return bar4 (0, 0); case 5: return bar5 (0, 0); case 6: return bar6 (0, 0); case 7: return bar7 (0, 0); case 8: return bar8 (0, 0); case 9: return bar9 (0, 0); case 10: return bar10 (0, 0); case 11: return bar11 (0, 0); case 12: return bar12 (0, 0); case 13: return bar13 (0, 0); case 14: return bar14 (0, 0); case 15: return bar15 (0, 0); case 16: return bar16 (0, 0); case 17: return bar17 (0, 0); case 18: return bar18 (0, 0); default: return bar19(0, 0); } } int main () { flag = 0; array = calloc(array_size, sizeof(int)); for (int i = 0, j = 0; i < iterations; ++i, j = (j + 1) % 10) array[j] = foo (); }
Can you provide the exact command lines being used and does it fail during while using the profile or before?
I actually have a fix for this, just wanted to file a simple test case. I initially ran into this failure while reviving autoprofiledbootstrap build. The failure happens while using the profile and the bug is an incorrect count comparison. Here is the patch: https://gcc.gnu.org/pipermail/gcc-patches/2022-November/606935.html I will add this test to the patch before submitting it.
Repro steps: gcc -O2 -g -o ./pr108000 ./pr108000.c perf record -e cpu/event=0xC4,umask=0x20/puk -b -m8 -o perf.data ./pr108000 create_gcov --binary ./pr108000 --profile=./perf.data -gcov_version=2 --gcov=./pr108000.gcda gcc ./pr108000.c -O2 -fauto-profile=./pr108000.gcda -O2 -o ./pr108000.afdo
The master branch has been updated by Eugene Rozenfeld <erozen@gcc.gnu.org>: https://gcc.gnu.org/g:7410032a772a9e77b620b091c2b551b68113a179 commit r13-4567-g7410032a772a9e77b620b091c2b551b68113a179 Author: Eugene Rozenfeld <erozen@microsoft.com> Date: Tue Dec 6 17:05:18 2022 -0800 Fix count comparison in ipa-cp The existing comparison was incorrect for non-PRECISE counts (e.g., AFDO): we could end up with a 0 base_count, which could lead to asserts, e.g., in good_cloning_opportunity_p. Tested on x86_64-pc-linux-gnu. gcc/ChangeLog: PR ipa/108000 * ipa-cp.cc (ipcp_propagate_stage): Fix profile count comparison gcc/testsuite * gcc.dg/tree-prof/pr108000.c: Regression test
Fixed by https://gcc.gnu.org/g:7410032a772a9e77b620b091c2b551b68113a179 .