diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2015-06-22 13:16:04 +0000 |
---|---|---|
committer | William Schmidt <wschmidt@gcc.gnu.org> | 2015-06-22 13:16:04 +0000 |
commit | 8f77aa9086f8172d87abf955a95bfbfb87440a26 (patch) | |
tree | 563f33ff5e806c563ce629fae9644d91a3657bdd | |
parent | 1a7611575b2dade35a46f99c67c2a649de2c12ad (diff) | |
download | gcc-8f77aa9086f8172d87abf955a95bfbfb87440a26.zip gcc-8f77aa9086f8172d87abf955a95bfbfb87440a26.tar.gz gcc-8f77aa9086f8172d87abf955a95bfbfb87440a26.tar.bz2 |
re PR target/65914 (error: unrecognizable insn)
[gcc]
2015-06-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR target/65914
* config/rs6000/predicates.md (altivec_register_operand): Permit
virtual stack registers.
(vsx_register_operand): Likewise.
(vfloat_operand): Likewise.
(vint_operand): Likewise.
(vlogical_operand): Likewise.
[gcc/testsuite]
2015-06-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR target/65914
* g++.dg/torture/pr65914.C: New.
From-SVN: r224725
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/rs6000/predicates.md | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr65914.C | 70 |
4 files changed, 90 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9dc3b91..9bfaa22 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2015-06-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + PR target/65914 + * config/rs6000/predicates.md (altivec_register_operand): Permit + virtual stack registers. + (vsx_register_operand): Likewise. + (vfloat_operand): Likewise. + (vint_operand): Likewise. + (vlogical_operand): Likewise. + 2015-06-22 Richard Biener <rguenther@suse.de> * tree-vectorizer.h (_loop_vec_info): Add scalar_cost_vec diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index fd293ab..e2d836f 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -41,7 +41,7 @@ if (!REG_P (op)) return 0; - if (REGNO (op) > LAST_VIRTUAL_REGISTER) + if (REGNO (op) >= FIRST_PSEUDO_REGISTER) return 1; return ALTIVEC_REGNO_P (REGNO (op)); @@ -57,7 +57,7 @@ if (!REG_P (op)) return 0; - if (REGNO (op) > LAST_VIRTUAL_REGISTER) + if (REGNO (op) >= FIRST_PSEUDO_REGISTER) return 1; return VSX_REGNO_P (REGNO (op)); @@ -74,7 +74,7 @@ if (!REG_P (op)) return 0; - if (REGNO (op) > LAST_VIRTUAL_REGISTER) + if (REGNO (op) >= FIRST_PSEUDO_REGISTER) return 1; return VFLOAT_REGNO_P (REGNO (op)); @@ -91,7 +91,7 @@ if (!REG_P (op)) return 0; - if (REGNO (op) > LAST_VIRTUAL_REGISTER) + if (REGNO (op) >= FIRST_PSEUDO_REGISTER) return 1; return VINT_REGNO_P (REGNO (op)); @@ -108,7 +108,7 @@ if (!REG_P (op)) return 0; - if (REGNO (op) > LAST_VIRTUAL_REGISTER) + if (REGNO (op) >= FIRST_PSEUDO_REGISTER) return 1; return VLOGICAL_REGNO_P (REGNO (op)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06ab497..faa73a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + PR target/65914 + * g++.dg/torture/pr65914.C: New. + 2015-06-22 Richard Biener <rguenther@suse.de> * lib/c-torture.exp: Set LTO_TORTURE_OPTIONS conditional on diff --git a/gcc/testsuite/g++.dg/torture/pr65914.C b/gcc/testsuite/g++.dg/torture/pr65914.C new file mode 100644 index 0000000..fada262 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr65914.C @@ -0,0 +1,70 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-std=c++14" } */ + +enum expression_template_option { et_on }; +template <class, expression_template_option = et_on> class A; +template <class, class, class, class = void, class = void> struct expression; +template <class T> struct B { typedef const T &type; }; +template <class tag, class A1, class A2, class A3, class A4> +struct B<expression<tag, A1, A2, A3, A4>> { + typedef expression<tag, A1, A2> type; +}; +template <class tag, class Arg1, class Arg2> +struct expression<tag, Arg1, Arg2> { + expression(Arg1 p1, const Arg2 &p2) : arg1(p1), arg2(p2) {} + typename B<Arg1>::type arg1; + typename B<Arg2>::type arg2; +}; +template <class Backend> expression<int, int, A<Backend>> sin(A<Backend>) { + return expression<int, int, A<Backend>>(0, 0); +} +template <class tag, class A1, class A2, class A3, class A4> +expression<int, int, expression<tag, A1, A2>> + asin(expression<tag, A1, A2, A3, A4> p1) { + return expression<int, int, expression<tag, A1, A2>>(0, p1); +} +template <class B, expression_template_option ET, class tag, class Arg1, + class Arg2, class Arg3, class Arg4> +expression<int, A<B>, expression<tag, Arg1, Arg2>> + operator+(A<B, ET>, expression<tag, Arg1, Arg2, Arg3, Arg4> p2) { + return expression<int, A<B>, expression<tag, Arg1, Arg2>>(0, p2); +} +template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class tag2, + class Arg1b, class Arg2b, class Arg3b, class Arg4b> +expression<int, expression<tag, Arg1, Arg2>, expression<tag2, Arg1b, Arg2b>> + operator*(expression<tag, Arg1, Arg2, Arg3, Arg4> p1, + expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> p2) { + return expression<int, expression<tag, Arg1, Arg2>, + expression<tag2, Arg1b, Arg2b>>(p1, p2); +} +template <class B> expression<int, A<B>, A<B>> operator/(A<B>, A<B>) { + return expression<int, A<B>, A<B>>(0, 0); +} +template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V> +void operator/(expression<tag, Arg1, Arg2, Arg3, Arg4>, V); +template <class, expression_template_option> class A { +public: + A() {} + template <class V> A(V) {} +}; +template <class T, class Policy> void jacobi_recurse(T, T, Policy) { + T a, b, c; + (a+asin(b/c) * sin(a)) / 0.1; +} +template <class T, class Policy> void jacobi_imp(T p1, Policy) { + T x; + jacobi_recurse(x, p1, 0); +} +template <class T, class U, class V, class Policy> +void jacobi_elliptic(T, U, V, Policy) { + jacobi_imp(static_cast<T>(0), 0); +} +template <class U, class T, class Policy> void jacobi_sn(U, T, Policy) { + jacobi_elliptic(static_cast<T>(0), 0, 0, 0); +} +template <class U, class T> void jacobi_sn(U, T p2) { jacobi_sn(0, p2, 0); } +template <class T> void test_extra(T) { + T d; + jacobi_sn(0, d); +} +void foo() { test_extra(A<int>()); } |