]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/58956 (wrong code at -O1 and above (affecting gcc 4.6 to trunk))
authorRichard Biener <rguenther@suse.de>
Tue, 19 Nov 2013 13:28:35 +0000 (13:28 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 19 Nov 2013 13:28:35 +0000 (13:28 +0000)
2013-11-19  Richard Biener  <rguenther@suse.de>

PR middle-end/58956
* tree-ssa-ter.c (find_replaceable_in_bb): Avoid forwarding
loads into stmts that may clobber it.

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

From-SVN: r205026

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr58956.c [new file with mode: 0644]
gcc/tree-ssa-ter.c

index 9931a0b3216f864d36e5378fdd4f94d5980fc6bd..fdfb2ef64bda148b68e54f3b7a5abd96ca3829f4 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-19  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/58956
+       * tree-ssa-ter.c (find_replaceable_in_bb): Avoid forwarding
+       loads into stmts that may clobber it.
+
 2013-11-19  Bernd Schmidt  <bernds@codesourcery.com>
 
        * cgraphunit.c (symtab_terminator): New variable.
index 7fd31dfa3d954e5361ec48b34035b9623f8f167e..89776eaab1a048d981ce291e800405c8ef5ba924 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-19  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/58956
+       * gcc.dg/torture/pr58956.c: New testcase.
+
 2013-11-19  Marek Polacek  <polacek@redhat.com>
 
        * c-c++-common/ubsan/null-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr58956.c b/gcc/testsuite/gcc.dg/torture/pr58956.c
new file mode 100644 (file)
index 0000000..7576ba7
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+struct S
+{
+  int f0;
+} a = {1}, b, g, *c = &b, **f = &c;
+
+int *d, **e = &d, h;
+
+struct S
+foo ()
+{
+  *e = &h;
+  if (!d) 
+    __builtin_unreachable ();
+  *f = &g;
+  return a;
+}
+
+int
+main ()
+{
+  struct S *i = c;
+  *i = foo ();
+  if (b.f0 != 1)
+    abort ();
+  return 0;
+}
index 883f950c11a8683b3786134b584f6e470c2e7713..9b9e655b7263a7740f8f93891046dde2944a1c34 100644 (file)
@@ -602,8 +602,7 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
              /* If the stmt does a memory store and the replacement
                 is a load aliasing it avoid creating overlapping
                 assignments which we cannot expand correctly.  */
-             if (gimple_vdef (stmt)
-                 && gimple_assign_single_p (stmt))
+             if (gimple_vdef (stmt))
                {
                  gimple def_stmt = SSA_NAME_DEF_STMT (use);
                  while (is_gimple_assign (def_stmt)
@@ -612,8 +611,8 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
                      = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (def_stmt));
                  if (gimple_vuse (def_stmt)
                      && gimple_assign_single_p (def_stmt)
-                     && refs_may_alias_p (gimple_assign_lhs (stmt),
-                                          gimple_assign_rhs1 (def_stmt)))
+                     && stmt_may_clobber_ref_p (stmt,
+                                                gimple_assign_rhs1 (def_stmt)))
                    same_root_var = true;
                }