aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-phiopt.cc
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@marvell.com>2023-04-20 09:23:25 -0700
committerAndrew Pinski <apinski@marvell.com>2023-04-24 08:45:10 -0700
commit2f58dd71d1b8e23f28a43360742519e92ee0c8d5 (patch)
tree21e3187824e576a9f9bf9157461c2f2588a4c1ff /gcc/tree-ssa-phiopt.cc
parentb9ee7c6bfdbfcc722f3e4c8bd8378cccd4311740 (diff)
downloadgcc-2f58dd71d1b8e23f28a43360742519e92ee0c8d5.zip
gcc-2f58dd71d1b8e23f28a43360742519e92ee0c8d5.tar.gz
gcc-2f58dd71d1b8e23f28a43360742519e92ee0c8d5.tar.bz2
PHIOPT: Move check on diamond bb to tree_ssa_phiopt_worker from minmax_replacement
This moves the check to make sure on the diamond shaped form bbs that the the two middle bbs are only for that diamond shaped form earlier in the shared code. Also remove the redundant check for single_succ_p since that was already done before hand. The next patch will simplify the code even further and remove redundant checks. PR tree-optimization/109604 gcc/ChangeLog: * tree-ssa-phiopt.cc (tree_ssa_phiopt_worker): Move the diamond form check from ... (minmax_replacement): Here. gcc/testsuite/ChangeLog: * gcc.c-torture/compile/pr109604-1.c: New test. * gcc.c-torture/compile/pr109604-2.c: New test.
Diffstat (limited to 'gcc/tree-ssa-phiopt.cc')
-rw-r--r--gcc/tree-ssa-phiopt.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
index 14e689b..c94aadb 100644
--- a/gcc/tree-ssa-phiopt.cc
+++ b/gcc/tree-ssa-phiopt.cc
@@ -218,6 +218,14 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool do_hoist_loads, bool early_p)
continue;
}
+ if (diamond_p)
+ {
+ if (!single_pred_p (bb1)
+ || !single_pred_p (bb2)
+ || !single_succ_p (bb2))
+ continue;
+ }
+
if (do_store_elim && !diamond_p)
{
/* Also make sure that bb1 only have one predecessor and that it
@@ -2029,12 +2037,6 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb, basic_block alt_
tree alt_lhs, alt_op0, alt_op1;
bool invert = false;
- if (!single_pred_p (middle_bb)
- || !single_pred_p (alt_middle_bb)
- || !single_succ_p (middle_bb)
- || !single_succ_p (alt_middle_bb))
- return false;
-
/* When THREEWAY_P then e1 will point to the edge of the final transition
from middle-bb to end. */
if (true_edge == e0)