re PR tree-optimization/69606 (wrong code at -Os and above on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Tue, 2 Feb 2016 12:39:36 +0000 (12:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 2 Feb 2016 12:39:36 +0000 (12:39 +0000)
2016-02-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/69606
* tree-ssa-math-opts.c (bswap_replace): Clear flow sensitive
info on the result before moving a stmt.

* gcc.dg/torture/pr69606.c: New testcase.

From-SVN: r233069

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr69606.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.c

index be546dc..0574133 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-02  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69606
+       * tree-ssa-math-opts.c (bswap_replace): Clear flow sensitive
+       info on the result before moving a stmt.
+
 2016-02-02  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        PR middle-end/68542
index 7f348ae..9d89eee 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-02  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69606
+       * gcc.dg/torture/pr69606.c: New testcase.
+
 2016-02-02  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        PR middle-end/68542
diff --git a/gcc/testsuite/gcc.dg/torture/pr69606.c b/gcc/testsuite/gcc.dg/torture/pr69606.c
new file mode 100644 (file)
index 0000000..84a0e1a
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+
+char a;
+unsigned short b;
+int c, d;
+unsigned char e;
+
+int
+main ()
+{
+  int f = 1, g = ~a;
+  if (b > f)
+    {
+      e = b; 
+      d = b | e; 
+      g = 0;
+    }
+  c = 1 % g;
+  return 0; 
+}
index abd77e7..3aa4a07 100644 (file)
@@ -2622,6 +2622,8 @@ bswap_replace (gimple *cur_stmt, gimple *src_stmt, tree fndecl,
       /* Move cur_stmt just before  one of the load of the original
         to ensure it has the same VUSE.  See PR61517 for what could
         go wrong.  */
+      if (gimple_bb (cur_stmt) != gimple_bb (src_stmt))
+       reset_flow_sensitive_info (gimple_assign_lhs (cur_stmt));
       gsi_move_before (&gsi, &gsi_ins);
       gsi = gsi_for_stmt (cur_stmt);