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  <ja...@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.

--- 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;
+    }
+}

        Jakub

Reply via email to