diff options
author | Martin Liska <mliska@suse.cz> | 2019-07-29 12:39:46 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-07-29 10:39:46 +0000 |
commit | fc5e7d2ac42fbc9169458095f4fff257e4a80d03 (patch) | |
tree | 227a9d03abbe1c957aabd341678253f32a2db636 | |
parent | 3c2f6fae598f997003b73ab93bb85cb33471f389 (diff) | |
download | gcc-fc5e7d2ac42fbc9169458095f4fff257e4a80d03.zip gcc-fc5e7d2ac42fbc9169458095f4fff257e4a80d03.tar.gz gcc-fc5e7d2ac42fbc9169458095f4fff257e4a80d03.tar.bz2 |
Fix ICE seen in tree-ssa-dce.c for new/delete pair.
2019-07-29 Martin Liska <mliska@suse.cz>
* tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not
remove LHS of operator new call. It's handled latter.
2019-07-29 Martin Liska <mliska@suse.cz>
* g++.dg/cpp1y/new1.C (test_unused): Add new case that causes
ICE.
From-SVN: r273875
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/new1.C | 8 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 13 |
4 files changed, 25 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 01e4666..6ef0bd5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-07-29 Martin Liska <mliska@suse.cz> + + * tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not + remove LHS of operator new call. It's handled latter. + 2019-07-29 Richard Biener <rguenther@suse.de> PR tree-optimization/91267 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3067162..e387992 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-07-29 Martin Liska <mliska@suse.cz> + + * g++.dg/cpp1y/new1.C (test_unused): Add new case that causes + ICE. + 2019-07-29 Richard Biener <rguenther@suse.de> PR tree-optimization/91267 diff --git a/gcc/testsuite/g++.dg/cpp1y/new1.C b/gcc/testsuite/g++.dg/cpp1y/new1.C index a95dd4d..5e4f1bf 100644 --- a/gcc/testsuite/g++.dg/cpp1y/new1.C +++ b/gcc/testsuite/g++.dg/cpp1y/new1.C @@ -61,5 +61,13 @@ new_array_load() { delete [] x; } +void +test_unused() { + volatile double d = 0.0; + double *p = new double (); + d += 1.0; + delete p; +} + /* { dg-final { scan-tree-dump-times "Deleting : operator delete" 5 "cddce1"} } */ /* { dg-final { scan-tree-dump-times "Deleting : _\\d+ = operator new" 7 "cddce1"} } */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 17a8d5e..763b76f 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -1364,12 +1364,13 @@ eliminate_unnecessary_stmts (void) did not mark as necessary, it will confuse the special logic we apply to malloc/free pair removal. */ && (!(call = gimple_call_fndecl (stmt)) - || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL - || (DECL_FUNCTION_CODE (call) != BUILT_IN_ALIGNED_ALLOC - && DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC - && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC - && !ALLOCA_FUNCTION_CODE_P - (DECL_FUNCTION_CODE (call))))) + || ((DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL + || (DECL_FUNCTION_CODE (call) != BUILT_IN_ALIGNED_ALLOC + && DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC + && DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC + && !ALLOCA_FUNCTION_CODE_P + (DECL_FUNCTION_CODE (call)))) + && !DECL_IS_REPLACEABLE_OPERATOR_NEW_P (call)))) { something_changed = true; if (dump_file && (dump_flags & TDF_DETAILS)) |