summaryrefslogtreecommitdiff
path: root/0062-Backport-Allow-match-and-simplified-phiopt-to-run-in.patch
diff options
context:
space:
mode:
Diffstat (limited to '0062-Backport-Allow-match-and-simplified-phiopt-to-run-in.patch')
-rw-r--r--0062-Backport-Allow-match-and-simplified-phiopt-to-run-in.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/0062-Backport-Allow-match-and-simplified-phiopt-to-run-in.patch b/0062-Backport-Allow-match-and-simplified-phiopt-to-run-in.patch
new file mode 100644
index 0000000..bf1b0cd
--- /dev/null
+++ b/0062-Backport-Allow-match-and-simplified-phiopt-to-run-in.patch
@@ -0,0 +1,174 @@
+From fabbe6ccc798d3cb097c6371b4d53cd6dfde6c7c Mon Sep 17 00:00:00 2001
+From: Andrew Pinski <apinski@marvell.com>
+Date: Fri, 11 Jun 2021 13:21:34 -0700
+Subject: [PATCH 14/35] [Backport] Allow match-and-simplified phiopt to run in
+ early phiopt
+
+Reference: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=cd48e550d1dc58307ab1c0ab490745673f748ccc
+
+To move a few things more to match-and-simplify from phiopt,
+we need to allow match_simplify_replacement to run in early
+phiopt. To do this we add a replacement for gimple_simplify
+that is explictly for phiopt.
+
+OK? Bootstrapped and tested on x86_64-linux-gnu with no
+regressions.
+
+gcc/ChangeLog:
+
+ * tree-ssa-phiopt.c (match_simplify_replacement):
+ Add early_p argument. Call gimple_simplify_phiopt
+ instead of gimple_simplify.
+ (tree_ssa_phiopt_worker): Update call to
+ match_simplify_replacement and allow unconditionally.
+ (phiopt_early_allow): New function.
+ (gimple_simplify_phiopt): New function.
+---
+ gcc/tree-ssa-phiopt.c | 89 ++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 70 insertions(+), 19 deletions(-)
+
+diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
+index 9fa6363b6..92aeb8415 100644
+--- a/gcc/tree-ssa-phiopt.c
++++ b/gcc/tree-ssa-phiopt.c
+@@ -48,12 +48,13 @@ along with GCC; see the file COPYING3. If not see
+ #include "tree-eh.h"
+ #include "gimple-fold.h"
+ #include "internal-fn.h"
++#include "gimple-match.h"
+
+ static unsigned int tree_ssa_phiopt_worker (bool, bool, bool);
+ static bool two_value_replacement (basic_block, basic_block, edge, gphi *,
+ tree, tree);
+ static bool match_simplify_replacement (basic_block, basic_block,
+- edge, edge, gphi *, tree, tree);
++ edge, edge, gphi *, tree, tree, bool);
+ static gphi *factor_out_conditional_conversion (edge, edge, gphi *, tree, tree,
+ gimple *);
+ static int value_replacement (basic_block, basic_block,
+@@ -348,9 +349,9 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
+ /* Do the replacement of conditional if it can be done. */
+ if (!early_p && two_value_replacement (bb, bb1, e2, phi, arg0, arg1))
+ cfgchanged = true;
+- else if (!early_p
+- && match_simplify_replacement (bb, bb1, e1, e2, phi,
+- arg0, arg1))
++ else if (match_simplify_replacement (bb, bb1, e1, e2, phi,
++ arg0, arg1,
++ early_p))
+ cfgchanged = true;
+ else if (abs_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
+ cfgchanged = true;
+@@ -763,6 +764,67 @@ two_value_replacement (basic_block cond_bb, basic_block middle_bb,
+ return true;
+ }
+
++/* Return TRUE if CODE should be allowed during early phiopt.
++ Currently this is to allow MIN/MAX and ABS/NEGATE. */
++static bool
++phiopt_early_allow (enum tree_code code)
++{
++ switch (code)
++ {
++ case MIN_EXPR:
++ case MAX_EXPR:
++ case ABS_EXPR:
++ case ABSU_EXPR:
++ case NEGATE_EXPR:
++ case SSA_NAME:
++ return true;
++ default:
++ return false;
++ }
++}
++
++/* gimple_simplify_phiopt is like gimple_simplify but designed for PHIOPT.
++ Return NULL if nothing can be simplified or the resulting simplified value
++ with parts pushed if EARLY_P was true. Also rejects non allowed tree code
++ if EARLY_P is set.
++ Takes the comparison from COMP_STMT and two args, ARG0 and ARG1 and tries
++ to simplify CMP ? ARG0 : ARG1. */
++static tree
++gimple_simplify_phiopt (bool early_p, tree type, gimple *comp_stmt,
++ tree arg0, tree arg1,
++ gimple_seq *seq)
++{
++ tree result;
++ enum tree_code comp_code = gimple_cond_code (comp_stmt);
++ location_t loc = gimple_location (comp_stmt);
++ tree cmp0 = gimple_cond_lhs (comp_stmt);
++ tree cmp1 = gimple_cond_rhs (comp_stmt);
++ /* To handle special cases like floating point comparison, it is easier and
++ less error-prone to build a tree and gimplify it on the fly though it is
++ less efficient.
++ Don't use fold_build2 here as that might create (bool)a instead of just
++ "a != 0". */
++ tree cond = build2_loc (loc, comp_code, boolean_type_node,
++ cmp0, cmp1);
++ gimple_match_op op (gimple_match_cond::UNCOND,
++ COND_EXPR, type, cond, arg0, arg1);
++
++ if (op.resimplify (early_p ? NULL : seq, follow_all_ssa_edges))
++ {
++ /* Early we want only to allow some generated tree codes. */
++ if (!early_p
++ || op.code.is_tree_code ()
++ || phiopt_early_allow ((tree_code)op.code))
++ {
++ result = maybe_push_res_to_seq (&op, seq);
++ if (result)
++ return result;
++ }
++ }
++
++ return NULL;
++}
++
+ /* The function match_simplify_replacement does the main work of doing the
+ replacement using match and simplify. Return true if the replacement is done.
+ Otherwise return false.
+@@ -772,10 +834,9 @@ two_value_replacement (basic_block cond_bb, basic_block middle_bb,
+ static bool
+ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
+ edge e0, edge e1, gphi *phi,
+- tree arg0, tree arg1)
++ tree arg0, tree arg1, bool early_p)
+ {
+ gimple *stmt;
+- tree cond;
+ gimple_stmt_iterator gsi;
+ edge true_edge, false_edge;
+ gimple_seq seq = NULL;
+@@ -799,15 +860,6 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
+
+ stmt = last_stmt (cond_bb);
+
+- /* To handle special cases like floating point comparison, it is easier and
+- less error-prone to build a tree and gimplify it on the fly though it is
+- less efficient.
+- Don't use fold_build2 here as that might create (bool)a instead of just
+- "a != 0". */
+- cond = build2_loc (gimple_location (stmt),
+- gimple_cond_code (stmt), boolean_type_node,
+- gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
+-
+ /* We need to know which is the true edge and which is the false
+ edge so that we know when to invert the condition below. */
+ extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
+@@ -815,10 +867,9 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
+ std::swap (arg0, arg1);
+
+ tree type = TREE_TYPE (gimple_phi_result (phi));
+- result = gimple_simplify (COND_EXPR, type,
+- cond,
+- arg0, arg1,
+- &seq, NULL);
++ result = gimple_simplify_phiopt (early_p, type, stmt,
++ arg0, arg1,
++ &seq);
+ if (!result)
+ return false;
+
+--
+2.27.0.windows.1
+