gimple-ssa-strength-reduction.c (uses_consumed_by_stmt): New function.
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Mon, 26 Jun 2017 14:17:35 +0000 (14:17 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Mon, 26 Jun 2017 14:17:35 +0000 (14:17 +0000)
[gcc]

2016-06-26  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* gimple-ssa-strength-reduction.c (uses_consumed_by_stmt): New
function.
(find_basis_for_candidate): Call uses_consumed_by_stmt rather than
has_single_use.
(slsr_process_phi): Likewise.
(replace_uncond_cands_and_profitable_phis): Don't replace a
multiply candidate with a stride of 1 (copy or cast).
(phi_incr_cost): Call uses_consumed_by_stmt rather than
has_single_use.
(lowest_cost_path): Likewise.
(total_savings): Likewise.

[gcc/testsuite]

2016-06-26  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* gcc.dg/tree-ssa/slsr-35.c: Remove -fno-code-hoisting workaround.
* gcc.dg/tree-ssa/slsr-36.c: Likewise.

From-SVN: r249648

gcc/ChangeLog
gcc/gimple-ssa-strength-reduction.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/slsr-35.c
gcc/testsuite/gcc.dg/tree-ssa/slsr-36.c

index 75a569701557f138c2a963a726228e998a408a14..fbf52031f5292d53b1f21c8736e7646e54c61821 100644 (file)
@@ -1,3 +1,17 @@
+2016-06-26  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * gimple-ssa-strength-reduction.c (uses_consumed_by_stmt): New
+       function.
+       (find_basis_for_candidate): Call uses_consumed_by_stmt rather than
+       has_single_use.
+       (slsr_process_phi): Likewise.
+       (replace_uncond_cands_and_profitable_phis): Don't replace a
+       multiply candidate with a stride of 1 (copy or cast).
+       (phi_incr_cost): Call uses_consumed_by_stmt rather than
+       has_single_use.
+       (lowest_cost_path): Likewise.
+       (total_savings): Likewise.
+
 2017-06-26  Richard Biener  <rguenther@suse.de>
 
        PR target/81175
index 25f751a60baa051073a67615e5403b2f859cccd6..dc2cb469d6c5bd45cfff9c1e1469a9894e58732c 100644 (file)
@@ -482,6 +482,36 @@ find_phi_def (tree base)
   return c->cand_num;
 }
 
+/* Determine whether all uses of NAME are directly or indirectly
+   used by STMT.  That is, we want to know whether if STMT goes
+   dead, the definition of NAME also goes dead.  */
+static bool
+uses_consumed_by_stmt (tree name, gimple *stmt, unsigned recurse = 0)
+{
+  gimple *use_stmt;
+  imm_use_iterator iter;
+  bool retval = true;
+
+  FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
+    {
+      if (use_stmt == stmt || is_gimple_debug (use_stmt))
+       continue;
+
+      if (!is_gimple_assign (use_stmt)
+         || !gimple_get_lhs (use_stmt)
+         || !is_gimple_reg (gimple_get_lhs (use_stmt))
+         || recurse >= 10
+         || !uses_consumed_by_stmt (gimple_get_lhs (use_stmt), stmt,
+                                    recurse + 1))
+       {
+         retval = false;
+         BREAK_FROM_IMM_USE_STMT (iter);
+       }
+    }
+
+  return retval;
+}
+
 /* Helper routine for find_basis_for_candidate.  May be called twice:
    once for the candidate's base expr, and optionally again either for
    the candidate's phi definition or for a CAND_REF's alternative base
@@ -558,7 +588,8 @@ find_basis_for_candidate (slsr_cand_t c)
 
          /* If we found a hidden basis, estimate additional dead-code
             savings if the phi and its feeding statements can be removed.  */
-         if (basis && has_single_use (gimple_phi_result (phi_cand->cand_stmt)))
+         tree feeding_var = gimple_phi_result (phi_cand->cand_stmt);
+         if (basis && uses_consumed_by_stmt (feeding_var, c->cand_stmt))
            c->dead_savings += phi_cand->dead_savings;
        }
     }
