Commit f522930c by Jason Merrill Committed by Jason Merrill

common.opt (-flifetime-dse): New.

gcc/
	* common.opt (-flifetime-dse): New.
gcc/cp/
	* decl.c (begin_destructor_body): Condition clobber on
	-flifetime-dse.

From-SVN: r220657
parent bc81eb3f
2015-02-12 Jason Merrill <jason@redhat.com>
* common.opt (-flifetime-dse): New.
2015-02-12 Jakub Jelinek <jakub@redhat.com> 2015-02-12 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/65019 PR sanitizer/65019
......
...@@ -1856,6 +1856,11 @@ fregmove ...@@ -1856,6 +1856,11 @@ fregmove
Common Ignore Common Ignore
Does nothing. Preserved for backward compatibility. 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 flive-range-shrinkage
Common Report Var(flag_live_range_shrinkage) Init(0) Optimization Common Report Var(flag_live_range_shrinkage) Init(0) Optimization
Relief of register pressure through live range shrinkage Relief of register pressure through live range shrinkage
......
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> 2015-02-12 Andrea Azzarone <azzaronea@gmail.com>
PR c++/64959 PR c++/64959
......
...@@ -13936,15 +13936,19 @@ begin_destructor_body (void) ...@@ -13936,15 +13936,19 @@ begin_destructor_body (void)
initialize_vtbl_ptrs (current_class_ptr); initialize_vtbl_ptrs (current_class_ptr);
finish_compound_stmt (compound_stmt); finish_compound_stmt (compound_stmt);
/* Insert a cleanup to let the back end know that the object is dead if (flag_lifetime_dse)
when we exit the destructor, either normally or via exception. */ {
tree btype = CLASSTYPE_AS_BASE (current_class_type); /* Insert a cleanup to let the back end know that the object is dead
tree clobber = build_constructor (btype, NULL); when we exit the destructor, either normally or via exception. */
TREE_THIS_VOLATILE (clobber) = true; tree btype = CLASSTYPE_AS_BASE (current_class_type);
tree bref = build_nop (build_reference_type (btype), current_class_ptr); tree clobber = build_constructor (btype, NULL);
bref = convert_from_reference (bref); TREE_THIS_VOLATILE (clobber) = true;
tree exprstmt = build2 (MODIFY_EXPR, btype, bref, clobber); tree bref = build_nop (build_reference_type (btype),
finish_decl_cleanup (NULL_TREE, exprstmt); 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 /* And insert cleanups for our bases and members so that they
will be properly destroyed if we throw. */ will be properly destroyed if we throw. */
......
...@@ -7888,6 +7888,16 @@ registers after writing to their lower 32-bit half. ...@@ -7888,6 +7888,16 @@ registers after writing to their lower 32-bit half.
Enabled for Alpha, AArch64 and x86 at levels @option{-O2}, Enabled for Alpha, AArch64 and x86 at levels @option{-O2},
@option{-O3}, @option{-Os}. @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 @item -flive-range-shrinkage
@opindex flive-range-shrinkage @opindex flive-range-shrinkage
Attempt to decrease register pressure through register live range Attempt to decrease register pressure through register live range
......
// { 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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment