From: Maxim Kuvyrkov Date: Thu, 18 Jan 2024 13:45:27 +0000 (+0100) Subject: Fix compare-debug bootstrap failure [PR113445] X-Git-Tag: basepoints/gcc-15~1908 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a6bf09f65aed44d36acaa511e552783bfb0e9a62;p=thirdparty%2Fgcc.git Fix compare-debug bootstrap failure [PR113445] ... caused by scheduler fix for PR96388 and PR111554. This patch adjusts decision sched-deps.cc:find_inc() to use length of dependency lists sans any DEBUG_INSN instructions. gcc/ChangeLog 2024-01-18 Maxim Kuvyrkov PR bootstrap/113445 * haifa-sched.cc (dep_list_size): Make global. * sched-deps.cc (find_inc): Use instead of sd_lists_size(). * sched-int.h (dep_list_size): Declare. gcc/testsuite/ChangeLog 2024-01-18 Jakub Jelinek PR bootstrap/113445 * gcc.dg/pr113445.c: New test. --- diff --git a/gcc/haifa-sched.cc b/gcc/haifa-sched.cc index 49ee589aed73..1bc610f9a5f9 100644 --- a/gcc/haifa-sched.cc +++ b/gcc/haifa-sched.cc @@ -1560,8 +1560,7 @@ contributes_to_priority_p (dep_t dep) } /* Compute the number of nondebug deps in list LIST for INSN. */ - -static int +int dep_list_size (rtx_insn *insn, sd_list_types_def list) { sd_iterator_def sd_it; @@ -1571,6 +1570,11 @@ dep_list_size (rtx_insn *insn, sd_list_types_def list) if (!MAY_HAVE_DEBUG_INSNS) return sd_lists_size (insn, list); + /* TODO: We should split normal and debug insns into separate SD_LIST_* + sub-lists, and then we'll be able to use something like + sd_lists_size(insn, list & SD_LIST_NON_DEBUG) + instead of walking dependencies below. */ + FOR_EACH_DEP (insn, list, sd_it, dep) { if (DEBUG_INSN_P (DEP_CON (dep))) diff --git a/gcc/sched-deps.cc b/gcc/sched-deps.cc index 0615007c560a..5034e664e5ea 100644 --- a/gcc/sched-deps.cc +++ b/gcc/sched-deps.cc @@ -4791,7 +4791,7 @@ find_inc (struct mem_inc_info *mii, bool backwards) sd_iterator_def sd_it; dep_t dep; sd_list_types_def mem_deps = backwards ? SD_LIST_HARD_BACK : SD_LIST_FORW; - int n_mem_deps = sd_lists_size (mii->mem_insn, mem_deps); + int n_mem_deps = dep_list_size (mii->mem_insn, mem_deps); sd_it = sd_iterator_start (mii->mem_insn, mem_deps); while (sd_iterator_cond (&sd_it, &dep)) @@ -4808,12 +4808,12 @@ find_inc (struct mem_inc_info *mii, bool backwards) if (backwards) { inc_cand = pro; - n_inc_deps = sd_lists_size (inc_cand, SD_LIST_BACK); + n_inc_deps = dep_list_size (inc_cand, SD_LIST_BACK); } else { inc_cand = con; - n_inc_deps = sd_lists_size (inc_cand, SD_LIST_FORW); + n_inc_deps = dep_list_size (inc_cand, SD_LIST_FORW); } /* In the FOR_EACH_DEP loop below we will create additional n_inc_deps diff --git a/gcc/sched-int.h b/gcc/sched-int.h index ab784fe0d178..4df092013e91 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -1677,6 +1677,8 @@ extern void sd_copy_back_deps (rtx_insn *, rtx_insn *, bool); extern void sd_delete_dep (sd_iterator_def); extern void sd_debug_lists (rtx, sd_list_types_def); +extern int dep_list_size (rtx_insn *, sd_list_types_def); + /* Macros and declarations for scheduling fusion. */ #define FUSION_MAX_PRIORITY (INT_MAX) extern bool sched_fusion; diff --git a/gcc/testsuite/gcc.dg/pr113445.c b/gcc/testsuite/gcc.dg/pr113445.c new file mode 100644 index 000000000000..8e24ddfd0db2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr113445.c @@ -0,0 +1,61 @@ +/* PR bootstrap/113445 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug -Wno-uninitialized" } */ + +enum E { F }; +int *a, *b, *c, *d, e, f, g, h, i; +int *f1 (int *); +int *f2 (...); +int *f3 (int *, int); +int *f4 (unsigned, int); +int *f5 (enum E, int); +int *f6 (int, int); +enum E j; + +void +f7 (void) +{ + int *k, *l, *m, *n, *o, *p, *q, *r, *s, *t, *u, *v, w, x, y, z, aa; + v = f6 (0, 1); + u = d; + t = c; + s = a; + f4 (f, 1); + f4 (f, 1); + int *ab = f4 (f, 1); + k = b; + int ac = *f3 (&e, F); + r = f1 (&ac); + int ad = *f3 (&e, F); + f1 (&ad); + q = f5 (j, 0); + p = f1 (t); + f1 (o); + f2 (); + f2 (); + f2 (); + f2 (); + f2 (); + f2 (); + f2 (z, z); + f2 (); + f2 (); + f2 (); + f1 (&h); + f2 (z, k, ab, aa, r, g, (void *) 0); + f2 (aa, w, &aa, r, k, (void *) 0); + f2 (q, (void *) 0); + f2 (); + f2 (&aa, s, r, o, o, z, (void *) 0); + n = f2 (s, (void *) 0); + f2 (v, u, p, t, p, p, (void *) 0); + m = f2 (v, u, x, y, x, x, (void *) 0); + l = f2 (v); + f2 (v, s); + f2 (t, u); + f2 (&aa, i, o, t, t, t, t); + f2 (v, u, x, t, y, x, x, o, t, t, t, t, t); + f2 (t); + f2 (t, t, t, t, t, t, t, z, y); + f2 (t, l, m, n); +}