Currently maybe_push_res_to_seq does not handle non-const builtins (it does handle internal functions though). 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; + } + } + /* Create a new PHI stmt. */ result = PHI_RESULT (phi); temp = make_ssa_name (TREE_TYPE (new_arg0), NULL); -- 2.43.0