https://gcc.gnu.org/g:6b8a8c9fd68c5dabaec5ddbc25efeade44f37a14
commit r15-7602-g6b8a8c9fd68c5dabaec5ddbc25efeade44f37a14 Author: Richard Biener <rguent...@suse.de> Date: Mon Feb 17 15:53:11 2025 +0100 tree-optimization/98845 - ICE with tail-merging and DCE/DSE disabled The following shows that tail-merging will make dead SSA defs live in paths where it wasn't before, possibly introducing UB or as in this case, uses of abnormals that eventually fail coalescing later. The fix is to register such defs for stmt comparison. PR tree-optimization/98845 * tree-ssa-tail-merge.cc (stmt_local_def): Consider a def with no uses not local. * gcc.dg/pr98845.c: New testcase. * gcc.dg/pr81192.c: Adjust. Diff: --- gcc/testsuite/gcc.dg/pr81192.c | 6 +++++- gcc/testsuite/gcc.dg/pr98845.c | 33 +++++++++++++++++++++++++++++++++ gcc/tree-ssa-tail-merge.cc | 8 ++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/pr81192.c b/gcc/testsuite/gcc.dg/pr81192.c index c46ac18fd9af..87a7a7a19c80 100644 --- a/gcc/testsuite/gcc.dg/pr81192.c +++ b/gcc/testsuite/gcc.dg/pr81192.c @@ -25,12 +25,16 @@ void __GIMPLE(ssa, startwith("pre")) fn2 () if (j_6(D) != _Literal (int)2147483647) goto __BB4; else - goto __BB5; + goto __BB9; __BB(4): iftmp2_8 = j_6(D) + _Literal (int)1; goto __BB5; + __BB(9): + iftmp2_8 = j_6(D) + _Literal (int)1; + goto __BB5; + __BB(5): b_lsm6_10 = _Literal (int)2147483647; goto __BB6; diff --git a/gcc/testsuite/gcc.dg/pr98845.c b/gcc/testsuite/gcc.dg/pr98845.c new file mode 100644 index 000000000000..074c979678f9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr98845.c @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-dce -fno-tree-dse" } */ + +int n; + +__attribute__ ((returns_twice)) void +foo (void); + +void +bar (void); + +void +quux (int x) +{ + if (x) + ++x; + else + { + if (n) + { + x = 1; + foo (); + } + else + bar (); + + if (n) + { + ++x; + ++n; + } + } +} diff --git a/gcc/tree-ssa-tail-merge.cc b/gcc/tree-ssa-tail-merge.cc index d897970079ce..857e91c206b3 100644 --- a/gcc/tree-ssa-tail-merge.cc +++ b/gcc/tree-ssa-tail-merge.cc @@ -336,10 +336,13 @@ stmt_local_def (gimple *stmt) def_bb = gimple_bb (stmt); + bool any_use = false; FOR_EACH_IMM_USE_FAST (use_p, iter, val) { if (is_gimple_debug (USE_STMT (use_p))) continue; + + any_use = true; bb = gimple_bb (USE_STMT (use_p)); if (bb == def_bb) continue; @@ -351,6 +354,11 @@ stmt_local_def (gimple *stmt) return false; } + /* When there is no use avoid making the stmt live on other paths. + This can happen with DCE disabled or not done as seen in PR98845. */ + if (!any_use) + return false; + return true; }