diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-03-30 12:42:43 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-03-30 12:42:43 +0000 |
commit | fdcd51150d4f0eb891c65d14232d5dad139e429b (patch) | |
tree | e87bc1ef4434173e183853be6ecbc54cf7e7dfc3 | |
parent | 4592b19544445aeeeb45be9c051d948b52b7a65a (diff) |
Backported from mainline
2016-03-17 Jakub Jelinek <jakub@redhat.com>
PR c++/70272
* decl.c (begin_destructor_body): Don't insert clobber if
is_empty_class (current_class_type).
* g++.dg/opt/flifetime-dse6.C: New test.
* g++.dg/tree-ssa/ehcleanup-1.C: Adjust unreachable count.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@234564 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/flifetime-dse6.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C | 2 |
5 files changed, 27 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 376ab14007a..8d3578f0bbc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,12 @@ 2016-03-30 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2016-03-17 Jakub Jelinek <jakub@redhat.com> + + PR c++/70272 + * decl.c (begin_destructor_body): Don't insert clobber if + is_empty_class (current_class_type). + 2016-02-19 Jakub Jelinek <jakub@redhat.com> PR c++/67767 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 3c0c9732e97..c9e87ef7760 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -13938,7 +13938,9 @@ begin_destructor_body (void) initialize_vtbl_ptrs (current_class_ptr); finish_compound_stmt (compound_stmt); - if (flag_lifetime_dse) + if (flag_lifetime_dse + /* Clobbering an empty base is harmful if it overlays real data. */ + && !is_empty_class (current_class_type)) { /* Insert a cleanup to let the back end know that the object is dead when we exit the destructor, either normally or via exception. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d811119afab..67c15f09b93 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,12 @@ 2016-03-30 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2016-03-17 Jakub Jelinek <jakub@redhat.com> + + PR c++/70272 + * g++.dg/opt/flifetime-dse6.C: New test. + * g++.dg/tree-ssa/ehcleanup-1.C: Adjust unreachable count. + 2016-03-15 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/70222 diff --git a/gcc/testsuite/g++.dg/opt/flifetime-dse6.C b/gcc/testsuite/g++.dg/opt/flifetime-dse6.C new file mode 100644 index 00000000000..6c805586252 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/flifetime-dse6.C @@ -0,0 +1,11 @@ +// PR c++/70272 +// { dg-options -O2 } +// { dg-do run } + +struct Empty { }; +struct A { A() : a(true) { } bool a; ~A() { if (!a) __builtin_abort(); } }; +struct B : Empty { B() : Empty() { } ~B() { } }; +struct C : A, B { C() : A(), B() { } ~C() { } }; +int main() { + C c; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C b/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C index b0faa93e3c5..0a29ce9cb4f 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C +++ b/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C @@ -26,6 +26,6 @@ t (void) // { dg-final { scan-tree-dump-times "Empty EH handler" 2 "ehcleanup1" } } // // And as a result also contained control flow. -// { dg-final { scan-tree-dump-times "Removing unreachable" 6 "ehcleanup1" } } +// { dg-final { scan-tree-dump-times "Removing unreachable" 4 "ehcleanup1" } } // // { dg-final { cleanup-tree-dump "ehcleanup1" } } |