diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2015-01-22 15:43:55 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2015-01-22 15:43:55 +0100 |
commit | 98321768552dffe06a24315a06df5ac18d8d0bd8 (patch) | |
tree | ce20eaa23273249481a78021728f472781b62270 | |
parent | e9ed6b1e27a1845351b0f4ed019266c3a202da5e (diff) | |
download | gcc-98321768552dffe06a24315a06df5ac18d8d0bd8.zip gcc-98321768552dffe06a24315a06df5ac18d8d0bd8.tar.gz gcc-98321768552dffe06a24315a06df5ac18d8d0bd8.tar.bz2 |
re PR rtl-optimization/64688 (internal compiler error: Max. number of generated reload insns per insn is achieved (90))
PR target/64688
PR target/64477
* config/i386/sse.md (vec_set<mode>_0): Use (Yi/r/C) constraints
for alternative 3.
testsuite/ChangeLog:
PR target/64688
* g++.dg/pr64688.C: New test.
From-SVN: r220000
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr64688.C | 71 |
4 files changed, 85 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d9c1258..82883c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-22-01 Uros Bizjak <ubizjak@gmail.com> + + PR target/64688 + PR target/64477 + * config/i386/sse.md (vec_set<mode>_0): Use (Yi/r/C) constraints + for alternative 3. + 2015-01-22 Trevor Saunders <tsaunders@mozilla.com> PR middle-end/63325 diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index ee2d93b..e19888e 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -6391,11 +6391,11 @@ ;; see comment above inline_secondary_memory_needed function in i386.c (define_insn "vec_set<mode>_0" [(set (match_operand:VI4F_128 0 "nonimmediate_operand" - "=Yr,*v,v,v ,x,x,v,Yr ,*x ,x ,m ,m ,m") + "=Yr,*v,v,Yi,x,x,v,Yr ,*x ,x ,m ,m ,m") (vec_merge:VI4F_128 (vec_duplicate:VI4F_128 (match_operand:<ssescalarmode> 2 "general_operand" - " Yr,*v,m,*r,m,x,v,*rm,*rm,*rm,!x,!*re,!*fF")) + " Yr,*v,m,r ,m,x,v,*rm,*rm,*rm,!x,!*re,!*fF")) (match_operand:VI4F_128 1 "vector_move_operand" " C , C,C,C ,C,0,v,0 ,0 ,x ,0 ,0 ,0") (const_int 1)))] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78b7a83..8e6dadc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-22-01 Uros Bizjak <ubizjak@gmail.com> + + PR target/64688 + * g++.dg/pr64688.C: New test. + 2015-01-22 Ilya Enkovich <ilya.enkovich@intel.com> * gcc.target/i386/chkp-always_inline.c (f1): Make static diff --git a/gcc/testsuite/g++.dg/pr64688.C b/gcc/testsuite/g++.dg/pr64688.C new file mode 100644 index 0000000..3525e49 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr64688.C @@ -0,0 +1,71 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-std=c++11 -O3 -march=westmere" } + +template <typename T> struct A { typedef typename T::next type; }; +template <typename> struct B; +template <typename T> struct N : T {}; +template <int N> struct C { + static const int value = N; + typedef C<N + 1> next; +}; +template <typename Sequence> +struct R : N<typename B<typename Sequence::tag>::template P<Sequence>> {}; +template <typename Base> struct O : Base { + typedef typename A<typename Base::size>::type size; +}; +template <typename = int> struct D { + typedef int tag; + typedef C<0> size; +}; +template <> struct B<int> { + template <typename> struct P : O<O<O<D<>>>>::size {}; +}; +template <typename> struct F; +template <typename> struct G; +template <typename, typename, int> struct H; +template <typename Element, typename Layout> struct H<Element, Layout, 3> {}; +template <int, typename E, typename L, int N> unsigned char at_c(H<E, L, N>) {} +template <typename> class I; +template <typename> class J; +template <typename> class K; +template <typename, typename> struct Q; +struct L { + typedef Q<unsigned char, F<O<O<O<D<>>>>>> *type; +}; +template <typename XIterator> struct M { typedef K<J<I<XIterator>>> view_t; }; +template <typename, typename> +struct Q : H<unsigned, F<int>, R<O<O<O<D<>>>>>::value> {}; +template <typename Iterator> struct G<I<Iterator>> { typedef Iterator type; }; +template <typename> class J { +public: + typedef G<I<Q<unsigned, int> *>>::type x_iterator; +}; +template <typename> class K { +public: + J<int>::x_iterator row_begin(int); +}; +template <typename Op> void measure_time(Op p1) { p1(); } +template <typename, typename> struct fill_nongil_t; +template <typename T, typename P> +struct fill_nongil_t<K<J<I<Q<T, F<O<O<O<D<>>>>>> *>>>, P> { + typedef K<J<I<Q<T, F<O<O<O<D<>>>>>> *>>> View; + View _v; + P _p; + fill_nongil_t(View, P); + void operator()() { + T *first = (T *)_v.row_begin(0); + T last; + while (first != &last) { + first[0] = first[1] = at_c<1>(_p); + first[2] = at_c<2>(_p); + first += 3; + } + } +}; +template <typename, typename> void test_fill(int) { + M<L::type>::view_t __trans_tmp_1; + measure_time(fill_nongil_t<K<J<I<Q<unsigned char, F<O<O<O<D<>>>>>> *>>>, + Q<unsigned char, F<O<O<O<D<>>>>>>>( + __trans_tmp_1, Q<unsigned char, F<O<O<O<D<>>>>>>())); +} +void performance_testtest_method() { test_fill<K<int>, Q<unsigned, int>>(0); } |