2014-08-14 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Aug 2014 08:56:49 +0000 (08:56 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Aug 2014 08:56:49 +0000 (08:56 +0000)
PR rtl-optimization/62079
* recog.c (peephole2_optimize): If peep2_do_cleanup_cfg
run cleanup_cfg.

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

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

gcc/ChangeLog
gcc/recog.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr62079.C [new file with mode: 0644]

index b821fd4..7ec321c 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-14  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/62079
+       * recog.c (peephole2_optimize): If peep2_do_cleanup_cfg
+       run cleanup_cfg.
+
 2014-08-14  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        * ipa-devirt.c (get_polymorphic_call_info): Use fndecl instead of
index cb49883..167b044 100644 (file)
@@ -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 ad9cce2..0dd986b 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-14  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/62079
+       * g++.dg/pr62079.C: New testcase.
+
 2014-08-14  Zhenqiang Chen  <zhenqiang.chen@arm.com>
 
        * gcc.target/arm/max-insns-skipped.c: New test.
diff --git a/gcc/testsuite/g++.dg/pr62079.C b/gcc/testsuite/g++.dg/pr62079.C
new file mode 100644 (file)
index 0000000..919c3e5
--- /dev/null
@@ -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"));
+}