[PATCH] Fix PR45705

Richard Guenther rguenther@suse.de
Mon Sep 20 15:30:00 GMT 2010


This implements redundant conditional store removal in DOM.

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

Richard.

2010-09-20  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/45705
	* tree-ssa-dom.c (optimize_stmt): Perform redundant store elimination.

	* gcc.dg/tree-ssa/ssa-dom-dse-1.c: New testcase.

Index: gcc/tree-ssa-dom.c
===================================================================
*** gcc/tree-ssa-dom.c	(revision 164430)
--- gcc/tree-ssa-dom.c	(working copy)
*************** optimize_stmt (basic_block bb, gimple_st
*** 2178,2183 ****
--- 2178,2225 ----
        update_stmt_if_modified (stmt);
        eliminate_redundant_computations (&si);
        stmt = gsi_stmt (si);
+ 
+       /* Perform simple redundant store elimination.  */
+       if (gimple_assign_single_p (stmt)
+ 	  && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
+ 	{
+ 	  tree lhs = gimple_assign_lhs (stmt);
+ 	  tree rhs = gimple_assign_rhs1 (stmt);
+ 	  tree cached_lhs;
+ 	  gimple new_stmt;
+ 	  if (TREE_CODE (rhs) == SSA_NAME)
+ 	    {
+ 	      tree tem = SSA_NAME_VALUE (rhs);
+ 	      if (tem)
+ 		rhs = tem;
+ 	    }
+ 	  /* Build a new statement with the RHS and LHS exchanged.  */
+ 	  if (TREE_CODE (rhs) == SSA_NAME)
+ 	    {
+ 	      gimple defstmt = SSA_NAME_DEF_STMT (rhs);
+ 	      new_stmt = gimple_build_assign (rhs, lhs);
+ 	      SSA_NAME_DEF_STMT (rhs) = defstmt;
+ 	    }
+ 	  else
+ 	    new_stmt = gimple_build_assign (rhs, lhs);
+ 	  gimple_set_vuse (new_stmt, gimple_vuse (stmt));
+ 	  cached_lhs = lookup_avail_expr (new_stmt, false);
+ 	  if (cached_lhs
+ 	      && rhs == cached_lhs)
+ 	    {
+ 	      basic_block bb = gimple_bb (stmt);
+ 	      int lp_nr = lookup_stmt_eh_lp (stmt);
+ 	      unlink_stmt_vdef (stmt);
+ 	      gsi_remove (&si, true);
+ 	      if (lp_nr != 0)
+ 		{
+ 		  bitmap_set_bit (need_eh_cleanup, bb->index);
+ 		  if (dump_file && (dump_flags & TDF_DETAILS))
+ 		    fprintf (dump_file, "  Flagged to clear EH edges.\n");
+ 		}
+ 	      return;
+ 	    }
+ 	}
      }
  
    /* Record any additional equivalences created by this statement.  */
Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c	(revision 0)
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-dse-1.c	(revision 0)
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O -fdump-tree-optimized" } */
+ 
+ int x;
+ void
+ foo (void)
+ {
+   if (x == 0)
+     x = 0;
+ }
+ void
+ bar (int i)
+ {
+   if (x == i)
+     x = i;
+ }
+ 
+ /* { dg-final { scan-tree-dump-not "x =" "optimized" } } */
+ /* { dg-final { cleanup-tree-dump "optimized" } } */



More information about the Gcc-patches mailing list