This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR79725


I have tested the following patch to remove (where easy) dead code
in the way of sinking.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2017-04-24  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/79725
	* tree-ssa-sink.c (statement_sink_location): Return whether
	failure reason was zero uses.  Move that check later.
	(sink_code_in_bb): Deal with zero uses by removing the stmt
	if possible.

	* gcc.dg/tree-ssa/ssa-sink-15.c: New testcase.

Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-15.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-15.c	(nonexistent)
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-15.c	(working copy)
***************
*** 0 ****
--- 1,14 ----
+ /* PR79725 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ _Complex double f(_Complex double x[])
+ {
+   _Complex float p = 1.0;
+   for (int i = 0; i < 1000000; i++)
+     p = x[i];
+   return p;
+ }
+ 
+ /* Verify we end up with a single BB and no loop.  */
+ /* { dg-final { scan-tree-dump-times "goto" 0 "optimized" } } */
Index: gcc/tree-ssa-sink.c
===================================================================
--- gcc/tree-ssa-sink.c	(revision 247060)
+++ gcc/tree-ssa-sink.c	(working copy)
@@ -244,7 +244,7 @@ select_best_block (basic_block early_bb,
 
 static bool
 statement_sink_location (gimple *stmt, basic_block frombb,
-			 gimple_stmt_iterator *togsi)
+			 gimple_stmt_iterator *togsi, bool *zero_uses_p)
 {
   gimple *use;
   use_operand_p one_use = NULL_USE_OPERAND_P;
@@ -254,6 +254,8 @@ statement_sink_location (gimple *stmt, b
   ssa_op_iter iter;
   imm_use_iterator imm_iter;
 
+  *zero_uses_p = false;
+
   /* We only can sink assignments.  */
   if (!is_gimple_assign (stmt))
     return false;
@@ -263,10 +265,6 @@ statement_sink_location (gimple *stmt, b
   if (def_p == NULL_DEF_OPERAND_P)
     return false;
 
-  /* Return if there are no immediate uses of this stmt.  */
-  if (has_zero_uses (DEF_FROM_PTR (def_p)))
-    return false;
-
   /* There are a few classes of things we can't or don't move, some because we
      don't have code to handle it, some because it's not profitable and some
      because it's not legal.
@@ -292,11 +290,17 @@ statement_sink_location (gimple *stmt, b
   */
   if (stmt_ends_bb_p (stmt)
       || gimple_has_side_effects (stmt)
-      || gimple_has_volatile_ops (stmt)
       || (cfun->has_local_explicit_reg_vars
 	  && TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))) == BLKmode))
     return false;
 
+  /* Return if there are no immediate uses of this stmt.  */
+  if (has_zero_uses (DEF_FROM_PTR (def_p)))
+    {
+      *zero_uses_p = true;
+      return false;
+    }
+
   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (DEF_FROM_PTR (def_p)))
     return false;
 
@@ -483,12 +487,23 @@ sink_code_in_bb (basic_block bb)
     {
       gimple *stmt = gsi_stmt (gsi);
       gimple_stmt_iterator togsi;
+      bool zero_uses_p;
 
-      if (!statement_sink_location (stmt, bb, &togsi))
+      if (!statement_sink_location (stmt, bb, &togsi, &zero_uses_p))
 	{
+	  gimple_stmt_iterator saved = gsi;
 	  if (!gsi_end_p (gsi))
 	    gsi_prev (&gsi);
-	  last = false;
+	  /* If we face a dead stmt remove it as it possibly blocks
+	     sinking of uses.  */
+	  if (zero_uses_p
+	      && ! gimple_vdef (stmt))
+	    {
+	      gsi_remove (&saved, true);
+	      release_defs (stmt);
+	    }
+	  else
+	    last = false;
 	  continue;
 	}
       if (dump_file)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]