On Mon, 22 Sep 2025, Andrew Pinski wrote: > On Mon, Sep 22, 2025 at 2:55 AM Richard Biener <[email protected]> wrote: > > > > When PRE asks VN to simplify a NARY but not insert, that bypasses > > the abnormal guard in maybe_push_res_to_seq and we blindly accept > > new uses of abnormals. The following fixes this. > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. > > > > PR tree-optimization/122016 > > * tree-ssa-sccvn.cc (vn_nary_simplify): Do not use the > > simplified expression when it references abnormals. > > > > * gcc.dg/torture/pr122016.c: New testcase. > > --- > > gcc/testsuite/gcc.dg/torture/pr122016.c | 27 +++++++++++++++++++++++++ > > gcc/tree-ssa-sccvn.cc | 6 ++++++ > > 2 files changed, 33 insertions(+) > > create mode 100644 gcc/testsuite/gcc.dg/torture/pr122016.c > > > > diff --git a/gcc/testsuite/gcc.dg/torture/pr122016.c > > b/gcc/testsuite/gcc.dg/torture/pr122016.c > > new file mode 100644 > > index 00000000000..027a63d4256 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/torture/pr122016.c > > @@ -0,0 +1,27 @@ > > +/* { dg-do compile } */ > > +/* { dg-additional-options "-ftree-pre" } */ > > + > > +int merge_parse_args_argc; > > +char merge_parse_args_argv_0; > > +int strncmp(char *, char *, long); > > +void _setjmp(); > > +typedef enum { FALSE, TRUE } boool; > > +void directory_exists(); > > +void merge_parse_args() { > > + int i; > > + boool help_found = FALSE; > > + while (i < merge_parse_args_argc && !help_found) { > > + if (strncmp("", &merge_parse_args_argv_0, 2)) > > + help_found = TRUE; > > + else { > > + for (;;) { > > + _setjmp(); > > + break; > > + } > > + i++; > > + directory_exists(); > > + } > > + i++; > > + } > > + _setjmp(); > > +} > > diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc > > index 8ec0a199705..246fa082561 100644 > > --- a/gcc/tree-ssa-sccvn.cc > > +++ b/gcc/tree-ssa-sccvn.cc > > @@ -2622,6 +2622,12 @@ vn_nary_simplify (vn_nary_op_t nary) > > nary->type, nary->length); > > memcpy (op.ops, nary->op, sizeof (tree) * nary->length); > > tree res = vn_nary_build_or_lookup_1 (&op, false, true); > > + /* Do not update *NARY with a simplified result that contains abnormals. > > + This matches what maybe_push_res_to_seq does when requesting > > insertion. */ > > + for (unsigned i = 0; i < op.num_ops; ++i) > > + if (TREE_CODE (op.ops[i]) == SSA_NAME > > + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op.ops[i])) > > + return res; > > You could just do: > if (op.operands_occurs_in_abnormal_phi ()) > return res;
*cringe* - but you're the native speaker ;) > > I added operands_occurs_in_abnormal_phi for phiopt when I started to > use match_op for factoring out expression there. Ah, yeah. Guess there's a few cases that could be altered. Richard.
