https://gcc.gnu.org/g:aa28a331e9f7c526540184d4b748198b8e5ad338
commit r15-10000-gaa28a331e9f7c526540184d4b748198b8e5ad338 Author: Richard Biener <rguent...@suse.de> Date: Wed Jul 16 20:19:44 2025 +0200 tree-optimization/121035 - handle stray VN values without expression When VN iterates we can end up with unreachable inserted expressions in the expression tables which in turn will not be added to their value by PREs compute_avail. This will later ICE when we pick them up and want to generate them. Deal with this by giving up. PR tree-optimization/121035 * tree-ssa-pre.cc (find_or_generate_expression): Handle values without expression. * gcc.dg/pr121035.c: New testcase. (cherry picked from commit 9af57c471087a3a1b87621bce1208d6c77ba2a4a) Diff: --- gcc/testsuite/gcc.dg/pr121035.c | 94 +++++++++++++++++++++++++++++++++++++++++ gcc/tree-ssa-pre.cc | 21 ++++----- 2 files changed, 105 insertions(+), 10 deletions(-) diff --git a/gcc/testsuite/gcc.dg/pr121035.c b/gcc/testsuite/gcc.dg/pr121035.c new file mode 100644 index 000000000000..fc0edce5d7d3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr121035.c @@ -0,0 +1,94 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fgimple" } */ + +int printf(const char *, ...); +int a, b, d; +unsigned c; +int __GIMPLE (ssa,startwith("pre")) +main () +{ + unsigned int g; + int f; + unsigned int _1; + unsigned int _2; + int _3; + int _4; + int _5; + unsigned int _6; + unsigned int _7; + int _10; + unsigned int _11; + _Bool _19; + _Bool _20; + _Bool _22; + int _25; + + __BB(2): + _25 = a; + if (_25 != 0) + goto __BB11; + else + goto __BB10; + + __BB(11): + goto __BB3; + + __BB(3): + f_26 = __PHI (__BB12: f_18, __BB11: 0); + g_15 = c; + if (f_26 != 0) + goto __BB4; + else + goto __BB5; + + __BB(4): + __builtin_putchar (48); + goto __BB5; + + __BB(5): + _1 = c; + _2 = _1 << 1; + _3 = a; + _4 = d; + _5 = _3 * _4; + if (_5 != 0) + goto __BB7; + else + goto __BB6; + + __BB(6): + goto __BB7; + + __BB(7): + _11 = __PHI (__BB5: 0u, __BB6: 4294967295u); + _6 = g_15 * 4294967294u; + _7 = _6 | _11; + _20 = _3 != 0; + _19 = _7 != 0u; + _22 = _19 & _20; + if (_22 != _Literal (_Bool) 0) + goto __BB9; + else + goto __BB8; + + __BB(8): + goto __BB9; + + __BB(9): + _10 = __PHI (__BB7: 1, __BB8: 0); + b = _10; + f_18 = (int) _1; + if (_3 != 0) + goto __BB12; + else + goto __BB10; + + __BB(12): + goto __BB3; + + __BB(10): + return 0; + +} + + diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc index ecf45d29e769..be94b60bad8d 100644 --- a/gcc/tree-ssa-pre.cc +++ b/gcc/tree-ssa-pre.cc @@ -2773,16 +2773,17 @@ find_or_generate_expression (basic_block block, tree op, gimple_seq *stmts) bitmap exprset = value_expressions[lookfor]; bitmap_iterator bi; unsigned int i; - EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi) - { - pre_expr temp = expression_for_id (i); - /* We cannot insert random REFERENCE expressions at arbitrary - places. We can insert NARYs which eventually re-materializes - its operand values. */ - if (temp->kind == NARY) - return create_expression_by_pieces (block, temp, stmts, - TREE_TYPE (op)); - } + if (exprset) + EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi) + { + pre_expr temp = expression_for_id (i); + /* We cannot insert random REFERENCE expressions at arbitrary + places. We can insert NARYs which eventually re-materializes + its operand values. */ + if (temp->kind == NARY) + return create_expression_by_pieces (block, temp, stmts, + TREE_TYPE (op)); + } /* Defer. */ return NULL_TREE;