Re: [PATCH] Improve PHI-OPT when there are multiple phis

2012-03-12 Thread Richard Guenther
On Sat, Mar 10, 2012 at 8:55 AM, Andrew Pinski
andrew.pin...@caviumnetworks.com wrote:
 Woops I forgot the patch.

Ok.

Thanks,
Richard.

 Thanks,
 Andrew Pinski

 On Fri, Mar 9, 2012 at 11:45 AM, Andrew Pinski
 andrew.pin...@caviumnetworks.com wrote:
 On Tue, Jan 24, 2012 at 2:50 AM, Richard Guenther
 richard.guent...@gmail.com wrote:
 On Tue, Jan 24, 2012 at 7:34 AM, Andrew Pinski
 andrew.pin...@caviumnetworks.com wrote:
 Hi,
  Right now PHI-OPT does try to handle the case where we have multiple
 PHIs but the other PHIs have the same value for the edges we care
 about.
 This fixes the issue and allows PHI-OPT to handle a few more cases and
 it removes the TODO in the comments.

 OK For 4.8? Bootstrapped and tested on x86_64-linux-gnu with no 
 regressions.

 Thanks,
 Andrew Pinski

 ChangeLog:
 * tree-ssa-phiopt.c (gimple_phi_singleton_for_edges): New function.

 The name is confusing I think, because it returns the single non-singleton
 PHI for the edge pair ... you can avoid choosing a better name by
 inlining it to its single call site.  I'd maybe name it
 single_non_singleton_phi_for_edges.

 Otherwise ok.

 Here is the updated patch with one small change, value_replacement
 uses single_non_singleton_phi_for_edges now too.

 OK still?  Bootstrapped and tested on x86_64-linux-gnu with no regressions.


 Thanks,
 Andrew Pinski


 ChangeLog:
 * tree-ssa-phiopt.c (single_non_singleton_phi_for_edges): New function.
 (tree_ssa_phiopt_worker): Use single_non_singleton_phi_for_edges.
 (value_replacement): Likewise.
 (empty_block_p): Check also if the PHIs for the block are empty.

 testsuite/ChangeLog:
 * gcc.dg/tree-ssa/phi-opt-7.c: New testcase.



 Thanks,
 Richard.

 (tree_ssa_phiopt_worker): Use gimple_phi_singleton_for_edges.
 (empty_block_p): Check also if the PHIs for the block are empty.

 testsuite/ChangeLog:
 * gcc.dg/tree-ssa/phi-opt-7.c: New testcase.


Re: [PATCH] Improve PHI-OPT when there are multiple phis

2012-03-09 Thread Andrew Pinski
On Tue, Jan 24, 2012 at 2:50 AM, Richard Guenther
richard.guent...@gmail.com wrote:
 On Tue, Jan 24, 2012 at 7:34 AM, Andrew Pinski
 andrew.pin...@caviumnetworks.com wrote:
 Hi,
  Right now PHI-OPT does try to handle the case where we have multiple
 PHIs but the other PHIs have the same value for the edges we care
 about.
 This fixes the issue and allows PHI-OPT to handle a few more cases and
 it removes the TODO in the comments.

 OK For 4.8? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

 Thanks,
 Andrew Pinski

 ChangeLog:
 * tree-ssa-phiopt.c (gimple_phi_singleton_for_edges): New function.

 The name is confusing I think, because it returns the single non-singleton
 PHI for the edge pair ... you can avoid choosing a better name by
 inlining it to its single call site.  I'd maybe name it
 single_non_singleton_phi_for_edges.

 Otherwise ok.

Here is the updated patch with one small change, value_replacement
uses single_non_singleton_phi_for_edges now too.

OK still?  Bootstrapped and tested on x86_64-linux-gnu with no regressions.


Thanks,
Andrew Pinski


ChangeLog:
* tree-ssa-phiopt.c (single_non_singleton_phi_for_edges): New function.
(tree_ssa_phiopt_worker): Use single_non_singleton_phi_for_edges.
(value_replacement): Likewise.
(empty_block_p): Check also if the PHIs for the block are empty.

