diff mbox

Fix cond updating in tree-ssa-dom (PR tree-optimization/77454)

Message ID 20160913192242.GK7282@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Sept. 13, 2016, 7:22 p.m. UTC
On Tue, Sep 13, 2016 at 04:02:17PM +0200, Richard Biener wrote:
> Yes please, this should be safe.  All of the above do not look at immediate uses but at most use-def links.

Ok, here is what I've committed after another bootstrap/regtest:

2016-09-13  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/77454
	* tree-ssa-dom.c (optimize_stmt): Set modified flag on stmt after
	changing GIMPLE_COND.  Move update_stmt_if_modified call after this.
	Formatting fix.

	* gcc.dg/pr77454.c: New test.


	Jakub
diff mbox

Patch

--- gcc/tree-ssa-dom.c.jj	2016-04-28 17:26:05.428203966 +0200
+++ gcc/tree-ssa-dom.c	2016-09-13 16:25:34.194491591 +0200
@@ -1923,12 +1923,11 @@  optimize_stmt (basic_block bb, gimple_st
     {
       tree val = NULL;
 
-      update_stmt_if_modified (stmt);
-
       if (gimple_code (stmt) == GIMPLE_COND)
         val = fold_binary_loc (gimple_location (stmt),
-			   gimple_cond_code (stmt), boolean_type_node,
-                           gimple_cond_lhs (stmt),  gimple_cond_rhs (stmt));
+			       gimple_cond_code (stmt), boolean_type_node,
+			       gimple_cond_lhs (stmt),
+			       gimple_cond_rhs (stmt));
       else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
 	val = gimple_switch_index (swtch_stmt);
 
@@ -1946,6 +1945,8 @@  optimize_stmt (basic_block bb, gimple_st
 		    gimple_cond_make_true (as_a <gcond *> (stmt));
 		  else
 		    gcc_unreachable ();
+
+		  gimple_set_modified (stmt, true);
 		}
 
 	      /* Further simplifications may be possible.  */
@@ -1953,6 +1954,8 @@  optimize_stmt (basic_block bb, gimple_st
 	    }
 	}
 
+      update_stmt_if_modified (stmt);
+
       /* If we simplified a statement in such a way as to be shown that it
 	 cannot trap, update the eh information and the cfg to match.  */
       if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
--- gcc/testsuite/gcc.dg/pr77454.c.jj	2016-09-13 16:24:53.662977245 +0200
+++ gcc/testsuite/gcc.dg/pr77454.c	2016-09-13 16:24:53.662977245 +0200
@@ -0,0 +1,28 @@ 
+/* PR tree-optimization/77454 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void
+foo (unsigned char x, char y)
+{
+  while (x != 0)
+    {
+      unsigned char *a = &x;
+      int b;
+
+      if (y != 0)
+	a = (unsigned char *) &y;
+      else if (y + 1 != 0)
+	a = (unsigned char *) &y;
+      for (x = 0; x < 1; ++x)
+	b = 0;
+      for (y = 0; y < 3; ++y)
+	{
+	  y = !!y;
+	  if (y != 0)
+	    x = y;
+	}
+      if ((b != 0 ? -1 : *a) < (y = b))
+	b = 1;
+    }
+}