Bug 108000 - Assert during ipa-cp with AutoFDO
Summary: Assert during ipa-cp with AutoFDO
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: ipa (show other bugs)
Version: 13.0
: P3 normal
Target Milestone: ---
Assignee: Eugene Rozenfeld
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-12-07 00:55 UTC by Eugene Rozenfeld
Modified: 2022-12-10 00:09 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2022-12-07 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Eugene Rozenfeld 2022-12-07 00:55:21 UTC
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 ();
}
Comment 1 Andrew Pinski 2022-12-07 00:58:19 UTC
Can you provide the exact command lines being used and does it fail during while using the profile or before?
Comment 2 Eugene Rozenfeld 2022-12-07 01:04:40 UTC
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.
Comment 3 Eugene Rozenfeld 2022-12-08 01:16:58 UTC
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
Comment 4 GCC Commits 2022-12-08 19:53:54 UTC
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
Comment 5 Eugene Rozenfeld 2022-12-10 00:09:44 UTC
Fixed by https://gcc.gnu.org/g:7410032a772a9e77b620b091c2b551b68113a179 .