testsuite/ChangeLog:
* gcc.dg/tree-ssa/phi-opt-7.c: New testcase.



 Thanks,
 Richard.

 (tree_ssa_phiopt_worker): Use gimple_phi_singleton_for_edges.
 (empty_block_p): Check also if the PHIs for the block are empty.

 testsuite/ChangeLog:
 * gcc.dg/tree-ssa/phi-opt-7.c: New testcase.


Re: [PATCH] Improve PHI-OPT when there are multiple phis

2012-03-09 Thread Andrew Pinski
Woops I forgot the patch.

Thanks,
Andrew Pinski

On Fri, Mar 9, 2012 at 11:45 AM, Andrew Pinski
andrew.pin...@caviumnetworks.com wrote:
 On Tue, Jan 24, 2012 at 2:50 AM, Richard Guenther
 richard.guent...@gmail.com wrote:
 On Tue, Jan 24, 2012 at 7:34 AM, Andrew Pinski
 andrew.pin...@caviumnetworks.com wrote:
 Hi,
  Right now PHI-OPT does try to handle the case where we have multiple
 PHIs but the other PHIs have the same value for the edges we care
 about.
 This fixes the issue and allows PHI-OPT to handle a few more cases and
 it removes the TODO in the comments.

 OK For 4.8? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

 Thanks,
 Andrew Pinski

 ChangeLog:
 * tree-ssa-phiopt.c (gimple_phi_singleton_for_edges): New function.

 The name is confusing I think, because it returns the single non-singleton
 PHI for the edge pair ... you can avoid choosing a better name by
 inlining it to its single call site.  I'd maybe name it
 single_non_singleton_phi_for_edges.

 Otherwise ok.

 Here is the updated patch with one small change, value_replacement
 uses single_non_singleton_phi_for_edges now too.

 OK still?  Bootstrapped and tested on x86_64-linux-gnu with no regressions.


 Thanks,
 Andrew Pinski


 ChangeLog:
 * tree-ssa-phiopt.c (single_non_singleton_phi_for_edges): New function.
 (tree_ssa_phiopt_worker): Use single_non_singleton_phi_for_edges.
 (value_replacement): Likewise.
 (empty_block_p): Check also if the PHIs for the block are empty.

 testsuite/ChangeLog:
 * gcc.dg/tree-ssa/phi-opt-7.c: New testcase.



 Thanks,
 Richard.

 (tree_ssa_phiopt_worker): Use gimple_phi_singleton_for_edges.
 (empty_block_p): Check also if the PHIs for the block are empty.

 testsuite/ChangeLog:
 * gcc.dg/tree-ssa/phi-opt-7.c: New testcase.
Index: testsuite/gcc.dg/tree-ssa/phi-opt-7.c
===
--- testsuite/gcc.dg/tree-ssa/phi-opt-7.c   (revision 0)
+++ testsuite/gcc.dg/tree-ssa/phi-opt-7.c   (revision 0)
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options -O1 -fdump-tree-optimized } */
+
+int g(int,int);
+int f(int t, int c)
+{
+  int d = 0;
+  int e = 0;
+  if (t)
+{
+  d = t;
+  if (c) e = 1;
+}
+  else d = 0, e = 0;
+  return g(d,e);
+}
+
+/* There should be one ifs as one of them should be changed into
+   a conditional and the other should be there still.  */
+/* { dg-final { scan-tree-dump-times if 1 optimized }  }*/
+/* { dg-final { scan-tree-dump-times D.\[0-9\]*_\[0-9\]* = c_\[0-9\]*.D. != 
0 1 optimized  } } */
+/* { dg-final { cleanup-tree-dump optimized } } */
+
Index: testsuite/gcc.dg/tree-ssa/phi-opt-8.c
===
--- testsuite/gcc.dg/tree-ssa/phi-opt-8.c   (revision 185132)
+++ testsuite/gcc.dg/tree-ssa/phi-opt-8.c   (working copy)
@@ -19,7 +19,7 @@ int f(int t, int c)
but currently is not as PHI-OPT does not reduce the t PHI as we have
two phis.  Note this is fixed with
http://gcc.gnu.org/ml/gcc-patches/2012-01/msg01195.html .  */
-/* { dg-final { scan-tree-dump-not if phiopt1 { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-not if phiopt1 } } */
 /* { dg-final { scan-tree-dump g .t_\[0-9\]*.D., optimized } } */
 /* { dg-final { scan-tree-dump-not PHI optimized } } */
 /* { dg-final { cleanup-tree-dump phiopt1 } } */
