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>
PR sanitizer/65019
......
......@@ -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
......
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
......
......@@ -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. */
......
......@@ -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
......
// { 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