re PR middle-end/42883 (internal compiler error: in redirect_eh_edge_1, at tree-eh.c:2112)

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.

	* g++.dg/torture/pr42883.C: New testcase.

From-SVN: r156322
This commit is contained in:
Richard Biener 2010-01-28 14:40:59 +00:00
parent 8adfe01d22
commit 28e5ca15b7
4 changed files with 80 additions and 5 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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();
}
}

View File

@ -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