]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
common.opt (-flifetime-dse): New.
authorJason Merrill <jason@redhat.com>
Thu, 12 Feb 2015 20:28:41 +0000 (15:28 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 12 Feb 2015 20:28:41 +0000 (15:28 -0500)
gcc/
* common.opt (-flifetime-dse): New.
gcc/cp/
* decl.c (begin_destructor_body): Condition clobber on
-flifetime-dse.

From-SVN: r220657

gcc/ChangeLog
gcc/common.opt
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/opt/flifetime-dse1.C [new file with mode: 0644]

index 60af263eebdf3c2296e7da55f122d567ed1404a8..767e8803b9a65bfe71ff6881143309dc5b39aacf 100644 (file)
@@ -1,3 +1,7 @@
+2015-02-12  Jason Merrill  <jason@redhat.com>
+
+       * common.opt (-flifetime-dse): New.
+
 2015-02-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/65019
index cf4e5035e5525bcb96ed170b65a3f3315aedd878..6e65757b1b10e0e363a21571114a14fb61d194c2 100644 (file)
@@ -1856,6 +1856,11 @@ fregmove
 Common Ignore
 Does nothing. Preserved for backward compatibility.
 
+flifetime-dse
+Common Report Var(flag_lifetime_dse) Init(1) Optimization
+Tell DSE that the storage for a C++ object is dead when the constructor
+starts and when the destructor finishes.
+
 flive-range-shrinkage
 Common Report Var(flag_live_range_shrinkage) Init(0) Optimization
 Relief of register pressure through live range shrinkage
index e460c55619d44ef9a179cf3dc86e01a43d09ab4c..4f7564644e20076199a788adbb5b7ec57fa25c58 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-12  Jason Merrill  <jason@redhat.com>
+
+       * decl.c (begin_destructor_body): Condition clobber on
+       -flifetime-dse.
+
 2015-02-12 Andrea Azzarone <azzaronea@gmail.com>
 
        PR c++/64959
index 50b062497fa875fb1c3d531278c8db76e56b860e..810acd56e605177aa0c96eb9a6a35fa68e12b643 100644 (file)
@@ -13936,15 +13936,19 @@ begin_destructor_body (void)
       initialize_vtbl_ptrs (current_class_ptr);
       finish_compound_stmt (compound_stmt);
 
-      /* Insert a cleanup to let the back end know that the object is dead
-        when we exit the destructor, either normally or via exception.  */
-      tree btype = CLASSTYPE_AS_BASE (current_class_type);
-      tree clobber = build_constructor (btype, NULL);
-      TREE_THIS_VOLATILE (clobber) = true;
-      tree bref = build_nop (build_reference_type (btype), current_class_ptr);
-      bref = convert_from_reference (bref);
-      tree exprstmt = build2 (MODIFY_EXPR, btype, bref, clobber);
-      finish_decl_cleanup (NULL_TREE, exprstmt);
+      if (flag_lifetime_dse)
+       {
+         /* Insert a cleanup to let the back end know that the object is dead
+            when we exit the destructor, either normally or via exception.  */
+         tree btype = CLASSTYPE_AS_BASE (current_class_type);
+         tree clobber = build_constructor (btype, NULL);
+         TREE_THIS_VOLATILE (clobber) = true;
+         tree bref = build_nop (build_reference_type (btype),
+                                current_class_ptr);
+         bref = convert_from_reference (bref);
+         tree exprstmt = build2 (MODIFY_EXPR, btype, bref, clobber);
+         finish_decl_cleanup (NULL_TREE, exprstmt);
+       }
 
       /* And insert cleanups for our bases and members so that they
         will be properly destroyed if we throw.  */
index 8a04790fc1a6ccca3ca78c29c30b148e3d7ff568..5cce4f73634a5e1c0229a5bf2fc7624e5539c106 100644 (file)
@@ -7888,6 +7888,16 @@ registers after writing to their lower 32-bit half.
 Enabled for Alpha, AArch64 and x86 at levels @option{-O2},
 @option{-O3}, @option{-Os}.
 
+@item -fno-lifetime-dse
+@opindex fno-lifetime-dse
+In C++ the value of an object is only affected by changes within its
+lifetime: when the constructor begins, the object has an indeterminate
+value, and any changes during the lifetime of the object are dead when
+the object is destroyed.  Normally dead store elimination will take
+advantage of this; if your code relies on the value of the object
+storage persisting beyond the lifetime of the object, you can use this
+flag to disable this optimization.
+
 @item -flive-range-shrinkage
 @opindex flive-range-shrinkage
 Attempt to decrease register pressure through register live range
diff --git a/gcc/testsuite/g++.dg/opt/flifetime-dse1.C b/gcc/testsuite/g++.dg/opt/flifetime-dse1.C
new file mode 100644 (file)
index 0000000..733d28a
--- /dev/null
@@ -0,0 +1,23 @@
+// { dg-options "-O3 -fno-lifetime-dse" }
+// { dg-do run }
+
+typedef __SIZE_TYPE__ size_t;
+inline void * operator new (size_t, void *p) { return p; }
+
+struct A
+{
+  int i;
+  A() {}
+  ~A() {}
+};
+
+int main()
+{
+  int ar[1];
+
+  A* ap = new(ar) A;
+  ap->i = 42;
+  ap->~A();
+
+  if (ar[0] != 42) __builtin_abort();
+}