]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PHIOPT: Move check on diamond bb to tree_ssa_phiopt_worker from minmax_replacement
authorAndrew Pinski <apinski@marvell.com>
Thu, 20 Apr 2023 16:23:25 +0000 (09:23 -0700)
committerAndrew Pinski <apinski@marvell.com>
Mon, 24 Apr 2023 15:45:10 +0000 (08:45 -0700)
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.

gcc/testsuite/gcc.c-torture/compile/pr109604-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr109604-2.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.cc

diff --git a/gcc/testsuite/gcc.c-torture/compile/pr109604-1.c b/gcc/testsuite/gcc.c-torture/compile/pr109604-1.c
new file mode 100644 (file)
index 0000000..4374f0e
--- /dev/null
@@ -0,0 +1,13 @@
+/* This used to ICE after PHI-OPT because of the "empty block" and diamond form bbs
+   was not checking to make sure each bbs were only coming from the one bb. */
+
+int nilfs_bmap_find_target_seq_bmap;
+unsigned long nilfs_bmap_find_target_seq_bmap_0;
+unsigned long nilfs_bmap_find_target_seq() {
+  if (nilfs_bmap_find_target_seq_bmap &&
+      nilfs_bmap_find_target_seq_bmap_0 + nilfs_bmap_find_target_seq_bmap)
+    return nilfs_bmap_find_target_seq_bmap_0 + nilfs_bmap_find_target_seq_bmap;
+  else
+    return 0;
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr109604-2.c b/gcc/testsuite/gcc.c-torture/compile/pr109604-2.c
new file mode 100644 (file)
index 0000000..29db0b5
--- /dev/null
@@ -0,0 +1,13 @@
+/* This used to ICE after PHI-OPT because of the "empty block" and diamond form bbs
+   was not checking to make sure each bbs were only coming from the one bb. */
+
+struct {
+  int second;
+} selectPlayer_playerRes;
+int selectPlayer_playerRes_0;
+int selectPlayer() {
+  if (selectPlayer_playerRes_0 && selectPlayer_playerRes.second >= 0)
+    return selectPlayer_playerRes.second;
+  else
+    return -1;
+}
index 14e689bf484f6996fbd2afa409c2568c5bf4d6c5..c94aadbce8d8fe23903283f249d70ce922bd6b5c 100644 (file)
@@ -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)