OSDN Git Service

2010-01-28 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Jan 2010 14:40:59 +0000 (14:40 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Jan 2010 14:40:59 +0000 (14:40 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156322 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr42883.C [new file with mode: 0644]
gcc/tree-cfgcleanup.c

index 147a8a2..a96de7e 100644 (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.
index 675c6c5..7706f87 100644 (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.
diff --git a/gcc/testsuite/g++.dg/torture/pr42883.C b/gcc/testsuite/g++.dg/torture/pr42883.C
new file mode 100644 (file)
index 0000000..f164c37
--- /dev/null
@@ -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();
+    }
+}
index 201298d..6810f4b 100644 (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