re PR tree-optimization/88797 (Unneeded branch added when function is inlined (functi...
authorJeff Law <law@redhat.com>
Wed, 1 May 2019 17:33:32 +0000 (11:33 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 1 May 2019 17:33:32 +0000 (11:33 -0600)
PR tree-optimization/88797
* gimple-ssa-split-paths (is_feasible_trace): Reject cases where the
PHI feeds a conditional on the RHS of an assignment.

PR tree-optimization/88797
* g++.dg/tree-ssa/pr88797.C: New test.

From-SVN: r270775

gcc/ChangeLog
gcc/gimple-ssa-split-paths.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr88797.C [new file with mode: 0644]

index b6b501fe830190d7732b60eecdf0ac085909c86e..7f6ccd98c1117689a5c5483f12532ddf4ab122f2 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-01  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/88797
+       * gimple-ssa-split-paths (is_feasible_trace): Reject cases where the
+       PHI feeds a conditional on the RHS of an assignment.
+
 2019-04-30  Andrew Waterman  <andrew@sifive.com>
            Jim Wilson  <jimw@sifive.com>
 
index 33bbb66674b1d38c83f17a7ab346085049d51ff3..5bf45eeac28c9e3b124337802287d8933b67655e 100644 (file)
@@ -264,8 +264,12 @@ is_feasible_trace (basic_block bb)
          if (is_gimple_debug (stmt))
            continue;
          /* If there's a use in the joiner this might be a CSE/DCE
-            opportunity.  */
-         if (gimple_bb (stmt) == bb)
+            opportunity, but not if the use is in a conditional
+            which makes this a likely if-conversion candidate.  */
+         if (gimple_bb (stmt) == bb
+             && (!is_gimple_assign (stmt)
+                 || (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
+                     != tcc_comparison)))
            {
              found_useful_phi = true;
              break;
index 1427a8ee523f4ec1024a322637274e1f77f2221b..3620c23f82ed708134412fd3da3cbf81af8ffc5d 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-01  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/90037
+       * g++.dg/tree-ssa/pr88797.C: New test.
+
 2019-05-01  Nathan Sidwell  <nathan@acm.org>
 
        * g++.dg/cpp0x/decltype9.C: Adjust expected diagnostics.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr88797.C b/gcc/testsuite/g++.dg/tree-ssa/pr88797.C
new file mode 100644 (file)
index 0000000..75391d6
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-split-paths-details" } */
+
+
+void use(unsigned);
+bool f(unsigned x, unsigned y) {
+    return x < 1111 + (y <= 2222);
+}
+void test_f(unsigned x, unsigned y) {
+    for (unsigned i = 0; i < 3333; ++i)
+        use(f(x++, y++));
+}
+
+/* { dg-final { scan-tree-dump-not "Duplicating join block" "split-paths" } } */
+/* { dg-final { scan-tree-dump-times "Block . is a join that does not expose" 1 "split-paths" } } */
+