summaryrefslogtreecommitdiff
path: root/0082-Revert-Backport-tree-optimization-102880-make-PHI-OP.patch
diff options
context:
space:
mode:
Diffstat (limited to '0082-Revert-Backport-tree-optimization-102880-make-PHI-OP.patch')
-rw-r--r--0082-Revert-Backport-tree-optimization-102880-make-PHI-OP.patch206
1 files changed, 206 insertions, 0 deletions
diff --git a/0082-Revert-Backport-tree-optimization-102880-make-PHI-OP.patch b/0082-Revert-Backport-tree-optimization-102880-make-PHI-OP.patch
new file mode 100644
index 0000000..3642252
--- /dev/null
+++ b/0082-Revert-Backport-tree-optimization-102880-make-PHI-OP.patch
@@ -0,0 +1,206 @@
+From 717782ec36469eb81650b07e8b5536281a59993d Mon Sep 17 00:00:00 2001
+From: zhongyunde <zhongyunde@huawei.com>
+Date: Tue, 29 Nov 2022 22:12:29 +0800
+Subject: [PATCH 34/35] Revert "[Backport] tree-optimization/102880 - make
+ PHI-OPT recognize more CFGs"
+
+This reverts commit 77398954ce517aa011b7a254c7aa2858521b2093.
+---
+ gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c | 31 ---------
+ gcc/tree-ssa-phiopt.c | 73 +++++++++-------------
+ 2 files changed, 29 insertions(+), 75 deletions(-)
+ delete mode 100644 gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c
+
+diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c
+deleted file mode 100644
+index 21aa66e38..000000000
+--- a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c
++++ /dev/null
+@@ -1,31 +0,0 @@
+-/* { dg-do compile } */
+-/* { dg-options "-O -fgimple -fdump-tree-phiopt1" } */
+-
+-int __GIMPLE (ssa,startwith("phiopt"))
+-foo (int a, int b, int flag)
+-{
+- int res;
+-
+- __BB(2):
+- if (flag_2(D) != 0)
+- goto __BB6;
+- else
+- goto __BB4;
+-
+- __BB(4):
+- if (a_3(D) > b_4(D))
+- goto __BB7;
+- else
+- goto __BB6;
+-
+- __BB(6):
+- goto __BB7;
+-
+- __BB(7):
+- res_1 = __PHI (__BB4: a_3(D), __BB6: b_4(D));
+- return res_1;
+-}
+-
+-/* We should be able to detect MAX despite the extra edge into
+- the middle BB. */
+-/* { dg-final { scan-tree-dump "MAX" "phiopt1" } } */
+diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
+index 079d29e74..21ac08145 100644
+--- a/gcc/tree-ssa-phiopt.c
++++ b/gcc/tree-ssa-phiopt.c
+@@ -219,6 +219,7 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
+
+ /* If either bb1's succ or bb2 or bb2's succ is non NULL. */
+ if (EDGE_COUNT (bb1->succs) == 0
++ || bb2 == NULL
+ || EDGE_COUNT (bb2->succs) == 0)
+ continue;
+
+@@ -278,14 +279,14 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
+ || (e1->flags & EDGE_FALLTHRU) == 0)
+ continue;
+
++ /* Also make sure that bb1 only have one predecessor and that it
++ is bb. */
++ if (!single_pred_p (bb1)
++ || single_pred (bb1) != bb)
++ continue;
++
+ if (do_store_elim)
+ {
+- /* Also make sure that bb1 only have one predecessor and that it
+- is bb. */
+- if (!single_pred_p (bb1)
+- || single_pred (bb1) != bb)
+- continue;
+-
+ /* bb1 is the middle block, bb2 the join block, bb the split block,
+ e1 the fallthrough edge from bb1 to bb2. We can't do the
+ optimization if the join block has more than two predecessors. */
+@@ -330,11 +331,10 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
+ node. */
+ gcc_assert (arg0 != NULL_TREE && arg1 != NULL_TREE);
+
+- gphi *newphi;
+- if (single_pred_p (bb1)
+- && (newphi = factor_out_conditional_conversion (e1, e2, phi,
+- arg0, arg1,
+- cond_stmt)))
++ gphi *newphi = factor_out_conditional_conversion (e1, e2, phi,
++ arg0, arg1,
++ cond_stmt);
++ if (newphi != NULL)
+ {
+ phi = newphi;
+ /* factor_out_conditional_conversion may create a new PHI in
+@@ -355,14 +355,12 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
+ else if (abs_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
+ cfgchanged = true;
+ else if (!early_p
+- && single_pred_p (bb1)
+ && cond_removal_in_builtin_zero_pattern (bb, bb1, e1, e2,
+ phi, arg0, arg1))
+ cfgchanged = true;
+ else if (minmax_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
+ cfgchanged = true;
+- else if (single_pred_p (bb1)
+- && spaceship_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
++ else if (spaceship_replacement (bb, bb1, e1, e2, phi, arg0, arg1))
+ cfgchanged = true;
+ }
+ }
+@@ -393,41 +391,35 @@ replace_phi_edge_with_variable (basic_block cond_block,
+ edge e, gphi *phi, tree new_tree)
+ {
+ basic_block bb = gimple_bb (phi);
++ basic_block block_to_remove;
+ gimple_stmt_iterator gsi;
+
+ /* Change the PHI argument to new. */
+ SET_USE (PHI_ARG_DEF_PTR (phi, e->dest_idx), new_tree);
+
+ /* Remove the empty basic block. */
+- edge edge_to_remove;
+ if (EDGE_SUCC (cond_block, 0)->dest == bb)
+- edge_to_remove = EDGE_SUCC (cond_block, 1);
+- else
+- edge_to_remove = EDGE_SUCC (cond_block, 0);
+- if (EDGE_COUNT (edge_to_remove->dest->preds) == 1)
+ {
+- e->flags |= EDGE_FALLTHRU;
+- e->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
+- e->probability = profile_probability::always ();
+- delete_basic_block (edge_to_remove->dest);
+-
+- /* Eliminate the COND_EXPR at the end of COND_BLOCK. */
+- gsi = gsi_last_bb (cond_block);
+- gsi_remove (&gsi, true);
++ EDGE_SUCC (cond_block, 0)->flags |= EDGE_FALLTHRU;
++ EDGE_SUCC (cond_block, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
++ EDGE_SUCC (cond_block, 0)->probability = profile_probability::always ();
++
++ block_to_remove = EDGE_SUCC (cond_block, 1)->dest;
+ }
+ else
+ {
+- /* If there are other edges into the middle block make
+- CFG cleanup deal with the edge removal to avoid
+- updating dominators here in a non-trivial way. */
+- gcond *cond = as_a <gcond *> (last_stmt (cond_block));
+- if (edge_to_remove->flags & EDGE_TRUE_VALUE)
+- gimple_cond_make_false (cond);
+- else
+- gimple_cond_make_true (cond);
++ EDGE_SUCC (cond_block, 1)->flags |= EDGE_FALLTHRU;
++ EDGE_SUCC (cond_block, 1)->flags
++ &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
++ EDGE_SUCC (cond_block, 1)->probability = profile_probability::always ();
++
++ block_to_remove = EDGE_SUCC (cond_block, 0)->dest;
+ }
++ delete_basic_block (block_to_remove);
+
+- statistics_counter_event (cfun, "Replace PHI with variable", 1);
++ /* Eliminate the COND_EXPR at the end of COND_BLOCK. */
++ gsi = gsi_last_bb (cond_block);
++ gsi_remove (&gsi, true);
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file,
+@@ -854,9 +846,6 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb,
+ allow it and move it once the transformation is done. */
+ if (!empty_block_p (middle_bb))
+ {
+- if (!single_pred_p (middle_bb))
+- return false;
+-
+ stmt_to_move = last_and_only_stmt (middle_bb);
+ if (!stmt_to_move)
+ return false;
+@@ -1236,11 +1225,6 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
+ }
+ else
+ {
+- if (!single_pred_p (middle_bb))
+- return 0;
+- statistics_counter_event (cfun, "Replace PHI with "
+- "variable/value_replacement", 1);
+-
+ /* Replace the PHI arguments with arg. */
+ SET_PHI_ARG_DEF (phi, e0->dest_idx, arg);
+ SET_PHI_ARG_DEF (phi, e1->dest_idx, arg);
+@@ -1255,6 +1239,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
+ }
+ return 1;
+ }
++
+ }
+
+ /* Now optimize (x != 0) ? x + y : y to just x + y. */
+--
+2.27.0.windows.1
+