https://gcc.gnu.org/g:84ab2358609dbbbb45c06c67b57d2d988457f398
commit r17-1252-g84ab2358609dbbbb45c06c67b57d2d988457f398 Author: Richard Sandiford <[email protected]> Date: Wed Jun 3 11:04:15 2026 +0100 backprop: Avoid double deletions [PR125579] In this PR, two values were simplified to the same phi, which in turn was made redundant by other simplifications. The pass then tried to delete the phi twice. gcc/ PR tree-optimization/125579 * gimple-ssa-backprop.cc (backprop::execute): Avoid double deletions. gcc/testsuite/ PR tree-optimization/125579 * gcc.dg/pr125579.c: New test. Diff: --- gcc/gimple-ssa-backprop.cc | 4 +++- gcc/testsuite/gcc.dg/pr125579.c | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/gimple-ssa-backprop.cc b/gcc/gimple-ssa-backprop.cc index 61ceb88ec89f..5d7295c9d8ed 100644 --- a/gcc/gimple-ssa-backprop.cc +++ b/gcc/gimple-ssa-backprop.cc @@ -1119,10 +1119,12 @@ backprop::execute () commit_replacement (v); /* Phase 5: Remove any statements that might have become dead. */ + auto_bitmap deleted_vars; for (unsigned int i = 0; i < m_vars.length (); ++i) if (var_info *v = m_vars[i]) if (TREE_CODE (v->new_value) == SSA_NAME - && has_zero_uses (v->new_value)) + && has_zero_uses (v->new_value) + && bitmap_set_bit (deleted_vars, SSA_NAME_VERSION (v->new_value))) { gimple *stmt = SSA_NAME_DEF_STMT (v->new_value); gimple_stmt_iterator gsi = gsi_for_stmt (stmt); diff --git a/gcc/testsuite/gcc.dg/pr125579.c b/gcc/testsuite/gcc.dg/pr125579.c new file mode 100644 index 000000000000..1293d4d91f9a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr125579.c @@ -0,0 +1,16 @@ +/* { dg-options "-w -O3 -fno-tree-ccp -fno-inline" } */ + +int printf(const char *, ...); +int a; +void c(int d) { + unsigned e = 0; + if (a) + e = -(0 / (e * 0)); + while (a) { + if (d) + continue; + printf("%d", e); + e++; + } +} +int main() { c(1); }
