diff options
author | Richard Biener <rguenther@suse.de> | 2013-05-07 11:23:39 +0000 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2013-05-07 11:23:39 +0000 |
commit | d780faf52e22d5a50b016cd3b18c23fe4fbc3a93 (patch) | |
tree | ad243743b7f0922ee1b709b4627ede6a9cc57e23 | |
parent | 11e2f1c4029feacd84ce7c09aac23df1ed3c8d46 (diff) |
2013-05-07 Richard Biener <rguenther@suse.de>
PR middle-end/57190
* tree-eh.c (sink_clobbers): Properly propagate
SSA_NAME_OCCURS_IN_ABNORMAL_PHI.
* g++.dg/torture/pr57190.C: New testcase.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@198675 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr57190.C | 42 | ||||
-rw-r--r-- | gcc/tree-eh.c | 5 |
4 files changed, 58 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00a5502cbd2..879c0244054 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-05-07 Richard Biener <rguenther@suse.de> + + PR middle-end/57190 + * tree-eh.c (sink_clobbers): Properly propagate + SSA_NAME_OCCURS_IN_ABNORMAL_PHI. + 2013-05-07 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/57149 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 23e900ca13c..d7c5046e67e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-07 Richard Biener <rguenther@suse.de> + + PR middle-end/57190 + * g++.dg/torture/pr57190.C: New testcase. + 2013-05-07 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/57149 diff --git a/gcc/testsuite/g++.dg/torture/pr57190.C b/gcc/testsuite/g++.dg/torture/pr57190.C new file mode 100644 index 00000000000..9fa11cd26ba --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr57190.C @@ -0,0 +1,42 @@ +// { dg-do compile } + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class new_allocator { + }; +} +namespace std { + template<typename> class allocator; + template<class _CharT> struct char_traits; + template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_string; + typedef basic_string<char> string; + template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> { + }; + template<typename _CharT, typename _Traits, typename _Alloc> class basic_string { + public: + basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()); + }; +} +class UIException { +}; +class PasswordDialog { + void run() throw (UIException); +}; +class MessageBox { +public: + MessageBox (std::string t) throw (UIException); + virtual int run() throw (UIException) ; +}; +extern "C" { + struct __jmp_buf_tag { + }; + extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) throw (); + typedef struct __jmp_buf_tag sigjmp_buf[1]; +} +sigjmp_buf password_dialog_sig_jmp_buf; +void PasswordDialog::run() throw (UIException) +{ + __sigsetjmp (password_dialog_sig_jmp_buf, 1); + MessageBox* errmsg = __null; + errmsg = new MessageBox ("E R R O R"); + errmsg->run(); +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index cbd878ce34a..fb6fd86fae3 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -3401,6 +3401,11 @@ sink_clobbers (basic_block bb) FOR_EACH_IMM_USE_STMT (use_stmt, iter, vuse) FOR_EACH_IMM_USE_ON_STMT (use_p, iter) SET_USE (use_p, gimple_vdef (stmt)); + if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vuse)) + { + SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_vdef (stmt)) = 1; + SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vuse) = 0; + } /* Adjust the incoming virtual operand. */ SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (vphi, succe), gimple_vuse (stmt)); SET_USE (gimple_vuse_op (stmt), vuse); |