aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-30 12:42:43 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-30 12:42:43 +0000
commitfdcd51150d4f0eb891c65d14232d5dad139e429b (patch)
treee87bc1ef4434173e183853be6ecbc54cf7e7dfc3
parent4592b19544445aeeeb45be9c051d948b52b7a65a (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/ChangeLog6
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/opt/flifetime-dse6.C11
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C2
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" } }