summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42883.C63
-rw-r--r--gcc/tree-cfgcleanup.c7
4 files changed, 80 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 147a8a26ada..a96de7e2b76 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,10 @@
-28-01-2010 Razya Ladelsky <razya@il.ibm.com>
+2010-01-28 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42883
+ * tree-cfgcleanup.c (remove_forwarder_block): Do not remove
+ the forwarder if the destination is an EH landing pad.
+
+2010-01-28 Razya Ladelsky <razya@il.ibm.com>
* tree-parloops.c (transform_to_exit_first_loop): Update the basic
block list passed to gimple_duplicate_sese_tail.
@@ -7,7 +13,7 @@
Avoid parallelization when the preheader is IRREDUCIBLE.
Try to optimize when estimated_loop_iterations_int is unresolved.
Add the loop's location to the dump file.
- * tree-cfg.c(add_phi_args_after_redirect): Remove.
+ * tree-cfg.c (add_phi_args_after_redirect): Remove.
(gimple_duplicate_sese_tail): Remove the check for the latch.
Redirect nexits to the exit block.
Remove handling of the incoming edges to the latch.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 675c6c5f603..7706f8702a2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-28 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42883
+ * g++.dg/torture/pr42883.C: New testcase.
+
2010-01-28 Michael Matz <matz@suse.de>
* gcc.target/i386/pr42881.c: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr42883.C b/gcc/testsuite/g++.dg/torture/pr42883.C
new file mode 100644
index 00000000000..f164c3781f5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr42883.C
@@ -0,0 +1,63 @@
+// { dg-do compile }
+
+typedef __SIZE_TYPE__ size_t;
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ public:
+ typedef size_t size_type;
+ typedef _Tp* pointer;
+ typedef _Tp& reference;
+ void deallocate(pointer __p, size_type) {
+ ::operator delete(__p);
+ }
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public:
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+ template<typename _Tp, typename _Alloc> struct _Vector_base {
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+ struct _Vector_impl : public _Tp_alloc_type {
+ typename _Tp_alloc_type::pointer _M_start;
+ typename _Tp_alloc_type::pointer _M_end_of_storage;
+ };
+ ~_Vector_base() {
+ _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
+ }
+ _Vector_impl _M_impl;
+ void _M_deallocate(typename _Tp_alloc_type::pointer __p, size_t __n) {
+ if (__p) _M_impl.deallocate(__p, __n);
+ }
+ };
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> {
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ public:
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef size_t size_type;
+ size_type size() const {
+ }
+ reference operator[](size_type __n) {
+ }
+ };
+};
+class vtkConvexPointSet {
+public:
+ static vtkConvexPointSet *New();
+};
+void MakeInternalMesh() {
+ std::vector< int > tempFaces[2];
+ std::vector< int > firstFace;
+ int i, j, k;
+ for(i = 0; i < 1000; i++) {
+ for(int pointCount = 0; pointCount < 1000; pointCount++) {
+ for(j = 0; j < (int)tempFaces[0].size(); k++)
+ if(tempFaces[0][j] == tempFaces[1][k]) break;
+ }
+ vtkConvexPointSet::New();
+ }
+}
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index 201298dc535..6810f4b0894 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -345,12 +345,13 @@ remove_forwarder_block (basic_block bb)
if (dest == bb)
return false;
- /* If the destination block consists of a nonlocal label, do not merge
- it. */
+ /* If the destination block consists of a nonlocal label or is a
+ EH landing pad, do not merge it. */
label = first_stmt (dest);
if (label
&& gimple_code (label) == GIMPLE_LABEL
- && DECL_NONLOCAL (gimple_label_label (label)))
+ && (DECL_NONLOCAL (gimple_label_label (label))
+ || EH_LANDING_PAD_NR (gimple_label_label (label)) != 0))
return false;
/* If there is an abnormal edge to basic block BB, but not into