aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/modref-dse.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2021-08-11 15:01:39 +0200
committerJan Hubicka <jh@suse.cz>2021-08-11 15:01:39 +0200
commit9851a1631f2915fafdc733539b6c8b5fb81e7ae5 (patch)
tree6ec5d79b94267126a39a6ce0c68e22be7c40c170 /gcc/testsuite/c-c++-common/modref-dse.c
parentd7e91f4894f6a1a2daeec5cbe1e912bb896b9f7a (diff)
downloadgcc-9851a1631f2915fafdc733539b6c8b5fb81e7ae5.zip
gcc-9851a1631f2915fafdc733539b6c8b5fb81e7ae5.tar.gz
gcc-9851a1631f2915fafdc733539b6c8b5fb81e7ae5.tar.bz2
Fix min_flags handling in mod-ref
gcc/ChangeLog: 2021-08-11 Jan Hubicka <hubicka@ucw.cz> Alexandre Oliva <oliva@adacore.com> * ipa-modref.c (modref_lattice::dump): Fix escape_point's min_flags dumping. (modref_lattice::merge_deref): Fix handling of indirect scape points. (update_escape_summary_1): Likewise. (update_escape_summary): Likewise. (ipa_merge_modref_summary_after_inlining): Likewise. gcc/testsuite/ChangeLog: * c-c++-common/modref-dse.c: New test.
Diffstat (limited to 'gcc/testsuite/c-c++-common/modref-dse.c')
-rw-r--r--gcc/testsuite/c-c++-common/modref-dse.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/modref-dse.c b/gcc/testsuite/c-c++-common/modref-dse.c
new file mode 100644
index 0000000..5f64e8f
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/modref-dse.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dse2-details" } */
+/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse2" } } */
+
+struct foo { unsigned long bar; };
+
+unsigned y;
+
+static int __attribute__ ((__noinline__, __noclone__))
+wrapped (struct foo *p, int i);
+
+static int wrapper (struct foo *p);
+
+static int __attribute__ ((__noclone__))
+wrapper (struct foo *p) {
+ return wrapped (p, 1);
+}
+
+static int __attribute__ ((__noinline__, __noclone__))
+dind (struct foo **pp);
+
+int __attribute__ ((__noclone__, __no_reorder__))
+xfn () {
+ struct foo x = { 0xBADC0FFE };
+ struct foo *p = &x;
+ return dind (&p);
+}
+
+static int __attribute__ ((__noinline__, __no_reorder__))
+wrapped (struct foo *p, int i) {
+ return p->bar + i == y++;
+}
+
+static int __attribute__ ((__noinline__, __noclone__, __no_reorder__))
+dind (struct foo **pp) {
+ wrapper (*pp);
+ return 0;
+}