aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-05-07 11:23:39 +0000
committerRichard Biener <rguenther@suse.de>2013-05-07 11:23:39 +0000
commitd780faf52e22d5a50b016cd3b18c23fe4fbc3a93 (patch)
treead243743b7f0922ee1b709b4627ede6a9cc57e23
parent11e2f1c4029feacd84ce7c09aac23df1ed3c8d46 (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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr57190.C42
-rw-r--r--gcc/tree-eh.c5
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);