re PR bootstrap/77768 (LTO/PGO -O3 bootstrap broken: tree-vrp.c:11053:0: internal...
authorRichard Biener <rguenther@suse.de>
Thu, 29 Sep 2016 12:31:02 +0000 (12:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 29 Sep 2016 12:31:02 +0000 (12:31 +0000)
2016-09-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/77768
* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
Handle stores to readonly memory when removing redundant stores.

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

From-SVN: r240617

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

index 6b832ed26d01224216e739c47f76e668a27ab647..26dc3f95368c4e1ecf672fdaabe46a2fd36b8142 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/77768
+       * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
+       Handle stores to readonly memory when removing redundant stores.
+
 2016-09-29  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/77407
index 9269d58bb187182a8505b90defc87ecdd625860a..2fd9e97eede9ea35fe0f31bb36cd559a3d69112c 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/77768
+       * gcc.dg/torture/pr77768.c: New testcase.
+
 2016-09-28  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/77407
diff --git a/gcc/testsuite/gcc.dg/torture/pr77768.c b/gcc/testsuite/gcc.dg/torture/pr77768.c
new file mode 100644 (file)
index 0000000..47e1484
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do run } */
+
+static const int a;
+int b;
+int *c, *d;
+int main()
+{
+  c = (int *)&a;
+  c == d ?: __builtin_exit(0); 
+  for (; b; b++ >= (*d = a))
+    ;
+  return 0;
+}
index 3675fb95fec5cf49c0056e0fe7e1af530efff74f..39bc2548c10a8203c1d9d433fc8781ed4c958819 100644 (file)
@@ -4443,9 +4443,11 @@ eliminate_dom_walker::before_dom_children (basic_block b)
              && operand_equal_p (val, rhs, 0))
            {
              /* We can only remove the later store if the former aliases
-                at least all accesses the later one does.  */
+                at least all accesses the later one does or if the store
+                was to readonly memory storing the same value.  */
              alias_set_type set = get_alias_set (lhs);
-             if (vnresult->set == set
+             if (! vnresult
+                 || vnresult->set == set
                  || alias_set_subset_of (set, vnresult->set))
                {
                  if (dump_file && (dump_flags & TDF_DETAILS))