https://gcc.gnu.org/g:9e3a7b8d9de20e2c4fce3cdadf85dce468e7b107
commit r17-3932-g9e3a7b8d9de20e2c4fce3cdadf85dce468e7b107 Author: Yongqiang Tian <[email protected]> Date: Fri Sep 4 10:57:06 2026 -0600 [PATCH] ira: Ignore debug insns in simple-LRA threshold [PR108784] The simple-LRA decision uses get_max_uid() as an approximation of the number of instructions. Debug instructions consume UIDs, so enabling debug information can cross the threshold and change register allocation and generated code. Use get_max_insn_count(), which excludes debug instructions, so the decision depends only on ordinary instructions. Add an -fcompare-debug regression test. Bootstrapped and regression tested on x86_64-pc-linux-gnu. PR debug/108784 gcc/ChangeLog: * ira.cc (ira): Use get_max_insn_count instead of get_max_uid when selecting simple LRA. gcc/testsuite/ChangeLog: * gcc.dg/pr108784.c: New test. Assisted-by: OpenAI Codex 5.6 Sol Assisted-by: Claude Signed-off-by: Yongqiang Tian <[email protected]> Diff: --- gcc/ira.cc | 8 ++++-- gcc/testsuite/gcc.dg/pr108784.c | 63 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/gcc/ira.cc b/gcc/ira.cc index 798a7f01c5da..dd8c64f5dcba 100644 --- a/gcc/ira.cc +++ b/gcc/ira.cc @@ -5765,9 +5765,11 @@ ira (FILE *f) lra_simple_p = (ira_use_lra_p && (num_used_regs >= (1U << 26) / last_basic_block_for_fn (cfun) - /* max uid is a good evaluation of the number of insns as most - optimizations are done on tree-SSA level. */ - || ((uint64_t) get_max_uid () + /* get_max_insn_count is a good evaluation of the number of insns + as most optimizations are done on tree-SSA level. Unlike + get_max_uid, it excludes debug insns, so the choice below does + not depend on debug information. */ + || ((uint64_t) get_max_insn_count () > (uint64_t) param_ira_simple_lra_insn_threshold * 1000))); if (lra_simple_p) diff --git a/gcc/testsuite/gcc.dg/pr108784.c b/gcc/testsuite/gcc.dg/pr108784.c new file mode 100644 index 000000000000..6a8eff6c3ddf --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr108784.c @@ -0,0 +1,63 @@ +/* PR debug/108784 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -w --param=ira-simple-lra-insn-threshold=1 -fcompare-debug" } */ + +extern unsigned external_mix (unsigned); + +/* These unused named locals generate debug insns without affecting code. */ +#define GHOST(P, I, N) unsigned ghost##P##I = x ^ (N) ^ (I) +#define GHOSTS_8(P, N) \ + GHOST (P, 0, N); GHOST (P, 1, N); GHOST (P, 2, N); GHOST (P, 3, N); \ + GHOST (P, 4, N); GHOST (P, 5, N); GHOST (P, 6, N); GHOST (P, 7, N) +#define GHOSTS_64(N) \ + GHOSTS_8 (a, N); GHOSTS_8 (b, N); GHOSTS_8 (c, N); GHOSTS_8 (d, N); \ + GHOSTS_8 (e, N); GHOSTS_8 (f, N); GHOSTS_8 (g, N); GHOSTS_8 (h, N) + +#define STEP(N, A, I, C) \ + do \ + { \ + GHOSTS_64 (N); \ + A = A * 33u + x + p[I]; \ + x = x * 1103515245u + A + (C); \ + __asm__ volatile ("" : "+r" (x)); \ + } \ + while (0) + +#define UNIT() \ + STEP (1u, a0, 0, 12345u); \ + STEP (2u, a1, 1, 12346u); \ + STEP (3u, a2, 2, 12347u); \ + STEP (4u, a3, 3, 12348u); \ + STEP (5u, a4, 4, 12349u); \ + STEP (6u, a5, 5, 12350u); \ + STEP (7u, a6, 6, 12351u); \ + STEP (8u, a7, 7, 12352u); \ + STEP (9u, a8, 0, 12353u); \ + STEP (10u, a9, 1, 12354u); \ + STEP (11u, a10, 2, 12355u); \ + STEP (12u, a11, 3, 12356u); \ + if ((x & 31u) == 7u) x ^= external_mix (x); + +#define REP_1() UNIT() +#define REP_2() REP_1() REP_1() + +__attribute__((noinline)) +unsigned +foo (unsigned x, const unsigned *p) +{ + unsigned a0 = x + p[0] + 1u; + unsigned a1 = x + p[1] + 2u; + unsigned a2 = x + p[2] + 3u; + unsigned a3 = x + p[3] + 4u; + unsigned a4 = x + p[4] + 5u; + unsigned a5 = x + p[5] + 6u; + unsigned a6 = x + p[6] + 7u; + unsigned a7 = x + p[7] + 8u; + unsigned a8 = x + p[0] + 9u; + unsigned a9 = x + p[1] + 10u; + unsigned a10 = x + p[2] + 11u; + unsigned a11 = x + p[3] + 12u; + REP_2 (); + return x + a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + + a11; +}
