On 12-10-28 8:49 PM, H.J. Lu wrote:
On Sun, Oct 28, 2012 at 5:43 PM, Vladimir Makarov <vmaka...@redhat.com> wrote:
The following patch fixes PR55106. A value in GENERAL_REGS is inherited
into a move with destination pseudo of SSE_REGS. It results into secondary
move for which inheritance is tried again an again. It means cycling LRA
passes.
The patch was successfully bootstrapped on x86/x86-64.
Committed as rev. 192904.
2012-10-28 Vladimir Makarov <vmaka...@redhat.com>
PR rtl-optimization/55106
* lra-constraints.c (skip_usage_debug_insns): New function.
(check_secondary_memory_needed_p): Ditto.
(inherit_reload_reg): Use the new functions. Improve debug
output.
Please add the testcase at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55106#c1
I've committed the following patch.
2012-10-29 Vladimir Makarov <vmaka...@redhat.com>
PR rtl-optimization/55106
* g++.dg/pr55106.C: New.
Index: testsuite/g++.dg/pr55106.C
===================================================================
--- testsuite/g++.dg/pr55106.C (revision 0)
+++ testsuite/g++.dg/pr55106.C (working copy)
@@ -0,0 +1,67 @@
+/* { dg-do compile } */
+/* { dg-options "-c -O3" } */
+template<typename _Tp> struct A {
+ typedef _Tp *pointer;
+ typedef _Tp& reference;
+ typedef _Tp& const_reference;
+ template<typename>struct rebind
+ {
+ typedef A other;
+ };
+};
+
+template<typename _Alloc>struct __alloc_traits
+{
+ typedef typename _Alloc::pointer pointer;
+ typedef typename _Alloc::reference reference;
+ typedef typename _Alloc::const_reference const_reference;
+ template<typename _Tp>struct rebind
+ {
+ typedef typename _Alloc::template rebind<_Tp>::other other;
+ };
+};
+template<typename _Tp, typename _Alloc>struct B
+{
+ typedef typename __alloc_traits<_Alloc>::template rebind<
+ _Tp>::other _Tp_alloc_type;
+ typedef typename __alloc_traits<_Tp_alloc_type>::pointer pointer;
+ struct F
+ {
+ pointer _M_start;
+ };
+ F _M_impl;
+};
+template<typename _Tp, typename _Alloc = A<_Tp> >class vec : B<_Tp, _Alloc>{
+ typedef B<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ typedef __alloc_traits<_Tp_alloc_type> _Alloc_traits;
+
+public:
+ typedef _Tp value_type;
+ typedef typename _Alloc_traits::reference reference;
+ typedef typename _Alloc_traits::const_reference const_reference;
+ reference operator[](int p1)
+ {
+ return *(this->_M_impl._M_start + p1);
+ }
+
+ const_reference operator[](long) const;
+};
+
+int a[17];
+class C {
+ vec<int> m_value;
+ void opModDivGuts(const C&);
+ int mostSetBitP1() const;
+};
+void C::opModDivGuts(const C& p1)
+{
+ int b = p1.mostSetBitP1(), c = b + 1;
+ int d[16];
+
+ for (int i = c; i; i--)
+ a[i] = p1.m_value[i] << b;
+
+ for (int i = 0; i < c; i++)
+ m_value[i] = d[i] >> b << -b;
+}