diff mbox

Fix PR62079

Message ID alpine.LSU.2.11.1408131604180.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Aug. 13, 2014, 2:05 p.m. UTC
It looks like RTL peep2 can leave unreachable blocks around by
missing to check the currently write-only variable
peep2_do_cleanup_cfg at the end and cleanup the CFG in that
case.

Fixed like so, bootstrap and regtest scheduled on 
x86_64-unknown-linux-gnu.

Richard.

2014-08-13  Richard Biener  <rguenther@suse.de>

	PR rtl-optimization/62079
	* recog.c (peephole2_optimize): If peep2_do_cleanup_cfg
	run cleanup_cfg.

	* g++.dg/pr62079.C: New testcase.
diff mbox

Patch

Index: gcc/recog.c
===================================================================
--- gcc/recog.c	(revision 213909)
+++ gcc/recog.c	(working copy)
@@ -3553,6 +3553,8 @@  peephole2_optimize (void)
   BITMAP_FREE (live);
   if (peep2_do_rebuild_jump_labels)
     rebuild_jump_labels (get_insns ());
+  if (peep2_do_cleanup_cfg)
+    cleanup_cfg (CLEANUP_CFG_CHANGED);
 }
 #endif /* HAVE_peephole2 */
 
Index: gcc/testsuite/g++.dg/pr62079.C
===================================================================
--- gcc/testsuite/g++.dg/pr62079.C	(revision 0)
+++ gcc/testsuite/g++.dg/pr62079.C	(working copy)
@@ -0,0 +1,78 @@ 
+// { dg-do compile }
+// { dg-options "-std=c++11 -O2 -fnon-call-exceptions" }
+
+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 new_allocator
+{
+  template < typename _Tp1 > struct rebind
+  {
+    typedef new_allocator < _Tp1 > other;
+  };
+};
+
+template < typename _Tp > using __allocator_base = new_allocator < _Tp >;
+template < typename _Tp > class allocator:public __allocator_base < _Tp >
+{
+};
+
+template < typename _CharT, typename _Traits, typename _Alloc >
+  class basic_string
+{
+public:
+  basic_string (const _CharT * __s, const _Alloc & __a = _Alloc ());
+  ~basic_string ()noexcept;
+};
+
+template < typename T > struct add_reference
+{
+  typedef T & type;
+};
+
+template < typename ... Values > class tuple;
+template <> class tuple <>
+{
+};
+
+template < typename Head, typename ... Tail > class tuple < Head, Tail ... >:private tuple <
+  Tail ...
+  >
+{
+  typedef tuple < Tail ... >inherited;
+public:
+  template < typename ... VValues >
+    tuple (const tuple < VValues ... >&other):inherited (other.tail ()),
+    m_head (other.head ())
+  {
+  }
+  typename add_reference < const Head >::type head () const
+  {
+    return m_head;
+  }
+  const inherited & tail () const
+  {
+    return *this;
+  }
+  Head m_head;
+};
+
+template < typename T > struct make_tuple_result
+{
+  typedef T type;
+};
+
+template < typename ... Values >
+  tuple < typename make_tuple_result <
+  Values >::type ... >make_tuple (const Values & ... values);
+
+int
+main ()
+{
+  tuple < int, float, string > t3c =
+    make_tuple (17, 2.718281828, string ("Fun"));
+}