From 3d9fbb9abd4785660983bc1d239f3f03e8dbc67c Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 18 Sep 2008 12:52:31 +0000 Subject: [PATCH] re PR middle-end/37284 (ICE on valid code with -fstrict-aliasing) 2008-09-18 Richard Guenther PR middle-end/37284 * tree-cfg.c (remove_useless_stmts_1): Remove GIMPLE_CHANGE_DYNAMIC_TYPE if not optimizing. * g++.dg/tree-ssa/pr37284.C: New testcase. From-SVN: r140453 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr37284.C | 17 +++++++++++++++++ gcc/tree-cfg.c | 12 ++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr37284.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 093f982..f680fd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-18 Richard Guenther + + PR middle-end/37284 + * tree-cfg.c (remove_useless_stmts_1): Remove + GIMPLE_CHANGE_DYNAMIC_TYPE if not optimizing. + 2008-09-18 Nick Clifton * config/frv/frv.h (IRA_COVER_CLASSES): Define. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e905405..477455e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-18 Richard Guenther + + PR middle-end/37284 + * g++.dg/tree-ssa/pr37284.C: New testcase. + 2008-09-18 Daniel Kraft PR fortran/37507 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37284.C b/gcc/testsuite/g++.dg/tree-ssa/pr37284.C new file mode 100644 index 0000000..26ddc1a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr37284.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fstrict-aliasing" } */ + +void* operator new(__SIZE_TYPE__, void* __p) throw() +{ + return __p; +} + +class PatternDriverTop; + +typedef const PatternDriverTop* _Tp; + +void construct(_Tp* __p, const _Tp& __val) +{ + ::new((void *)__p) _Tp(__val); +} + diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index ef891e5..e9f315c 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1997,6 +1997,18 @@ remove_useless_stmts_1 (gimple_stmt_iterator *gsi, struct rus_data *data) } break; + case GIMPLE_CHANGE_DYNAMIC_TYPE: + /* If we do not optimize remove GIMPLE_CHANGE_DYNAMIC_TYPE as + expansion is confused about them and we only remove them + during alias computation otherwise. */ + if (!optimize) + { + data->last_was_goto = false; + gsi_remove (gsi, false); + break; + } + /* Fallthru. */ + default: data->last_was_goto = false; gsi_next (gsi); -- 2.7.4