https://gcc.gnu.org/g:b57b0a72eb482eeeb2572119a0a362869d5b957a
commit r17-703-gb57b0a72eb482eeeb2572119a0a362869d5b957a Author: Andrew Pinski <[email protected]> Date: Fri May 22 12:07:28 2026 -0700 ifcvt: factor: turn asserts about abnormals to conditional [PR125419] I missed that factor_out_operators might look further up when it is doing its factoring so we end up with a statement that ssa names that are used in abnormal edges. This changes the asserts to just reject the factoring instead. Bootstrapped and tested on x86_64-linx-gnu. PR tree-optimization/125419 gcc/ChangeLog: * tree-if-conv.cc (factor_out_operators): Change asserts about abnormals into a conditional to reject it. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr125419-1.c: New test. Signed-off-by: Andrew Pinski <[email protected]> Diff: --- gcc/testsuite/gcc.dg/torture/pr125419-1.c | 23 +++++++++++++++++++++++ gcc/tree-if-conv.cc | 10 ++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr125419-1.c b/gcc/testsuite/gcc.dg/torture/pr125419-1.c new file mode 100644 index 000000000000..281df950191c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr125419-1.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* PR tree-optimization/125419 */ + +signed g13, g29, g27, g26, g17; +void f2(void)__attribute__((returns_twice)); +void f1(bool c14) +{ + int sj15; + if (c14) sj15 = sj15; + f2(); + c14 = 0; + do { + int c11 = g27; + if (c11) goto lbl_br22; + goto lbl_br24; +lbl_br22: + c14 = sj15; + c11 = g29 = g13; + if (c11) goto lbl_br22; +lbl_br24: + g26 = g17; + } while (c14); +} diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc index d728f7c5221c..218d2cb72386 100644 --- a/gcc/tree-if-conv.cc +++ b/gcc/tree-if-conv.cc @@ -2277,15 +2277,17 @@ again: if (!gimple_extract_op (arg0_def_stmt, &arg0_op)) return; - /* At this point there should be no ssa names occuring in abnormals. */ - gcc_assert (!arg0_op.operands_occurs_in_abnormal_phi ()); + /* Might pick up abnormals from previous bbs so stop the loop. */ + if (arg0_op.operands_occurs_in_abnormal_phi ()) + return; gimple *arg1_def_stmt = SSA_NAME_DEF_STMT (*arg1); if (!gimple_extract_op (arg1_def_stmt, &arg1_op)) return; - /* At this point there should be no ssa names occuring in abnormals. */ - gcc_assert (!arg1_op.operands_occurs_in_abnormal_phi ()); + /* Might pick up abnormals from previous bbs so stop the loop. */ + if (arg1_op.operands_occurs_in_abnormal_phi ()) + return; /* No factoring can happen if the codes are different or the number operands. */
