https://gcc.gnu.org/g:4ac080e384cd30d37fac069d791b813100e6524a
commit r16-6937-g4ac080e384cd30d37fac069d791b813100e6524a Author: Andrew MacLeod <[email protected]> Date: Mon Jan 19 13:44:25 2026 -0500 Do not trap on a stmt with no basic block. WHen calculating ranges for statements not in the IL, avoid looking for range on entry values. PR tree-optimization/123314 gcc/ * gimple-range.cc (gimple_ranger::range_on_entry): Do not check ranger cache for an SSA_NAME with no BB. (gimple_ranger::prefill_stmt_dependencies): Stop filling dependencies when an out-of IL name is encountered. gcc/testsuite/ * gcc.dg/pr123314.c: New. Diff: --- gcc/gimple-range.cc | 6 ++++-- gcc/testsuite/gcc.dg/pr123314.c | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index f64c53a7371d..4c768ed3a07d 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -171,7 +171,7 @@ gimple_ranger::range_on_entry (vrange &r, basic_block bb, tree name) range_of_stmt (r, SSA_NAME_DEF_STMT (name), name); // Now see if there is any on_entry value which may refine it. - if (m_cache.block_range (entry_range, bb, name)) + if (bb && m_cache.block_range (entry_range, bb, name)) r.intersect (entry_range); if (idx) @@ -389,7 +389,9 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) unsigned idx; gimple *stmt = SSA_NAME_DEF_STMT (ssa); - gcc_checking_assert (stmt && gimple_bb (stmt)); + gcc_checking_assert (stmt); + if (!gimple_bb (stmt)) + return; // Only pre-process range-ops and phis. if (!gimple_range_op_handler::supported_p (stmt) && !is_a<gphi *> (stmt)) diff --git a/gcc/testsuite/gcc.dg/pr123314.c b/gcc/testsuite/gcc.dg/pr123314.c new file mode 100644 index 000000000000..785992b4ff35 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr123314.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ +/* { dg-additional-options "-march=armv9-a" { target aarch64*-*-* } } */ +/* { dg-additional-options "-march=skylake-avx512" { target x86_64*-*-* } } */ + +extern char a[]; +extern short b[], c[]; +extern int h[]; +void i() { + for (char d;;) + for (int e = 0; e < 9; e++) { + for (int f; f < 9; f += 4) + c[d] = 0; + for (int g = 0; g < 9; g += 3) + h[1 + d] = (a[d] ? a[3] : 7 ? b[7] : 0) / 6; + } +}
