Commit efe5143f by Martin Liska Committed by Martin Liska

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
parent a2001d44
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> 2019-08-05 Richard Biener <rguenther@suse.de>
PR middle-end/91169 PR middle-end/91169
......
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> 2019-08-05 Richard Biener <rguenther@suse.de>
PR middle-end/91169 PR middle-end/91169
......
/* 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) ...@@ -810,6 +810,11 @@ propagate_necessity (bool aggressive)
if (is_delete_operator if (is_delete_operator
|| gimple_call_builtin_p (stmt, BUILT_IN_FREE)) || 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); tree ptr = gimple_call_arg (stmt, 0);
gimple *def_stmt; gimple *def_stmt;
tree def_callee; tree def_callee;
...@@ -1323,13 +1328,18 @@ eliminate_unnecessary_stmts (void) ...@@ -1323,13 +1328,18 @@ eliminate_unnecessary_stmts (void)
|| (is_gimple_call (stmt) || (is_gimple_call (stmt)
&& gimple_call_operator_delete_p (as_a <gcall *> (stmt))))) && gimple_call_operator_delete_p (as_a <gcall *> (stmt)))))
{ {
tree ptr = gimple_call_arg (stmt, 0); /* It can happen that a user delete operator has the pointer
if (TREE_CODE (ptr) == SSA_NAME) argument optimized out already. */
if (gimple_call_num_args (stmt) > 0)
{ {
gimple *def_stmt = SSA_NAME_DEF_STMT (ptr); tree ptr = gimple_call_arg (stmt, 0);
if (!gimple_nop_p (def_stmt) if (TREE_CODE (ptr) == SSA_NAME)
&& !gimple_plf (def_stmt, STMT_NECESSARY)) {
gimple_set_plf (stmt, STMT_NECESSARY, false); 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);
}
} }
} }
......
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