https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108000

            Bug ID: 108000
           Summary: Assert during ipa-cp with AutoFDO
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: erozen at microsoft dot com
                CC: marxin at gcc dot gnu.org
  Target Milestone: ---

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 ();
}

Reply via email to