Index: tree-ssa-phiopt.c
===
--- tree-ssa-phiopt.c   (revision 185132)
+++ tree-ssa-phiopt.c   (working copy)
@@ -193,6 +193,33 @@ tree_ssa_cs_elim (void)
   return tree_ssa_phiopt_worker (true);
 }
 
+/* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */
+
+static gimple
+single_non_singleton_phi_for_edges (gimple_seq seq, edge e0, edge e1)
+{
+  gimple_stmt_iterator i;
+  gimple phi = NULL;
+  if (gimple_seq_singleton_p (seq))
+return gsi_stmt (gsi_start (seq));
+  for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (i))
+{
+  gimple p = gsi_stmt (i);
+  /* If the PHI arguments are equal then we can skip this PHI. */
+  if (operand_equal_for_phi_arg_p (gimple_phi_arg_def (p, e0-dest_idx),
+  gimple_phi_arg_def (p, e1-dest_idx)))
+   continue;
+
+  /* If we already have a PHI that has the two edge arguments are
+different, then return it is not a singleton for these PHIs. */
+  if (phi)
+   return NULL;
+
+  phi = p;
+}
+  return phi;
+}
+
 /* For conditional store replacement we need a temporary to
put the old contents of the memory in.  */
 static tree condstoretemp;
@@ -316,6 +343,7 @@ tree_ssa_phiopt_worker (bool do_store_el
  gimple_seq phis = phi_nodes (bb2);
  gimple_stmt_iterator gsi;
  bool candorest = true;
+
  /* Value replacement can work with more than one PHI
 so try that first. */
  for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (gsi))
@@ -333,21 +361,8 

Re: [PATCH] Improve PHI-OPT when there are multiple phis

2012-01-24 Thread Richard Guenther
On Tue, Jan 24, 2012 at 7:34 AM, Andrew Pinski
andrew.pin...@caviumnetworks.com wrote:
 Hi,
  Right now PHI-OPT does try to handle the case where we have multiple
 PHIs but the other PHIs have the same value for the edges we care
 about.
 This fixes the issue and allows PHI-OPT to handle a few more cases and
 it removes the TODO in the comments.

 OK For 4.8? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

 Thanks,
 Andrew Pinski

 ChangeLog:
 * tree-ssa-phiopt.c (gimple_phi_singleton_for_edges): New function.

The name is confusing I think, because it returns the single non-singleton
PHI for the edge pair ... you can avoid choosing a better name by
inlining it to its single call site.  I'd maybe name it
single_non_singleton_phi_for_edges.

Otherwise ok.

Thanks,
Richard.

 (tree_ssa_phiopt_worker): Use gimple_phi_singleton_for_edges.
 (empty_block_p): Check also if the PHIs for the block are empty.

 testsuite/ChangeLog:
 * gcc.dg/tree-ssa/phi-opt-7.c: New testcase.


[PATCH] Improve PHI-OPT when there are multiple phis

2012-01-23 Thread Andrew Pinski
Hi,
  Right now PHI-OPT does try to handle the case where we have multiple
PHIs but the other PHIs have the same value for the edges we care
about.
This fixes the issue and allows PHI-OPT to handle a few more cases and
it removes the TODO in the comments.

OK For 4.8? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

