On Mon, Aug 19, 2024 at 8:38 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > Currently maybe_push_res_to_seq does not handle non-const builtins (it does > handle internal > functions though).
I think it simply assumes they are const ... if we can indeed verify this we should make it match the builtin behavior. > So we need to disable factoring out non-const builtins. This will be fixed in > a better way later but this fixes the regression at hand and does not change > what was goal on > moving factor_out_conditional_operation over to use gimple_match_op. > > Bootstrapped and tested on x86_64-linux-gnu with no regressions. > > PR tree-optimization/116409 > > gcc/ChangeLog: > > * tree-ssa-phiopt.cc (factor_out_conditional_operation): Reject > non const builtins (except for internal functions). > > gcc/testsuite/ChangeLog: > > * gcc.dg/torture/pr116409-1.c: New test. > * gcc.dg/torture/pr116409-2.c: New test. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/testsuite/gcc.dg/torture/pr116409-1.c | 7 +++++++ > gcc/testsuite/gcc.dg/torture/pr116409-2.c | 7 +++++++ > gcc/tree-ssa-phiopt.cc | 18 ++++++++++++++++++ > 3 files changed, 32 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/torture/pr116409-1.c > create mode 100644 gcc/testsuite/gcc.dg/torture/pr116409-2.c > > diff --git a/gcc/testsuite/gcc.dg/torture/pr116409-1.c > b/gcc/testsuite/gcc.dg/torture/pr116409-1.c > new file mode 100644 > index 00000000000..7bf8d49c9a0 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr116409-1.c > @@ -0,0 +1,7 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-frounding-math -fno-math-errno" } */ > +double f(int c, double a, double b) { > + if (c) > + return __builtin_sqrt(a); > + return __builtin_sqrt(b); > +} > diff --git a/gcc/testsuite/gcc.dg/torture/pr116409-2.c > b/gcc/testsuite/gcc.dg/torture/pr116409-2.c > new file mode 100644 > index 00000000000..c27f11312d9 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr116409-2.c > @@ -0,0 +1,7 @@ > +/* { dg-do compile } */ > + > +int f (int t, char *a, char *b) { > + if (t) > + return __builtin_strlen (a); > + return __builtin_strlen (b); > +} > diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc > index 2d4aba5b087..770f3629fe1 100644 > --- a/gcc/tree-ssa-phiopt.cc > +++ b/gcc/tree-ssa-phiopt.cc > @@ -54,6 +54,7 @@ along with GCC; see the file COPYING3. If not see > #include "dbgcnt.h" > #include "tree-ssa-propagate.h" > #include "tree-ssa-dce.h" > +#include "calls.h" > > /* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */ > > @@ -367,6 +368,23 @@ factor_out_conditional_operation (edge e0, edge e1, gphi > *phi, > if (!types_compatible_p (TREE_TYPE (new_arg0), TREE_TYPE (new_arg1))) > return NULL; > > + /* Function calls can only be const or an internal function > + as maybe_push_res_to_seq only handles those currently. */ > + if (!arg0_op.code.is_tree_code ()) > + { > + auto fn = combined_fn (arg0_op.code); > + if (!internal_fn_p (fn)) > + { > + tree decl = builtin_decl_implicit (as_builtin_fn (fn)); > + if (!decl) > + return NULL; > + > + /* Non-const functions are not supported currently. */ > + if (!(flags_from_decl_or_type (decl) & ECF_CONST)) > + return NULL; > + } > + } > + Maybe this can all be simplified by performing the maybe_push_res_to_seq before doing other code generation and fail the transform if that returns false? Richard. > /* Create a new PHI stmt. */ > result = PHI_RESULT (phi); > temp = make_ssa_name (TREE_TYPE (new_arg0), NULL); > -- > 2.43.0 >