Commit a021961c by Jason Merrill Committed by Jason Merrill

Add -flifetime-dse=1.

gcc/
	* common.opt (flifetime-dse): Add -flifetime-dse=1.
gcc/cp/
	* decl.c (start_preparsed_function): Condition ctor clobber on
	flag_lifetime_dse > 1.

From-SVN: r233672
parent 28577b86
2016-02-24 Jason Merrill <jason@redhat.com>
* common.opt (flifetime-dse): Add -flifetime-dse=1.
2016-02-24 Richard Biener <rguenther@suse.de> 2016-02-24 Richard Biener <rguenther@suse.de>
Jakub Jelinek <jakub@redhat.com> Jakub Jelinek <jakub@redhat.com>
......
...@@ -1946,10 +1946,13 @@ Common Ignore ...@@ -1946,10 +1946,13 @@ Common Ignore
Does nothing. Preserved for backward compatibility. Does nothing. Preserved for backward compatibility.
flifetime-dse flifetime-dse
Common Report Var(flag_lifetime_dse) Init(1) Optimization Common Report Var(flag_lifetime_dse,2) Init(2) Optimization
Tell DSE that the storage for a C++ object is dead when the constructor Tell DSE that the storage for a C++ object is dead when the constructor
starts and when the destructor finishes. starts and when the destructor finishes.
flifetime-dse=
Common Joined RejectNegative UInteger Var(flag_lifetime_dse) Optimization
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.
......
2016-02-24 Jason Merrill <jason@redhat.com> 2016-02-24 Jason Merrill <jason@redhat.com>
* decl.c (start_preparsed_function): Condition ctor clobber on
flag_lifetime_dse > 1.
* cp-gimplify.c (cp_fold): Don't fold constexpr calls if -fno-inline. * cp-gimplify.c (cp_fold): Don't fold constexpr calls if -fno-inline.
2016-02-19 Jason Merrill <jason@redhat.com> 2016-02-19 Jason Merrill <jason@redhat.com>
......
...@@ -14104,7 +14104,8 @@ start_preparsed_function (tree decl1, tree attrs, int flags) ...@@ -14104,7 +14104,8 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
store_parm_decls (current_function_parms); store_parm_decls (current_function_parms);
if (!processing_template_decl if (!processing_template_decl
&& flag_lifetime_dse && DECL_CONSTRUCTOR_P (decl1) && (flag_lifetime_dse > 1)
&& DECL_CONSTRUCTOR_P (decl1)
/* We can't clobber safely for an implicitly-defined default constructor /* We can't clobber safely for an implicitly-defined default constructor
because part of the initialization might happen before we enter the because part of the initialization might happen before we enter the
constructor, via AGGR_INIT_ZERO_FIRST (c++/68006). */ constructor, via AGGR_INIT_ZERO_FIRST (c++/68006). */
......
...@@ -6809,7 +6809,10 @@ value, and any changes during the lifetime of the object are dead when ...@@ -6809,7 +6809,10 @@ value, and any changes during the lifetime of the object are dead when
the object is destroyed. Normally dead store elimination will take the object is destroyed. Normally dead store elimination will take
advantage of this; if your code relies on the value of the object 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 storage persisting beyond the lifetime of the object, you can use this
flag to disable this optimization. flag to disable this optimization. To preserve stores before the
constructor starts (e.g. because your operator new clears the object
storage) but still treat the object as dead after the destructor you,
can use -flifetime-dse=1.
@item -flive-range-shrinkage @item -flive-range-shrinkage
@opindex flive-range-shrinkage @opindex flive-range-shrinkage
......
// { dg-options "-O3 -flifetime-dse=1" }
// { 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] = { 42 };
A* ap = new(ar) A;
// With -flifetime-dse=1 we retain the old value.
if (ap->i != 42) __builtin_abort();
ap->i = 42;
ap->~A();
// When the destructor ends the object no longer exists.
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