diff options
author | Martin Liska <mliska@suse.cz> | 2019-08-05 14:53:01 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-08-05 12:53:01 +0000 |
commit | efe5143f896d224c7b0811d9ee42161ac7c4171c (patch) | |
tree | 8b78b51ea36cdfbfae76a968ca5a3af62ae6b9ac /gcc/tree-ssa-dce.c | |
parent | a2001d445a5ff419c27241019c85f1e033d89d67 (diff) | |
download | gcc-efe5143f896d224c7b0811d9ee42161ac7c4171c.zip gcc-efe5143f896d224c7b0811d9ee42161ac7c4171c.tar.gz gcc-efe5143f896d224c7b0811d9ee42161ac7c4171c.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-dce.c')
-rw-r--r-- | gcc/tree-ssa-dce.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 80d5f5c..afb7bd9 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -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); + } } } |