Handle new operators with no arguments in DCE.
2019-08-05 Martin Liska <mliska@suse.cz> PR c++/91334 * tree-ssa-dce.c (propagate_necessity): Handle new operators with not arguments. (eliminate_unnecessary_stmts): Likewise. 2019-08-05 Martin Liska <mliska@suse.cz> PR c++/91334 * g++.dg/torture/pr91334.C: New test. From-SVN: r274115
This commit is contained in:
parent
a2001d445a
commit
efe5143f89
@ -1,3 +1,10 @@
|
||||
2019-08-05 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR c++/91334
|
||||
* tree-ssa-dce.c (propagate_necessity): Handle new operators
|
||||
with not arguments.
|
||||
(eliminate_unnecessary_stmts): Likewise.
|
||||
|
||||
2019-08-05 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/91169
|
||||
|
@ -1,3 +1,8 @@
|
||||
2019-08-05 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR c++/91334
|
||||
* g++.dg/torture/pr91334.C: New test.
|
||||
|
||||
2019-08-05 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/91169
|
||||
|
14
gcc/testsuite/g++.dg/torture/pr91334.C
Normal file
14
gcc/testsuite/g++.dg/torture/pr91334.C
Normal file
@ -0,0 +1,14 @@
|
||||
/* PR c++/91334. */
|
||||
/* { dg-do compile } */
|
||||
|
||||
#include <new>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct A {
|
||||
A() { throw 0; }
|
||||
void* operator new(size_t size, double = 0.0) { return ::operator new(size);}
|
||||
void operator delete(void* p, double) { exit(0); }
|
||||
void operator delete(void* p) { abort(); }
|
||||
};
|
||||
|
||||
int main() { try { new A; } catch(...) {} }
|
@ -810,6 +810,11 @@ propagate_necessity (bool aggressive)
|
||||
if (is_delete_operator
|
||||
|| gimple_call_builtin_p (stmt, BUILT_IN_FREE))
|
||||
{
|
||||
/* It can happen that a user delete operator has the pointer
|
||||
argument optimized out already. */
|
||||
if (gimple_call_num_args (stmt) == 0)
|
||||
continue;
|
||||
|
||||
tree ptr = gimple_call_arg (stmt, 0);
|
||||
gimple *def_stmt;
|
||||
tree def_callee;
|
||||
@ -1323,13 +1328,18 @@ eliminate_unnecessary_stmts (void)
|
||||
|| (is_gimple_call (stmt)
|
||||
&& gimple_call_operator_delete_p (as_a <gcall *> (stmt)))))
|
||||
{
|
||||
tree ptr = gimple_call_arg (stmt, 0);
|
||||
if (TREE_CODE (ptr) == SSA_NAME)
|
||||
/* It can happen that a user delete operator has the pointer
|
||||
argument optimized out already. */
|
||||
if (gimple_call_num_args (stmt) > 0)
|
||||
{
|
||||
gimple *def_stmt = SSA_NAME_DEF_STMT (ptr);
|
||||
if (!gimple_nop_p (def_stmt)
|
||||
&& !gimple_plf (def_stmt, STMT_NECESSARY))
|
||||
gimple_set_plf (stmt, STMT_NECESSARY, false);
|
||||
tree ptr = gimple_call_arg (stmt, 0);
|
||||
if (TREE_CODE (ptr) == SSA_NAME)
|
||||
{
|
||||
gimple *def_stmt = SSA_NAME_DEF_STMT (ptr);
|
||||
if (!gimple_nop_p (def_stmt)
|
||||
&& !gimple_plf (def_stmt, STMT_NECESSARY))
|
||||
gimple_set_plf (stmt, STMT_NECESSARY, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user