@@ -789,7 +820,7 @@ slsr_process_phi (gphi *phi, bool speed)
 
          /* Gather potential dead code savings if the phi statement
             can be removed later on.  */
-         if (has_single_use (arg))
+         if (uses_consumed_by_stmt (arg, phi))
            {
              if (gimple_code (arg_stmt) == GIMPLE_PHI)
                savings += arg_cand->dead_savings;
@@ -2479,7 +2510,9 @@ replace_uncond_cands_and_profitable_phis (slsr_cand_t c)
 {
   if (phi_dependent_cand_p (c))
     {
-      if (c->kind == CAND_MULT)
+      /* A multiply candidate with a stride of 1 is just an artifice
+        of a copy or cast; there is no value in replacing it.  */
+      if (c->kind == CAND_MULT && wi::to_widest (c->stride) != 1)
        {
          /* A candidate dependent upon a phi will replace a multiply by 
             a constant with an add, and will insert at most one add for
@@ -2725,8 +2758,9 @@ phi_incr_cost (slsr_cand_t c, const widest_int &incr, gimple *phi,
          if (gimple_code (arg_def) == GIMPLE_PHI)
            {
              int feeding_savings = 0;
+             tree feeding_var = gimple_phi_result (arg_def);
              cost += phi_incr_cost (c, incr, arg_def, &feeding_savings);
-             if (has_single_use (gimple_phi_result (arg_def)))
+             if (uses_consumed_by_stmt (feeding_var, phi))
                *savings += feeding_savings;
            }
          else
@@ -2739,7 +2773,7 @@ phi_incr_cost (slsr_cand_t c, const widest_int &incr, gimple *phi,
                  tree basis_lhs = gimple_assign_lhs (basis->cand_stmt);
                  tree lhs = gimple_assign_lhs (arg_cand->cand_stmt);
                  cost += add_cost (true, TYPE_MODE (TREE_TYPE (basis_lhs)));
-                 if (has_single_use (lhs))
+                 if (uses_consumed_by_stmt (lhs, phi))
                    *savings += stmt_cost (arg_cand->cand_stmt, true);
                }
            }
@@ -2816,7 +2850,7 @@ lowest_cost_path (int cost_in, int repl_savings, slsr_cand_t c,
       gimple *phi = lookup_cand (c->def_phi)->cand_stmt;
       local_cost += phi_incr_cost (c, incr, phi, &savings);
 
-      if (has_single_use (gimple_phi_result (phi)))
+      if (uses_consumed_by_stmt (gimple_phi_result (phi), c->cand_stmt))
        local_cost -= savings;
     }
 
@@ -2860,7 +2894,7 @@ total_savings (int repl_savings, slsr_cand_t c, const widest_int &incr,
       gimple *phi = lookup_cand (c->def_phi)->cand_stmt;
       savings -= phi_incr_cost (c, incr, phi, &phi_savings);
 
-      if (has_single_use (gimple_phi_result (phi)))
+      if (uses_consumed_by_stmt (gimple_phi_result (phi), c->cand_stmt))
        savings += phi_savings;
     }
 
index 7fa3d95795022458c85b5395f47c5b4ed2ee2c26..44ff59b5eb951533b349a43366a215dcd88011fc 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-26  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * gcc.dg/tree-ssa/slsr-35.c: Remove -fno-code-hoisting workaround.
+       * gcc.dg/tree-ssa/slsr-36.c: Likewise.
+
 2017-06-26  Renlin Li  <renlin.li@arm.com>
            Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
index 9a7d8d5d253791601efd1c20f5aa91f2b6b96673..0f57ea20b79e8ff0ce31ecd92e0d0e89d900f5b5 100644 (file)
@@ -3,7 +3,7 @@
    phi has an argument which is a parameter.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O3 -fno-code-hoisting -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fdump-tree-optimized" } */
 
 int
 f (int c, int i)
index 1ab357d11c04868eb846d3cdf6ac4add7c0e0e89..448d5d2cff1a4cab86c0b2bf038295d3162e15b7 100644 (file)
@@ -3,7 +3,7 @@
    phi has an argument which is a parameter.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O3 -fno-code-hoisting -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fdump-tree-optimized" } */
 
 int
 f (int s, int c, int i)