diff options
3 files changed, 167 insertions, 2 deletions
diff --git a/15.0.0/gentoo/32_all_phi-opt-Fix-for-non-const-functions-for-factor_out_c.patch b/15.0.0/gentoo/32_all_phi-opt-Fix-for-non-const-functions-for-factor_out_c.patch new file mode 100644 index 0000000..1920001 --- /dev/null +++ b/15.0.0/gentoo/32_all_phi-opt-Fix-for-non-const-functions-for-factor_out_c.patch @@ -0,0 +1,100 @@ +From 8d5c584e088109e39402221f59c2330b24bed142 Mon Sep 17 00:00:00 2001 +Message-ID: <8d5c584e088109e39402221f59c2330b24bed142.1724092858.git.sam@gentoo.org> +From: Andrew Pinski <quic_apinski@quicinc.com> +Date: Mon, 19 Aug 2024 11:37:13 -0700 +Subject: [PATCH 1/2] phi-opt: Fix for non-const functions for + factor_out_conditional_operation [PR 116409] + +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_apinski@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 000000000000..7bf8d49c9a01 +--- /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 000000000000..c27f11312d98 +--- /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 2d4aba5b0872..770f3629fe1d 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.46.0 + diff --git a/15.0.0/gentoo/33_all_phiopt-Reject-non-gimple-val-inside-factor_out_condi.patch b/15.0.0/gentoo/33_all_phiopt-Reject-non-gimple-val-inside-factor_out_condi.patch new file mode 100644 index 0000000..b3f96ae --- /dev/null +++ b/15.0.0/gentoo/33_all_phiopt-Reject-non-gimple-val-inside-factor_out_condi.patch @@ -0,0 +1,64 @@ +From 555a5e896480884c3fe2c6c117654a798b8ffd3f Mon Sep 17 00:00:00 2001 +Message-ID: <555a5e896480884c3fe2c6c117654a798b8ffd3f.1724092858.git.sam@gentoo.org> +In-Reply-To: <8d5c584e088109e39402221f59c2330b24bed142.1724092858.git.sam@gentoo.org> +References: <8d5c584e088109e39402221f59c2330b24bed142.1724092858.git.sam@gentoo.org> +From: Andrew Pinski <quic_apinski@quicinc.com> +Date: Mon, 19 Aug 2024 11:37:14 -0700 +Subject: [PATCH 2/2] phiopt: Reject non gimple val inside + factor_out_conditional_operation [PR116412] + +After the conversion to use maybe_push_res_to_seq, sometimes (REALPART_EXPR +and IMAGPART_EXPR and VCE) the argument will not be a gimple value and +then phiopt here would create an invalid PHI. +Just add a check for gimple val is the way to fix this. + +Bootstrapped and tested on x86_64-linux-gnu. + + PR tree-optimization/116412 + +gcc/ChangeLog: + + * tree-ssa-phiopt.cc (factor_out_conditional_operation): Make sure new_arg0 + and new_arg1 are both gimple values. + +gcc/testsuite/ChangeLog: + + * gcc.dg/torture/pr116412-1.c: New test. + +Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com> +--- + gcc/testsuite/gcc.dg/torture/pr116412-1.c | 6 ++++++ + gcc/tree-ssa-phiopt.cc | 4 ++++ + 2 files changed, 10 insertions(+) + create mode 100644 gcc/testsuite/gcc.dg/torture/pr116412-1.c + +diff --git a/gcc/testsuite/gcc.dg/torture/pr116412-1.c b/gcc/testsuite/gcc.dg/torture/pr116412-1.c +new file mode 100644 +index 000000000000..3bc26ecd8b83 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/torture/pr116412-1.c +@@ -0,0 +1,6 @@ ++/* { dg-do compile } */ ++double f(_Complex double a, _Complex double *b, int c) ++{ ++ if (c) return __real__ a; ++ return __real__ *b; ++} +diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc +index 770f3629fe1d..be95798a065b 100644 +--- a/gcc/tree-ssa-phiopt.cc ++++ b/gcc/tree-ssa-phiopt.cc +@@ -368,6 +368,10 @@ factor_out_conditional_operation (edge e0, edge e1, gphi *phi, + if (!types_compatible_p (TREE_TYPE (new_arg0), TREE_TYPE (new_arg1))) + return NULL; + ++ /* The new args need to be both gimple values. */ ++ if (!is_gimple_val (new_arg0) || !is_gimple_val (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 ()) +-- +2.46.0 + diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history index 1849089..0c430eb 100644 --- a/15.0.0/gentoo/README.history +++ b/15.0.0/gentoo/README.history @@ -1,6 +1,7 @@ -10 ???? +10 19 August 2024 - + 32_all_genoutput-speedup.patch + + 32_all_phi-opt-Fix-for-non-const-functions-for-factor_out_c.patch + + 33_all_phiopt-Reject-non-gimple-val-inside-factor_out_condi.patch 9 11 August 2024 |