Thanks,
Andrew Pinski

ChangeLog:
* tree-ssa-phiopt.c (gimple_phi_singleton_for_edges): New function.
(tree_ssa_phiopt_worker): Use gimple_phi_singleton_for_edges.
(empty_block_p): Check also if the PHIs for the block are empty.

testsuite/ChangeLog:
* gcc.dg/tree-ssa/phi-opt-7.c: New testcase.
Index: testsuite/gcc.dg/tree-ssa/phi-opt-7.c
===
--- testsuite/gcc.dg/tree-ssa/phi-opt-7.c   (revision 0)
+++ testsuite/gcc.dg/tree-ssa/phi-opt-7.c   (revision 0)
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options -O1 -fdump-tree-optimized } */
+
+int g(int,int);
+int f(int t, int c)
+{
+  int d = 0;
+  int e = 0;
+  if (t)
+{
+  d = t;
+  if (c) e = 1;
+}
+  else d = 0, e = 0;
+  return g(d,e);
+}
+
+/* There should be one ifs as one of them should be changed into
+   a conditional and the other should be there still.  */
+/* { dg-final { scan-tree-dump-times if 1 optimized }  }*/
+/* { dg-final { scan-tree-dump-times D.\[0-9\]*_\[0-9\]* = c_\[0-9\]*.D. != 
0 1 optimized  } } */
+/* { dg-final { cleanup-tree-dump optimized } } */
+
Index: tree-ssa-phiopt.c
===
--- tree-ssa-phiopt.c   (revision 183458)
+++ tree-ssa-phiopt.c   (working copy)
@@ -192,6 +192,33 @@ tree_ssa_cs_elim (void)
   return tree_ssa_phiopt_worker (true);
 }
 
+/* Return the singleton PHI in the SEQ of PHIs for edges E0 and E1. */
+
+static gimple
+gimple_phi_singleton_for_edges (gimple_seq seq, edge e0, edge e1)
+{
+  gimple_stmt_iterator i;
+  gimple phi = NULL;
+  if (gimple_seq_singleton_p (seq))
+return gsi_stmt (gsi_start (seq));
+  for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (i))
+{
+  gimple p = gsi_stmt (i);
+  /* If the PHI arguments are equal then we can skip this PHI. */
+  if (operand_equal_for_phi_arg_p (gimple_phi_arg_def (p, e0-dest_idx),
+  gimple_phi_arg_def (p, e1-dest_idx)))
+   continue;
+
+  /* If we already have a PHI that has the two edge arguments are
+different, then return it is not a singleton for these PHIs. */
+  if (phi)
+   return NULL;
+
+  phi = p;
+}
+  return phi;
+}
+
 /* For conditional store replacement we need a temporary to
put the old contents of the memory in.  */
 static tree condstoretemp;
@@ -313,23 +340,9 @@ tree_ssa_phiopt_worker (bool do_store_el
   else
{
  gimple_seq phis = phi_nodes (bb2);
- gimple_stmt_iterator gsi;
+ phi = gimple_phi_singleton_for_edges (phis, e1, e2);
 
- /* Check to make sure that there is only one non-virtual PHI node.
-TODO: we could do it with more than one iff the other PHI nodes
-have the same elements for these two edges.  */
- phi = NULL;
- for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (gsi))
-   {
- if (!is_gimple_reg (gimple_phi_result (gsi_stmt (gsi
-   continue;
- if (phi)
-   {
- phi = NULL;
- break;
-   }
- phi = gsi_stmt (gsi);
-   }
+ /* Check to make sure that there is only one PHI node. */
  if (!phi)
continue;
 
@@ -431,6 +444,8 @@ empty_block_p (basic_block bb)
 {
   /* BB must have no executable statements.  */
   gimple_stmt_iterator gsi = gsi_after_labels (bb);
+  if (phi_nodes (bb))
+return false;
   if (gsi_end_p (gsi))
 return true;
   if (is_gimple_debug (gsi_stmt (gsi)))