Commit 28e5ca15 by Richard Biener

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
parent 8adfe01d
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 * tree-parloops.c (transform_to_exit_first_loop): Update the basic
block list passed to gimple_duplicate_sese_tail. block list passed to gimple_duplicate_sese_tail.
...@@ -7,7 +13,7 @@ ...@@ -7,7 +13,7 @@
Avoid parallelization when the preheader is IRREDUCIBLE. Avoid parallelization when the preheader is IRREDUCIBLE.
Try to optimize when estimated_loop_iterations_int is unresolved. Try to optimize when estimated_loop_iterations_int is unresolved.
Add the loop's location to the dump file. 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. (gimple_duplicate_sese_tail): Remove the check for the latch.
Redirect nexits to the exit block. Redirect nexits to the exit block.
Remove handling of the incoming edges to the latch. Remove handling of the incoming edges to the latch.
......
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> 2010-01-28 Michael Matz <matz@suse.de>
* gcc.target/i386/pr42881.c: New test. * gcc.target/i386/pr42881.c: New test.
......
// { 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();
}
}
...@@ -345,12 +345,13 @@ remove_forwarder_block (basic_block bb) ...@@ -345,12 +345,13 @@ remove_forwarder_block (basic_block bb)
if (dest == bb) if (dest == bb)
return false; return false;
/* If the destination block consists of a nonlocal label, do not merge /* If the destination block consists of a nonlocal label or is a
it. */ EH landing pad, do not merge it. */
label = first_stmt (dest); label = first_stmt (dest);
if (label if (label
&& gimple_code (label) == GIMPLE_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; return false;
/* If there is an abnormal edge to basic block BB, but not into /* If there is an abnormal edge to basic block BB, but not into
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment