diff options
Diffstat (limited to 'gcc/testsuite')
90 files changed, 2557 insertions, 197 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6a61bb969..31f487ed1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,199 @@ +2012-10-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/54501 + * g++.dg/init/array30.C: New. + * g++.dg/init/array31.C: Likewise. + +2012-10-18 Tobias Burnus <burnus@net-b.de> + + PR fortran/54884 + * gfortran.dg/public_private_module_7.f90: New. + +2012-10-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/29633 + * g++.dg/template/pr29633.C: New. + +2012-10-18 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/loop_optimization13.ad[sb]: New test. + * gnat.dg/loop_optimization13_pkg.ads: New helper. + +2012-10-18 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> + + * gcc.target/arm/neon/vfmaQf32.c: New testcase. + * gcc.target/arm/neon/vfmaf32.c: Likewise. + * gcc.target/arm/neon/vfmsQf32.c: Likewise. + * gcc.target/arm/neon/vfmsf32.c: Likewise. + +2012-10-18 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> + + * gcc.target/arm/ftest-armv8a-arm.c: New testcase. + * gcc.target/arm/ftest-armv8a-thumb.c: Likewise. + * gcc.target/arm/ftest-support-arm.h (feature_matrix): Add + ARMv8-A row. + * gcc.target/arm/ftest-support-thumb.h (feature_matrix): + Likewise. + * gcc.target/arm/ftest-support.h (architecture): Add ARMv8-A. + * lib/target-supports.exp: Add ARMv8-A architecture expectation. + +2012-10-16 Jan Hubicka <jh@suse.cz> + + * gcc.target/i386/l_fma_float_?.c: Update. + * gcc.target/i386/l_fma_double_?.c: Update. + * gfortran.dg/do_1.f90: XFAIL + * gcc.dg/tree-ssa/cunroll-1.c: New testcase. + * gcc.dg/tree-ssa/cunroll-2.c: New testcase. + * gcc.dg/tree-ssa/cunroll-3.c: New testcase. + * gcc.dg/tree-ssa/cunroll-4.c: New testcase. + * gcc.dg/tree-ssa/cunroll-5.c: New testcase. + * gcc.dg/tree-ssa/ldist-17.c: Block cunroll to make testcase still + valid. + +2012-10-16 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c/53063 + PR c/40989 + * gcc.dg/Wstrict-overflow-24.c: New. + +2012-10-16 Tobias Burnus <burnus@net-b.de> + + PR fortran/50981 + PR fortran/54618 + * gfortran.dg/class_optional_1.f90: New. + * gfortran.dg/class_optional_2.f90: New. + +2012-10-16 Jakub Jelinek <jakub@redhat.com> + + PR debug/54796 + * gcc.dg/guality/pr54796.c: New test. + + PR tree-optimization/54889 + * gfortran.dg/pr54889.f90: New test. + +2012-10-16 Eric Botcazou <ebotcazou@adacore.com> + + * g++.dg/other/dump-ada-spec-2.C: New test. + +2012-10-16 Easwaran Raman <eraman@google.com> + + * gcc.dg/tree-prof/switch-case-1.c: New test case. + * gcc.dg/tree-prof/switch-case-2.c: New test case. + +2012-10-16 Hans-Peter Nilsson <hp@bitrange.com> + + * gcc.dg/torture/stackalign/builtin-apply-2.c, + gcc.dg/builtin-apply2.c: Correct STACK_ARGUMENTS_SIZE for MMIX. + +2012-10-15 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/54925 + * gcc.c-torture/compile/pr54925.c: New. + +2012-10-15 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/51244 + * gcc.target/sh/pr51244-17.c: New. + +2012-10-15 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/54760 + * gcc.target/sh/pr54760-2.c: Add long long and unsigned long long test + functions. + * gcc.target/sh/pr54760-4.c: New. + +2012-10-15 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/34777 + * gcc.target/sh/torture/sh-torture.exp: New. + * gcc.target/sh/torture/pr34777.c: New. + +2012-10-15 Matthias Klose <doko@ubuntu.com> + + * lib/target-supports.exp (check_profiling_available): Match + arm*-*-linux-* for ARM Linux/GNU. + * g++.dg/torture/predcom-1.C: Match arm*-*-linux-* for ARM Linux/GNU. + * gfortran.dg/enum_10.f90: Likewise. + * gfortran.dg/enum_9.f90: Likewise. + * gcc.target/arm/synchronize.c: Likewise. + * g++.old-deja/g++.jason/enum6.C: Likewise. + * g++.old-deja/g++.other/enum4.C: Likewise. + * g++.old-deja/g++.law/enum9.C: Likewise. + +2012-10-15 Richard Sandiford <rdsandiford@googlemail.com> + + * g++.dg/tls/thread_local-cse.C: Move dg-do line. + * g++.dg/tls/thread_local-wrap4.C: Require fpic. + +2012-10-15 Alexandre Oliva <aoliva@redhat.com> + Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/17805 + * g++.dg/overload/operator6.C: New. + +2012-10-15 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/50080 (again) + * g++.dg/parse/tmpl-outside2.C: Tweak, error in C++98. + * g++.dg/parse/tmpl-outside1.C: Likewise. + * g++.dg/template/qualttp18.C: Likewise. + * g++.old-deja/g++.pt/memtemp87.C: Likewise. + * g++.old-deja/g++.pt/overload13.C: Likewise. + +2012-10-15 Uros Bizjak <ubizjak@gmail.com> + + * gcc.target/i386/avx256-unaligned-load-1.c: Update asm scan patterns. + * gcc.target/i386/avx256-unaligned-load-2.c: Ditto. + * gcc.target/i386/avx256-unaligned-load-3.c: Ditto. + * gcc.target/i386/avx256-unaligned-load-4.c: Ditto. + * gcc.target/i386/avx256-unaligned-store-1.c: Ditto. + * gcc.target/i386/avx256-unaligned-store-2.c: Ditto. + * gcc.target/i386/avx256-unaligned-store-3.c: Ditto. + * gcc.target/i386/avx256-unaligned-store-4.c: Ditto. + +2012-10-15 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/50080 + * g++.dg/parse/tmpl-outside2.C: New. + * g++.dg/parse/tmpl-outside1.C: Adjust. + * g++.dg/template/qualttp18.C: Likewise. + * g++.old-deja/g++.pt/memtemp87.C: Likewise. + * g++.old-deja/g++.pt/overload13.C: Likewise. + +2012-10-15 Marc Glisse <marc.glisse@inria.fr> + + PR tree-optimization/54915 + * gcc.dg/tree-ssa/pr54915.c: New testcase. + +2012-10-15 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/54920 + * gcc.dg/torture/pr54920.c: New testcase. + +2012-10-15 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/unchecked_convert9.ad[sb]: New test. + +2012-10-13 Jason Merrill <jason@redhat.com> + + * g++.dg/tls/thread_local7g.C: Require tls_native. + +2012-10-14 Jason Merrill <jason@redhat.com> + + * g++.dg/cpp0x/inh-ctor1.C: New. + * g++.dg/cpp0x/inh-ctor2.C: New. + * g++.dg/cpp0x/inh-ctor3.C: New. + * g++.dg/cpp0x/inh-ctor4.C: New. + * g++.dg/cpp0x/inh-ctor5.C: New. + * g++.dg/cpp0x/inh-ctor6.C: New. + * g++.dg/cpp0x/inh-ctor7.C: New. + * g++.dg/cpp0x/inh-ctor8.C: New. + * g++.dg/cpp0x/inh-ctor9.C: New. + * g++.dg/cpp0x/inh-ctor10.C: New. + * g++.dg/cpp0x/inh-ctor11.C: New. + * g++.dg/cpp0x/inh-ctor12.C: New. + * g++.dg/cpp0x/inh-ctor13.C: New. + 2012-10-14 Steven Bosscher <steven@gcc.gnu.org> PR rtl-optimization/54919 diff --git a/gcc/testsuite/c-c++-common/tm/pr54893.c b/gcc/testsuite/c-c++-common/tm/pr54893.c new file mode 100644 index 000000000..8967f384a --- /dev/null +++ b/gcc/testsuite/c-c++-common/tm/pr54893.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-fgnu-tm -fdump-ipa-tmipa" } */ + +/* Test that volatiles are allowed inside relaxed transactions. */ + +volatile int test_var = 0; + +int main() +{ + __transaction_relaxed { + test_var++; + } +} + +/* { dg-final { scan-ipa-dump "GTMA_DOES_GO_IRREVOCABLE" "tmipa" } } */ +/* { dg-final { cleanup-ipa-dump "tmipa" } } */ diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C new file mode 100644 index 000000000..996031065 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C @@ -0,0 +1,17 @@ +// { dg-options -std=c++11 } + +struct A +{ + int i; + constexpr A(int i): i(i) {} +}; + +struct B: A +{ + using A::A; +}; + +constexpr B b(42); + +#define SA(X) static_assert((X),#X) +SA(b.i == 42); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C new file mode 100644 index 000000000..de5745358 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++11" } + +struct A +{ + template <class... Ts> A(Ts...); +}; + +struct B: A +{ + using A::A; +}; + +B b1(42); +B b2(1.0, 42, (void*)0); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C new file mode 100644 index 000000000..8e8ff010f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++11" } + +struct A +{ + A(int, ...); +}; + +struct B: A +{ + using A::A; +}; + +B b1(42); +B b2(42, 1.0); // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C new file mode 100644 index 000000000..257487efb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C @@ -0,0 +1,26 @@ +// { dg-options "-std=c++11" } +// { dg-do run } + +struct A +{ + int i; + template <class T> + A(T t) noexcept : i(t) {} +}; + +struct C +{ + C() { throw 42; } +}; + +struct B: A, C +{ + using A::A; +}; + +int main() +{ + try { B b(24); } + catch (int) { return 0; } + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C new file mode 100644 index 000000000..2e18e5d62 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C @@ -0,0 +1,22 @@ +// { dg-options "-std=c++11" } + +struct A +{ + int i; + template <class T> A(T t); +}; + +struct C +{ + C() = delete; // { dg-error "declared here" } +}; + +struct B: A, C +{ + using A::A; // { dg-error "C::C" } +}; + +int main() +{ + B b(24); // { dg-error "B::B" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C new file mode 100644 index 000000000..621ba604c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C @@ -0,0 +1,19 @@ +// { dg-options -std=c++11 } + +struct A +{ + int i; + constexpr A(int, int i = num): i(i) {} +private: + static const int num = 42; +}; + +struct B: A +{ + using A::A; +}; + +constexpr B b(24); + +#define SA(X) static_assert((X),#X) +SA(b.i == 42); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C new file mode 100644 index 000000000..7116e2f07 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C @@ -0,0 +1,17 @@ +// { dg-options -std=c++11 } + +struct B1 { + B1(int); +}; +struct B2 { + B2(int); +}; +struct D1 : B1, B2 { + using B1::B1; // { dg-error "inherited" } + using B2::B2; // { dg-error "inherited" } +}; // ill-formed: attempts to declare D1(int) twice +struct D2 : B1, B2 { + using B1::B1; + using B2::B2; + D2(int); // OK: user declaration supersedes both implicit declarations +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C new file mode 100644 index 000000000..b6754dc4a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C @@ -0,0 +1,18 @@ +// From N3337 +// { dg-options -std=c++11 } + +struct B1 { + B1(int); +}; +struct B2 { + B2(int = 13, int = 42); +}; +struct D1 : B1 { + using B1::B1; +}; +struct D2 : B2 { + using B2::B2; +}; + +D1 d1(1); +D2 d2a(2), d2b(3,4); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C new file mode 100644 index 000000000..a8aa6d98a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C @@ -0,0 +1,21 @@ +// { dg-options "-std=c++11" } + +struct B1 { + B1(int) { } +}; +struct B2 { + B2(double) { } +}; +struct D1 : B1 { // { dg-error "no match" } + using B1::B1; // implicitly declares D1(int) + int x; +}; +void test() { + D1 d(6); // OK: d.x is not initialized + D1 e; // { dg-error "deleted" } D1 has no default constructor +} +struct D2 : B2 { + using B2::B2; // { dg-error "no match" } implicitly declares D2(double) + B1 b; +}; +D2 f(1.0); // { dg-error "deleted" } B1 has no default constructor diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C new file mode 100644 index 000000000..5ac88d6b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++11" } + +extern "C" int printf (const char *, ...); +template< class T > +struct D : T { + using T::T; + // declares all constructors from class T + ~D() { printf ("Destroying wrapper\n"); } +}; + +struct A { + A(int); +}; + +D<A> d(42); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C new file mode 100644 index 000000000..226082467 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C @@ -0,0 +1,18 @@ +// { dg-options "-std=c++11" } + +struct A +{ + int i; + template <class T> + constexpr A(T t): i(t) {} +}; + +struct B: A +{ + using A::A; +}; + +constexpr B b(42); + +#define SA(X) static_assert((X),#X) +SA(b.i == 42); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C new file mode 100644 index 000000000..d55d3d2a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C @@ -0,0 +1,20 @@ +// { dg-options "-std=c++11" } + +struct A +{ + int i; + explicit A(int i): i(i) {} +}; + +struct B: A +{ + using A::A; +}; + +void f(B); + +int main() +{ + f(B(42)); // OK + f(42); // { dg-error "could not convert" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C new file mode 100644 index 000000000..dc5e86b63 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++11" } + +class A +{ + int i; +protected: + A(int i): i(i) {} +}; + +struct B: A +{ + using A::A; // { dg-error "protected" } +}; + +B b(42); // { dg-error "this context" } diff --git a/gcc/testsuite/g++.dg/init/array30.C b/gcc/testsuite/g++.dg/init/array30.C new file mode 100644 index 000000000..696d9bf99 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array30.C @@ -0,0 +1,7 @@ +// PR c++/54501 +// { dg-options "" } + +int main() +{ + int a[][0] = {0}; // { dg-error "too many" } +} diff --git a/gcc/testsuite/g++.dg/init/array31.C b/gcc/testsuite/g++.dg/init/array31.C new file mode 100644 index 000000000..9bb66a595 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array31.C @@ -0,0 +1,10 @@ +// PR c++/54501 +// { dg-options "" } + +struct A +{ + int i[0]; + int j; +}; + +struct A a = { 1 }; diff --git a/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C b/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C new file mode 100644 index 000000000..87c183aab --- /dev/null +++ b/gcc/testsuite/g++.dg/other/dump-ada-spec-2.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-ada-spec" } */ + +struct S +{ + int it; + __extension__ unsigned char data[]; +}; + +/* { dg-final { scan-ada-spec "array \\(0 .. -1\\)" } } */ +/* { dg-final { cleanup-ada-spec } } */ diff --git a/gcc/testsuite/g++.dg/overload/operator6.C b/gcc/testsuite/g++.dg/overload/operator6.C new file mode 100644 index 000000000..5002602b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator6.C @@ -0,0 +1,27 @@ +// PR c++/17805 + +// Per 13.3.1.2/3 bullet 2, an operator function is not a candidate +// for overload resolution if neither argument is of class type and +// neither enumerator-typed argument gets an exact match, with or +// without reference binding, for the corresponding parameter. + +struct A +{ + A(int); + A(const char*); +}; + +bool operator==(const A&, const A&); +const A& operator*(const A&); + +enum E { e }; + +bool b1 = (e == ""); // { dg-error "no match" } + +bool b2 = (A(1) == ""); + +bool b3 = (e == A(1)); + +const A& a1 = *e; // { dg-error "no match" } + +const A& a2 = *A(1); diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C index e63e3cd44..7d969e468 100644 --- a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C +++ b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C @@ -7,4 +7,4 @@ struct X template <int i> struct Y {}; }; -typedef X::template Y<0> y; // { dg-error "template|invalid" } +typedef X::template Y<0> y; // { dg-error "template|invalid" "" { target c++98 } } diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside2.C b/gcc/testsuite/g++.dg/parse/tmpl-outside2.C new file mode 100644 index 000000000..54d39fa88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-outside2.C @@ -0,0 +1,19 @@ +// PR c++/50080 + +template <typename T> +struct A +{ + template <typename U> + struct B {}; +}; + +template <typename T> +void test() +{ + typename A<T>::template B<int> b; +} + +int main() +{ + typename A<double>::template B<int> b; // { dg-error "template|expected" "" { target c++98 } } +} diff --git a/gcc/testsuite/g++.dg/template/pr29633.C b/gcc/testsuite/g++.dg/template/pr29633.C new file mode 100644 index 000000000..3e0254a46 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr29633.C @@ -0,0 +1,29 @@ +// PR c++/29633 + +template <typename T> +struct Class1 +{ + void testfn1(void); +}; + +template <typename T> +class Class2 +{ +public: + void testfn2(void) + { + Class1<T> * tc_a; + do + { + int x = 0; + } + while (tc_a && tc_a->testfn1); // { dg-error "invalid use of member" } + } +}; + +int main(void) +{ + Class2<int> tc2; + tc2.testfn2(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp18.C b/gcc/testsuite/g++.dg/template/qualttp18.C index 31dfa6a83..691517fd3 100644 --- a/gcc/testsuite/g++.dg/template/qualttp18.C +++ b/gcc/testsuite/g++.dg/template/qualttp18.C @@ -14,7 +14,7 @@ template <template <class> class TT> struct X struct C { - X<A::template B> x; // { dg-error "" } + X<A::template B> x; // { dg-error "template" "" { target c++98 } } }; int main() diff --git a/gcc/testsuite/g++.dg/tls/thread_local-cse.C b/gcc/testsuite/g++.dg/tls/thread_local-cse.C index 47c6aede3..29553d2ba 100644 --- a/gcc/testsuite/g++.dg/tls/thread_local-cse.C +++ b/gcc/testsuite/g++.dg/tls/thread_local-cse.C @@ -1,11 +1,11 @@ // Test for CSE of the wrapper function: we should only call it once // for the two references to ir. +// { dg-do run } // { dg-options "-std=c++11 -O -fno-inline -save-temps" } // { dg-require-effective-target tls_runtime } // { dg-require-alias } // { dg-final { scan-assembler-times "call *_ZTW2ir" 1 { xfail *-*-* } } } // { dg-final cleanup-saved-temps } -// { dg-do run } // XFAILed until the back end supports a way to mark a function as cseable // though not pure. diff --git a/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C b/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C index 130114811..7c8481cc2 100644 --- a/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C +++ b/gcc/testsuite/g++.dg/tls/thread_local-wrap4.C @@ -2,6 +2,7 @@ // copy per shared object. // { dg-require-effective-target tls } +// { dg-require-effective-target fpic } // { dg-options "-std=c++11 -fPIC" } // { dg-final { scan-assembler-not "_ZTW1i@PLT" { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/tls/thread_local7g.C b/gcc/testsuite/g++.dg/tls/thread_local7g.C index 696059817..3479aeb31 100644 --- a/gcc/testsuite/g++.dg/tls/thread_local7g.C +++ b/gcc/testsuite/g++.dg/tls/thread_local7g.C @@ -3,7 +3,7 @@ // { dg-require-alias } // The reference temp should be TLS, not normal data. -// { dg-final { scan-assembler-not "\\.data" } } +// { dg-final { scan-assembler-not "\\.data" { target tls_native } } } thread_local int&& ir = 42; diff --git a/gcc/testsuite/g++.dg/torture/predcom-1.C b/gcc/testsuite/g++.dg/torture/predcom-1.C index c668cac60..9e9a4b38c 100644 --- a/gcc/testsuite/g++.dg/torture/predcom-1.C +++ b/gcc/testsuite/g++.dg/torture/predcom-1.C @@ -1,5 +1,5 @@ /* Test for ICE in predictive commoning with empty loop header block - on arm-none-linux-gnueabi. */ + on arm-none-linux-*. */ struct Foo { diff --git a/gcc/testsuite/g++.old-deja/g++.jason/enum6.C b/gcc/testsuite/g++.old-deja/g++.jason/enum6.C index 7be0cd868..97bc2bafe 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/enum6.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/enum6.C @@ -7,10 +7,10 @@ // enum-size attributes should only be emitted if there are values of // enum type that can escape the compilation unit, gcc cannot currently // detect this; if this facility is added then this linker option should -// not be needed. arm-*-linux*eabi should be a good approximation to +// not be needed. arm-*-linux* should be a good approximation to // those platforms where the EABI supplement defines enum values to be // 32 bits wide. -// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } } +// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux* } } #include <limits.h> diff --git a/gcc/testsuite/g++.old-deja/g++.law/enum9.C b/gcc/testsuite/g++.old-deja/g++.law/enum9.C index 5a74b2f6f..e4045b50b 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/enum9.C +++ b/gcc/testsuite/g++.old-deja/g++.law/enum9.C @@ -7,10 +7,10 @@ // enum-size attributes should only be emitted if there are values of // enum type that can escape the compilation unit, gcc cannot currently // detect this; if this facility is added then this linker option should -// not be needed. arm-*-linux*eabi should be a good approximation to +// not be needed. arm-*-linux* should be a good approximation to // those platforms where the EABI supplement defines enum values to be // 32 bits wide. -// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } } +// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux* } } // GROUPS passed enums extern "C" int printf (const char *, ...); diff --git a/gcc/testsuite/g++.old-deja/g++.other/enum4.C b/gcc/testsuite/g++.old-deja/g++.other/enum4.C index 429e8127c..3c8bb0c08 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/enum4.C +++ b/gcc/testsuite/g++.old-deja/g++.other/enum4.C @@ -9,10 +9,10 @@ // enum-size attributes should only be emitted if there are values of // enum type that can escape the compilation unit, gcc cannot currently // detect this; if this facility is added then this linker option should -// not be needed. arm-*-linux*eabi should be a good approximation to +// not be needed. arm-*-linux* should be a good approximation to // those platforms where the EABI supplement defines enum values to be // 32 bits wide. -// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } } +// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux* } } enum E { a = -312 diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C index 99b4cd384..51a66fd41 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C @@ -12,5 +12,4 @@ public: template<template<class> class> class Y { }; -Q::template X<int> x; // { dg-error "" } template syntax - +Q::template X<int> x; // { dg-error "template" "" { target c++98 } } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/overload13.C b/gcc/testsuite/g++.old-deja/g++.pt/overload13.C index f66f1038c..9c985141f 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/overload13.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/overload13.C @@ -7,5 +7,5 @@ struct A { int main () { A a; - return a.template f (0); // { dg-error "" } + return a.template f (0); // { dg-error "template" "" { target c++98 } } } diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54925.c b/gcc/testsuite/gcc.c-torture/compile/pr54925.c new file mode 100644 index 000000000..72349c9d7 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54925.c @@ -0,0 +1,27 @@ +/* PR target/54925 */ +extern int bar; +extern void foo (int *); +static unsigned char * +nr_memcpy (unsigned char *, unsigned char *, unsigned short); + +void +baz (char *buf, unsigned short len) +{ + unsigned char data[10]; + if (len == 0) + return; + nr_memcpy (data, (unsigned char *) buf, len); + foo (&bar); +} + +static unsigned char * +nr_memcpy (unsigned char * to, unsigned char * from, unsigned short len) +{ + unsigned char *p = to; + while (len > 0) + { + len--; + *to++ = *from++; + } + return p; +} diff --git a/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c b/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c new file mode 100644 index 000000000..05e8dd144 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-fstrict-overflow -O2" } */ +/* { dg-message "warnings being treated as errors" "" {target "*-*-*"} 0 } */ +#pragma GCC diagnostic error "-Wstrict-overflow" + +int +foo (int i) +{ + return __builtin_abs (i) >= 0; /* { dg-error "assuming signed overflow does not occur" "correct warning" } */ +} diff --git a/gcc/testsuite/gcc.dg/builtin-apply2.c b/gcc/testsuite/gcc.dg/builtin-apply2.c index 7061b1041..9b731470e 100644 --- a/gcc/testsuite/gcc.dg/builtin-apply2.c +++ b/gcc/testsuite/gcc.dg/builtin-apply2.c @@ -17,6 +17,9 @@ E, F and G are passed on stack. So the size of the stack argument data is 20. */ #define STACK_ARGUMENTS_SIZE 20 +#elif defined __MMIX__ +/* No parameters on stack for bar. */ +#define STACK_ARGUMENTS_SIZE 0 #else #define STACK_ARGUMENTS_SIZE 64 #endif diff --git a/gcc/testsuite/gcc.dg/guality/pr54796.c b/gcc/testsuite/gcc.dg/guality/pr54796.c new file mode 100644 index 000000000..f58e5a02c --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/pr54796.c @@ -0,0 +1,25 @@ +/* PR debug/54796 */ +/* { dg-do run } */ +/* { dg-options "-g" } */ + +__attribute__((noinline, noclone)) void +bar (char *a, int b) +{ + __asm volatile ("" : "+r" (a), "+r" (b) : : "memory"); +} + +__attribute__((noinline, noclone)) void +foo (int a, int b) +{ + int c = a; + char d[b]; /* { dg-final { gdb-test 17 "a" "5" } } */ + bar (d, 2); /* { dg-final { gdb-test 17 "b" "6" } } */ + bar (d, 4); /* { dg-final { gdb-test 17 "c" "5" } } */ +} + +int +main () +{ + foo (5, 6); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr54920.c b/gcc/testsuite/gcc.dg/torture/pr54920.c new file mode 100644 index 000000000..d1622f765 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr54920.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ + +typedef short __v8hi __attribute__ ((__vector_size__ (16))); +typedef long long __m128i __attribute__ ((__vector_size__ (16))); +int a; +__m128i b; + +void +fn1 () +{ + while (1) + b = (__m128i) (__v8hi) { a, 0, 0, 0, 0, 0 }; +} diff --git a/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c b/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c index 6ba587188..cbb38efc8 100644 --- a/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c +++ b/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c @@ -16,6 +16,9 @@ E, F and G are passed on stack. So the size of the stack argument data is 20. */ #define STACK_ARGUMENTS_SIZE 20 +#elif defined __MMIX__ +/* No parameters on stack for bar. */ +#define STACK_ARGUMENTS_SIZE 0 #else #define STACK_ARGUMENTS_SIZE 64 #endif diff --git a/gcc/testsuite/gcc.dg/tree-prof/switch-case-1.c b/gcc/testsuite/gcc.dg/tree-prof/switch-case-1.c new file mode 100644 index 000000000..50ee9e44f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/switch-case-1.c @@ -0,0 +1,40 @@ +/* { dg-options "-O2 -fdump-rtl-expand-all" } */ +int g; + +__attribute__((noinline)) void foo (int n) +{ + switch (n) + { + case 1: + g++; break; + case 2: + g += 2; break; + case 3: + g += 1; break; + case 4: + g += 3; break; + case 5: + g += 4; break; + case 6: + g += 5; break; + case 7: + g += 6; break; + case 8: + g += 7; break; + case 9: + g += 8; break; + default: + g += 8; break; + } +} + +int main () +{ + int i; + for (i = 0; i < 10000; i++) + foo ((i * i) % 5); + return 0; +} +/* { dg-final-use { scan-rtl-dump-times ";; basic block\[^\\n\]*count 4000" 2 "expand"} } */ +/* { dg-final-use { scan-rtl-dump-times ";; basic block\[^\\n\]*count 2000" 1 "expand"} } */ +/* { dg-final-use { cleanup-rtl-dump "expand" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-prof/switch-case-2.c b/gcc/testsuite/gcc.dg/tree-prof/switch-case-2.c new file mode 100644 index 000000000..07d4363d3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/switch-case-2.c @@ -0,0 +1,40 @@ +/* { dg-options "-O2 -fdump-rtl-expand-all" } */ +int g; + +__attribute__((noinline)) void foo (int n) +{ + switch (n) + { + case 99: + g += 2; break; + case 1: + g++; break; + case 100: + g += 1; break; + case 4: + g += 3; break; + case 5: + g += 4; break; + case 6: + g += 5; break; + case 7: + g += 6; break; + case 8: + g += 7; break; + case 9: + g += 8; break; + default: + g += 8; break; + } +} + +int main () +{ + int i; + for (i = 0; i < 10000; i++) + foo ((i * i) % 5); + return 0; +} +/* { dg-final-use { scan-rtl-dump-times ";; basic block\[^\\n\]*count 4000" 2 "expand"} } */ +/* { dg-final-use { scan-rtl-dump-times ";; basic block\[^\\n\]*count 2000" 1 "expand"} } */ +/* { dg-final-use { cleanup-rtl-dump "expand" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c index fe40bed58..5c280b3f0 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-loop-distribution -ftree-loop-distribute-patterns -fdump-tree-ldist-details" } */ +/* { dg-options "-O2 -ftree-loop-distribution -ftree-loop-distribute-patterns -fdump-tree-ldist-details -fdisable-tree-cunroll -fdisable-tree-cunrolli" } */ typedef int mad_fixed_t; struct mad_pcm diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr54915.c b/gcc/testsuite/gcc.dg/tree-ssa/pr54915.c new file mode 100644 index 000000000..1e11df198 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr54915.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef double v2df __attribute__ ((__vector_size__ (16))); +typedef double v4df __attribute__ ((__vector_size__ (32))); + +void f (v2df *ret, v4df* xp) +{ + v4df x = *xp; + v2df xx = { x[2], x[3] }; + *ret = xx; +} diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv8a-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv8a-arm.c new file mode 100644 index 000000000..1fab3c8a4 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/ftest-armv8a-arm.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ +/* { dg-require-effective-target arm_nothumb } */ +/* { dg-require-effective-target arm_arch_v8a_multilib } */ +/* { dg-options "-marm" } */ +/* { dg-add-options arm_arch_v8a } */ + +#include "ftest-support-arm.h" + +int +main (void) +{ + return ftest (ARCH_V8A); +} + diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv8a-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv8a-thumb.c new file mode 100644 index 000000000..c57f4cec2 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/ftest-armv8a-thumb.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ +/* { dg-require-effective-target arm_eabi } */ +/* { dg-require-effective-target arm_arch_v8a_multilib } */ +/* { dg-options "-mthumb" } */ +/* { dg-add-options arm_arch_v8a } */ + +#include "ftest-support-thumb.h" + +int +main (void) +{ + return ftest (ARCH_V8A); +} + diff --git a/gcc/testsuite/gcc.target/arm/ftest-support-arm.h b/gcc/testsuite/gcc.target/arm/ftest-support-arm.h index 512d50e83..259207432 100644 --- a/gcc/testsuite/gcc.target/arm/ftest-support-arm.h +++ b/gcc/testsuite/gcc.target/arm/ftest-support-arm.h @@ -26,4 +26,5 @@ int feature_matrix[ARCH_COUNT][NUM_FEATURES] = {7, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7A. */ {7, 1, 2, 'R', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7R. */ {7, 0, 2, 'M', 1, 7, 1, 0, 0, 1, 1}, /* ARCH_V7M. */ - {7, 0, 2, 'M', 1, 7, 1, 1, 0, 1, 1}}; /* ARCH_V7EM. */ + {7, 0, 2, 'M', 1, 7, 1, 1, 0, 1, 1}, /* ARCH_V7EM. */ + {8, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}}; /* ARCH_V8A. */ diff --git a/gcc/testsuite/gcc.target/arm/ftest-support-thumb.h b/gcc/testsuite/gcc.target/arm/ftest-support-thumb.h index 99918310e..a58799968 100644 --- a/gcc/testsuite/gcc.target/arm/ftest-support-thumb.h +++ b/gcc/testsuite/gcc.target/arm/ftest-support-thumb.h @@ -26,4 +26,5 @@ int feature_matrix[ARCH_COUNT][NUM_FEATURES] = {7, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7A. */ {7, 1, 2, 'R', 1, 15, 1, 1, 1, 1, 1}, /* ARCH_V7R. */ {7, 0, 2, 'M', 1, 7, 1, 0, 0, 1, 1}, /* ARCH_V7M. */ - {7, 0, 2, 'M', 1, 7, 1, 1, 1, 1, 1}}; /* ARCH_V7EM. */ + {7, 0, 2, 'M', 1, 7, 1, 1, 1, 1, 1}, /* ARCH_V7EM. */ + {8, 1, 2, 'A', 1, 15, 1, 1, 1, 1, 1}}; /* ARCH_V8A. */ diff --git a/gcc/testsuite/gcc.target/arm/ftest-support.h b/gcc/testsuite/gcc.target/arm/ftest-support.h index c5f98105b..5983760ee 100644 --- a/gcc/testsuite/gcc.target/arm/ftest-support.h +++ b/gcc/testsuite/gcc.target/arm/ftest-support.h @@ -22,6 +22,7 @@ enum architecture { ARCH_V7R, ARCH_V7M, ARCH_V7EM, + ARCH_V8A, ARCH_COUNT }; diff --git a/gcc/testsuite/gcc.target/arm/neon/vfmaQf32.c b/gcc/testsuite/gcc.target/arm/neon/vfmaQf32.c new file mode 100644 index 000000000..d400163a1 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon/vfmaQf32.c @@ -0,0 +1,22 @@ +/* Test the `vfmaQf32' ARM Neon intrinsic. */ +/* This file was autogenerated by neon-testgen. */ + +/* { dg-do assemble } */ +/* { dg-require-effective-target arm_neonv2_ok } */ +/* { dg-options "-save-temps -O0" } */ +/* { dg-add-options arm_neonv2 } */ + +#include "arm_neon.h" + +void test_vfmaQf32 (void) +{ + float32x4_t out_float32x4_t; + float32x4_t arg0_float32x4_t; + float32x4_t arg1_float32x4_t; + float32x4_t arg2_float32x4_t; + + out_float32x4_t = vfmaq_f32 (arg0_float32x4_t, arg1_float32x4_t, arg2_float32x4_t); +} + +/* { dg-final { scan-assembler "vfma\.f32\[ \]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vfmaf32.c b/gcc/testsuite/gcc.target/arm/neon/vfmaf32.c new file mode 100644 index 000000000..988328dd0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon/vfmaf32.c @@ -0,0 +1,22 @@ +/* Test the `vfmaf32' ARM Neon intrinsic. */ +/* This file was autogenerated by neon-testgen. */ + +/* { dg-do assemble } */ +/* { dg-require-effective-target arm_neonv2_ok } */ +/* { dg-options "-save-temps -O0" } */ +/* { dg-add-options arm_neonv2 } */ + +#include "arm_neon.h" + +void test_vfmaf32 (void) +{ + float32x2_t out_float32x2_t; + float32x2_t arg0_float32x2_t; + float32x2_t arg1_float32x2_t; + float32x2_t arg2_float32x2_t; + + out_float32x2_t = vfma_f32 (arg0_float32x2_t, arg1_float32x2_t, arg2_float32x2_t); +} + +/* { dg-final { scan-assembler "vfma\.f32\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vfmsQf32.c b/gcc/testsuite/gcc.target/arm/neon/vfmsQf32.c new file mode 100644 index 000000000..247a8edfd --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon/vfmsQf32.c @@ -0,0 +1,22 @@ +/* Test the `vfmsQf32' ARM Neon intrinsic. */ +/* This file was autogenerated by neon-testgen. */ + +/* { dg-do assemble } */ +/* { dg-require-effective-target arm_neonv2_ok } */ +/* { dg-options "-save-temps -O0" } */ +/* { dg-add-options arm_neonv2 } */ + +#include "arm_neon.h" + +void test_vfmsQf32 (void) +{ + float32x4_t out_float32x4_t; + float32x4_t arg0_float32x4_t; + float32x4_t arg1_float32x4_t; + float32x4_t arg2_float32x4_t; + + out_float32x4_t = vfmsq_f32 (arg0_float32x4_t, arg1_float32x4_t, arg2_float32x4_t); +} + +/* { dg-final { scan-assembler "vfms\.f32\[ \]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vfmsf32.c b/gcc/testsuite/gcc.target/arm/neon/vfmsf32.c new file mode 100644 index 000000000..7f9e8570d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon/vfmsf32.c @@ -0,0 +1,22 @@ +/* Test the `vfmsf32' ARM Neon intrinsic. */ +/* This file was autogenerated by neon-testgen. */ + +/* { dg-do assemble } */ +/* { dg-require-effective-target arm_neonv2_ok } */ +/* { dg-options "-save-temps -O0" } */ +/* { dg-add-options arm_neonv2 } */ + +#include "arm_neon.h" + +void test_vfmsf32 (void) +{ + float32x2_t out_float32x2_t; + float32x2_t arg0_float32x2_t; + float32x2_t arg1_float32x2_t; + float32x2_t arg2_float32x2_t; + + out_float32x2_t = vfms_f32 (arg0_float32x2_t, arg1_float32x2_t, arg2_float32x2_t); +} + +/* { dg-final { scan-assembler "vfms\.f32\[ \]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/synchronize.c b/gcc/testsuite/gcc.target/arm/synchronize.c index 8626d8ee0..7ef10e2d9 100644 --- a/gcc/testsuite/gcc.target/arm/synchronize.c +++ b/gcc/testsuite/gcc.target/arm/synchronize.c @@ -1,4 +1,4 @@ -/* { dg-final { scan-assembler "__sync_synchronize|dmb|mcr" { target arm*-*-linux-*eabi } } } */ +/* { dg-final { scan-assembler "__sync_synchronize|dmb|mcr" { target arm*-*-linux-* } } } */ void *foo (void) { diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c index c2511c643..e7eef6d7a 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c @@ -14,6 +14,6 @@ avx_test (void) c[i] = a[i] * b[i+3]; } -/* { dg-final { scan-assembler-not "avx_movups256/1" } } */ -/* { dg-final { scan-assembler "sse_movups/1" } } */ +/* { dg-final { scan-assembler-not "avx_loadups256" } } */ +/* { dg-final { scan-assembler "sse_loadups" } } */ /* { dg-final { scan-assembler "vinsertf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c index 9d7167304..3f4fbf764 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c @@ -24,6 +24,6 @@ avx_test (void) } } -/* { dg-final { scan-assembler-not "avx_movdqu256/1" } } */ -/* { dg-final { scan-assembler "sse2_movdqu/1" } } */ +/* { dg-final { scan-assembler-not "avx_loaddqu256" } } */ +/* { dg-final { scan-assembler "sse2_loaddqu" } } */ /* { dg-final { scan-assembler "vinsert.128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c index efb5f573f..b0e0e79bd 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c @@ -14,6 +14,6 @@ avx_test (void) c[i] = a[i] * b[i+3]; } -/* { dg-final { scan-assembler-not "avx_movupd256/1" } } */ -/* { dg-final { scan-assembler "sse2_movupd/1" } } */ +/* { dg-final { scan-assembler-not "avx_loadupd256" } } */ +/* { dg-final { scan-assembler "sse2_loadupd" } } */ /* { dg-final { scan-assembler "vinsertf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c index e527b3816..e0eb92b57 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c @@ -14,6 +14,6 @@ avx_test (void) b[i] = a[i+3] * 2; } -/* { dg-final { scan-assembler "avx_movups256/1" } } */ -/* { dg-final { scan-assembler-not "avx_movups/1" } } */ +/* { dg-final { scan-assembler "avx_loadups256" } } */ +/* { dg-final { scan-assembler-not "sse_loadups" } } */ /* { dg-final { scan-assembler-not "vinsertf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c index 0b5839669..1a53ba14a 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c @@ -17,6 +17,6 @@ avx_test (void) d[i] = c[i] * 20.0; } -/* { dg-final { scan-assembler-not "avx_movups256/2" } } */ +/* { dg-final { scan-assembler-not "avx_storeups256" } } */ /* { dg-final { scan-assembler "vmovups.*\\*movv4sf_internal/3" } } */ /* { dg-final { scan-assembler "vextractf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c index eac460fef..e98d1b684 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c @@ -24,6 +24,6 @@ avx_test (void) } } -/* { dg-final { scan-assembler-not "avx_movdqu256/2" } } */ +/* { dg-final { scan-assembler-not "avx_storedqu256" } } */ /* { dg-final { scan-assembler "vmovdqu.*\\*movv16qi_internal/3" } } */ /* { dg-final { scan-assembler "vextract.128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c index 753625892..26c993be7 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c @@ -17,6 +17,6 @@ avx_test (void) d[i] = c[i] * 20.0; } -/* { dg-final { scan-assembler-not "avx_movupd256/2" } } */ +/* { dg-final { scan-assembler-not "avx_storeupd256" } } */ /* { dg-final { scan-assembler "vmovupd.*\\*movv2df_internal/3" } } */ /* { dg-final { scan-assembler "vextractf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c index 39b6f3bef..6d734faa2 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c @@ -14,7 +14,7 @@ avx_test (void) b[i+3] = a[i] * c[i]; } -/* { dg-final { scan-assembler "avx_movups256/2" } } */ -/* { dg-final { scan-assembler-not "avx_movups/2" } } */ +/* { dg-final { scan-assembler "avx_storeups256" } } */ +/* { dg-final { scan-assembler-not "sse_storeups" } } */ /* { dg-final { scan-assembler-not "\\*avx_movv4sf_internal/3" } } */ /* { dg-final { scan-assembler-not "vextractf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_double_1.c b/gcc/testsuite/gcc.target/i386/l_fma_double_1.c index 87225ba3e..716acfef6 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_double_1.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_double_1.c @@ -16,11 +16,11 @@ /* { dg-final { scan-assembler-times "vfnmadd231pd" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub132pd" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub231pd" 4 } } */ -/* { dg-final { scan-assembler-times "vfmadd132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd213sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub213sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd213sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub213sd" 8 } } */ +/* { dg-final { scan-assembler-times "vfmadd132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfmadd213sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfmsub132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfmsub213sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmadd213sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmsub213sd" 20 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_double_2.c b/gcc/testsuite/gcc.target/i386/l_fma_double_2.c index 8b00fe1ef..01173afb2 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_double_2.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_double_2.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132pd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132sd" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfmsub132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132sd" 40 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_double_3.c b/gcc/testsuite/gcc.target/i386/l_fma_double_3.c index 37d062c3a..8cda521a8 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_double_3.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_double_3.c @@ -16,11 +16,11 @@ /* { dg-final { scan-assembler-times "vfnmadd231pd" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub132pd" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub231pd" 4 } } */ -/* { dg-final { scan-assembler-times "vfmadd132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd213sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub213sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd213sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132sd" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub213sd" 8 } } */ +/* { dg-final { scan-assembler-times "vfmadd132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfmadd213sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfmsub132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfmsub213sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmadd213sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132sd" 20 } } */ +/* { dg-final { scan-assembler-times "vfnmsub213sd" 20 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_double_4.c b/gcc/testsuite/gcc.target/i386/l_fma_double_4.c index 7311913e8..9f2331b51 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_double_4.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_double_4.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132pd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132sd" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfmsub132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132sd" 40 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_double_5.c b/gcc/testsuite/gcc.target/i386/l_fma_double_5.c index a7a337be1..9e33975b1 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_double_5.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_double_5.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132pd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132sd" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfmsub132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132sd" 40 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_double_6.c b/gcc/testsuite/gcc.target/i386/l_fma_double_6.c index fcb596c55..28d264dd2 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_double_6.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_double_6.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132pd" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132pd" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132sd" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132sd" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfmsub132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132sd" 40 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132sd" 40 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_float_1.c b/gcc/testsuite/gcc.target/i386/l_fma_float_1.c index b85971ddb..fea0b2061 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_float_1.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_float_1.c @@ -16,11 +16,11 @@ /* { dg-final { scan-assembler-times "vfnmadd231ps" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub132ps" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub231ps" 4 } } */ -/* { dg-final { scan-assembler-times "vfmadd132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd213ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub213ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd213ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub213ss" 8 } } */ +/* { dg-final { scan-assembler-times "vfmadd132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfmadd213ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfmsub132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfmsub213ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmadd213ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmsub213ss" 36 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_float_2.c b/gcc/testsuite/gcc.target/i386/l_fma_float_2.c index 9cd02495b..dd5f543f5 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_float_2.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_float_2.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132ps" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132ss" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfmsub132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132ss" 72 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_float_3.c b/gcc/testsuite/gcc.target/i386/l_fma_float_3.c index 8388cfe03..38853353b 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_float_3.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_float_3.c @@ -16,11 +16,11 @@ /* { dg-final { scan-assembler-times "vfnmadd231ps" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub132ps" 4 } } */ /* { dg-final { scan-assembler-times "vfnmsub231ps" 4 } } */ -/* { dg-final { scan-assembler-times "vfmadd132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd213ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfmsub213ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmadd213ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132ss" 8 } } */ -/* { dg-final { scan-assembler-times "vfnmsub213ss" 8 } } */ +/* { dg-final { scan-assembler-times "vfmadd132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfmadd213ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfmsub132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfmsub213ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmadd213ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132ss" 36 } } */ +/* { dg-final { scan-assembler-times "vfnmsub213ss" 36 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_float_4.c b/gcc/testsuite/gcc.target/i386/l_fma_float_4.c index bb8df6989..5a7bb2178 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_float_4.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_float_4.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132ps" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132ss" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfmsub132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132ss" 72 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_float_5.c b/gcc/testsuite/gcc.target/i386/l_fma_float_5.c index 3adf99f57..0b0454ed3 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_float_5.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_float_5.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132ps" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132ss" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfmsub132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132ss" 72 } } */ diff --git a/gcc/testsuite/gcc.target/i386/l_fma_float_6.c b/gcc/testsuite/gcc.target/i386/l_fma_float_6.c index ddf05e200..03bf8e848 100644 --- a/gcc/testsuite/gcc.target/i386/l_fma_float_6.c +++ b/gcc/testsuite/gcc.target/i386/l_fma_float_6.c @@ -12,7 +12,7 @@ /* { dg-final { scan-assembler-times "vfmsub132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmadd132ps" 8 } } */ /* { dg-final { scan-assembler-times "vfnmsub132ps" 8 } } */ -/* { dg-final { scan-assembler-times "vfmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfmsub132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmadd132ss" 16 } } */ -/* { dg-final { scan-assembler-times "vfnmsub132ss" 16 } } */ +/* { dg-final { scan-assembler-times "vfmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfmsub132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmadd132ss" 72 } } */ +/* { dg-final { scan-assembler-times "vfnmsub132ss" 72 } } */ diff --git a/gcc/testsuite/gcc.target/sh/pr51244-17.c b/gcc/testsuite/gcc.target/sh/pr51244-17.c new file mode 100644 index 000000000..e7d1ddd2a --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/pr51244-17.c @@ -0,0 +1,297 @@ +/* Check that no unnecessary zero extensions are done on values that are + results of arithmetic with T bit inputs. */ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-options "-O1" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-m5*" } { "" } } */ +/* { dg-final { scan-assembler-not "extu|exts" } } */ + +int +test00 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x == y; +} + +int +test01 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == d; + return x == y; +} + +int +test02 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c == d; + return x == y; +} + +int +test03 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != d; + return x == y; +} + +int +test04 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != d; + return x == y; +} + +int +test05 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x != y; +} + +int +test06 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x ^ y; +} + +int +test07 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x | y; +} + +int +test08 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x & y; +} + +int +test09 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == d; + return x != y; +} + +int +test10 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c == d; + return x != y; +} + +int +test11 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != d; + return x != y; +} + +int +test12 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != d; + return x != y; +} + +int +test13 (int a, int b, int c, int d, int e, int f) +{ + int x = a == b; + int y = c == 0; + int z = d == e; + return x == y || x == z; +} + +int +test14 (int a, int b, int c, int d, int e, int f) +{ + int x = a == b; + int y = c == 0; + int z = d == e; + return x == y && x == z; +} + +int +test15 (int a, int b, int c, int d, int e, int f) +{ + int x = a != b; + int y = c == 0; + int z = d == e; + return x == y || x == z; +} + +int +test16 (int a, int b, int c, int d, int e, int f) +{ + int x = a != b; + int y = c == 0; + int z = d == e; + return x == y && x == z; +} + +int +test17 (int a, int b, int c, int d, int e, int f) +{ + int x = a != b; + int y = c != 0; + int z = d == e; + return x == y || x == z; +} + +int +test18 (int a, int b, int c, int d, int e, int f) +{ + int x = a != b; + int y = c != 0; + int z = d == e; + return x == y && x == z; +} + +int +test19 (int a, int b, int c, int d, int e, int f) +{ + int x = a != b; + int y = c != 0; + int z = d == e; + return x == y || x == z; +} + +int +test20 (int a, int b, int c, int d, int e, int f) +{ + int x = a != b; + int y = c != 0; + int z = d != e; + return x == y && x == z; +} + +int +test21 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x + y; +} + +int +test22 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c == 0; + return x + y; +} + +int +test23 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != 0; + return x + y; +} + +int +test24 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x - y; +} + +int +test25 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c == 0; + return x - y; +} + +int +test26 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != 0; + return x - y; +} + +int +test27 (int a, int b, int c, int d) +{ + int x = a == b; + int y = c == 0; + return x * y; +} + +int +test28 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c == 0; + return x * y; +} + +int +test29 (int a, int b, int c, int d) +{ + int x = a != b; + int y = c != 0; + return x * y; +} + +int +test30 (int a, int b) +{ + return ((a & 0x7F) == 1) + | ((a & 0xFF00) == 0x0200) + | ((a & 0xFF0000) == 0x030000); +} + +int +test31 (int a, int b) +{ + return ((a & 0x7F) == 1) + | ((a & 0xFF00) == 0x0200) + | ((a & 0xFF0000) == 0x030000) + | ((a & 0xFF000000) == 0x04000000); +} + +int +test32 (int* a, int b, int c, volatile char* d) +{ + d[1] = a[0] != 0; + return b; +} + +int +test33 (int* a, int b, int c, volatile char* d) +{ + d[1] = a[0] == 0; + return b; +} + +char +test34 (int a, int* b) +{ + return (b[4] & b[0] & a) == a; +} + +unsigned char +test35 (int a, int* b) +{ + return (b[4] & b[0] & a) == a; +} diff --git a/gcc/testsuite/gcc.target/sh/pr54760-2.c b/gcc/testsuite/gcc.target/sh/pr54760-2.c index b8a501847..91f3648a5 100644 --- a/gcc/testsuite/gcc.target/sh/pr54760-2.c +++ b/gcc/testsuite/gcc.target/sh/pr54760-2.c @@ -9,107 +9,129 @@ /* --------------------------------------------------------------------------- Simple GBR load. */ -#define func(name, type, disp)\ - int \ +#define func(name, rettype, type, disp)\ + rettype \ name ## _tp_load (void) \ { \ type* tp = (type*)__builtin_thread_pointer (); \ return tp[disp]; \ } -func (test00, int, 0) -func (test01, int, 5) -func (test02, int, 255) +func (test00, int, int, 0) +func (test01, int, int, 5) +func (test02, int, int, 255) -func (test03, short, 0) -func (test04, short, 5) -func (test05, short, 255) +func (test03, int, short, 0) +func (test04, int, short, 5) +func (test05, int, short, 255) -func (test06, char, 0) -func (test07, char, 5) -func (test08, char, 255) +func (test06, int, char, 0) +func (test07, int, char, 5) +func (test08, int, char, 255) -func (test09, unsigned int, 0) -func (test10, unsigned int, 5) -func (test11, unsigned int, 255) +func (test09, int, unsigned int, 0) +func (test10, int, unsigned int, 5) +func (test11, int, unsigned int, 255) -func (test12, unsigned short, 0) -func (test13, unsigned short, 5) -func (test14, unsigned short, 255) +func (test12, int, unsigned short, 0) +func (test13, int, unsigned short, 5) +func (test14, int, unsigned short, 255) -func (test15, unsigned char, 0) -func (test16, unsigned char, 5) -func (test17, unsigned char, 255) +func (test15, int, unsigned char, 0) +func (test16, int, unsigned char, 5) +func (test17, int, unsigned char, 255) + +func (test18, long long, long long, 0) +func (test19, long long, long long, 5) +func (test20, long long, long long, 127) + +func (test21, long long, unsigned long long, 0) +func (test22, long long, unsigned long long, 5) +func (test23, long long, unsigned long long, 127) #undef func /* --------------------------------------------------------------------------- Simple GBR store. */ -#define func(name, type, disp)\ +#define func(name, argtype, type, disp)\ void \ - name ## _tp_store (int a) \ + name ## _tp_store (argtype a) \ { \ type* tp = (type*)__builtin_thread_pointer (); \ tp[disp] = (type)a; \ } -func (test00, int, 0) -func (test01, int, 5) -func (test02, int, 255) +func (test00, int, int, 0) +func (test01, int, int, 5) +func (test02, int, int, 255) + +func (test03, int, short, 0) +func (test04, int, short, 5) +func (test05, int, short, 255) + +func (test06, int, char, 0) +func (test07, int, char, 5) +func (test08, int, char, 255) -func (test03, short, 0) -func (test04, short, 5) -func (test05, short, 255) +func (test09, int, unsigned int, 0) +func (test10, int, unsigned int, 5) +func (test11, int, unsigned int, 255) -func (test06, char, 0) -func (test07, char, 5) -func (test08, char, 255) +func (test12, int, unsigned short, 0) +func (test13, int, unsigned short, 5) +func (test14, int, unsigned short, 255) -func (test09, unsigned int, 0) -func (test10, unsigned int, 5) -func (test11, unsigned int, 255) +func (test15, int, unsigned char, 0) +func (test16, int, unsigned char, 5) +func (test17, int, unsigned char, 255) -func (test12, unsigned short, 0) -func (test13, unsigned short, 5) -func (test14, unsigned short, 255) +func (test18, long long, long long, 0) +func (test19, long long, long long, 5) +func (test20, long long, long long, 127) -func (test15, unsigned char, 0) -func (test16, unsigned char, 5) -func (test17, unsigned char, 255) +func (test21, long long, unsigned long long, 0) +func (test22, long long, unsigned long long, 5) +func (test23, long long, unsigned long long, 127) #undef func /* --------------------------------------------------------------------------- Arithmetic on the result of a GBR load. */ -#define func(name, type, disp, op, opname)\ - int \ - name ## _tp_load_arith_ ##opname (int a) \ +#define func(name, retargtype, type, disp, op, opname)\ + retargtype \ + name ## _tp_load_arith_ ##opname (retargtype a) \ { \ type* tp = (type*)__builtin_thread_pointer (); \ return tp[disp] op a; \ } #define funcs(op, opname) \ - func (test00, int, 0, op, opname) \ - func (test01, int, 5, op, opname) \ - func (test02, int, 255, op, opname) \ - func (test03, short, 0, op, opname) \ - func (test04, short, 5, op, opname) \ - func (test05, short, 255, op, opname) \ - func (test06, char, 0, op, opname) \ - func (test07, char, 5, op, opname) \ - func (test08, char, 255, op, opname) \ - func (test09, unsigned int, 0, op, opname) \ - func (test10, unsigned int, 5, op, opname) \ - func (test11, unsigned int, 255, op, opname) \ - func (test12, unsigned short, 0, op, opname) \ - func (test13, unsigned short, 5, op, opname) \ - func (test14, unsigned short, 255, op, opname) \ - func (test15, unsigned char, 0, op, opname) \ - func (test16, unsigned char, 5, op, opname) \ - func (test17, unsigned char, 255, op, opname) \ + func (test00, int, int, 0, op, opname) \ + func (test01, int, int, 5, op, opname) \ + func (test02, int, int, 255, op, opname) \ + func (test03, int, short, 0, op, opname) \ + func (test04, int, short, 5, op, opname) \ + func (test05, int, short, 255, op, opname) \ + func (test06, int, char, 0, op, opname) \ + func (test07, int, char, 5, op, opname) \ + func (test08, int, char, 255, op, opname) \ + func (test09, int, unsigned int, 0, op, opname) \ + func (test10, int, unsigned int, 5, op, opname) \ + func (test11, int, unsigned int, 255, op, opname) \ + func (test12, int, unsigned short, 0, op, opname) \ + func (test13, int, unsigned short, 5, op, opname) \ + func (test14, int, unsigned short, 255, op, opname) \ + func (test15, int, unsigned char, 0, op, opname) \ + func (test16, int, unsigned char, 5, op, opname) \ + func (test17, int, unsigned char, 255, op, opname) \ + func (test18, long long, long long, 0, op, opname) \ + func (test19, long long, long long, 5, op, opname) \ + func (test20, long long, long long, 127, op, opname) \ + func (test21, long long, unsigned long long, 0, op, opname) \ + func (test22, long long, unsigned long long, 5, op, opname) \ + func (test23, long long, unsigned long long, 127, op, opname) \ funcs (+, plus) funcs (-, minus) @@ -124,8 +146,8 @@ funcs (^, xor) /* --------------------------------------------------------------------------- Arithmetic of the result of two GBR loads. */ -#define func(name, type, disp0, disp1, op, opname)\ - int \ +#define func(name, rettype, type, disp0, disp1, op, opname)\ + rettype \ name ## _tp_load_load_arith_ ##opname (void) \ { \ type* tp = (type*)__builtin_thread_pointer (); \ @@ -133,18 +155,22 @@ funcs (^, xor) } #define funcs(op, opname) \ - func (test00, int, 0, 5, op, opname) \ - func (test02, int, 1, 255, op, opname) \ - func (test03, short, 0, 5, op, opname) \ - func (test05, short, 1, 255, op, opname) \ - func (test06, char, 0, 5, op, opname) \ - func (test08, char, 1, 255, op, opname) \ - func (test09, unsigned int, 0, 5, op, opname) \ - func (test11, unsigned int, 1, 255, op, opname) \ - func (test12, unsigned short, 0, 5, op, opname) \ - func (test14, unsigned short, 1, 255, op, opname) \ - func (test15, unsigned char, 0, 5, op, opname) \ - func (test17, unsigned char, 1, 255, op, opname) \ + func (test00, int, int, 0, 5, op, opname) \ + func (test02, int, int, 1, 255, op, opname) \ + func (test03, int, short, 0, 5, op, opname) \ + func (test05, int, short, 1, 255, op, opname) \ + func (test06, int, char, 0, 5, op, opname) \ + func (test08, int, char, 1, 255, op, opname) \ + func (test09, int, unsigned int, 0, 5, op, opname) \ + func (test11, int, unsigned int, 1, 255, op, opname) \ + func (test12, int, unsigned short, 0, 5, op, opname) \ + func (test14, int, unsigned short, 1, 255, op, opname) \ + func (test15, int, unsigned char, 0, 5, op, opname) \ + func (test17, int, unsigned char, 1, 255, op, opname) \ + func (test18, long long, long long, 0, 5, op, opname) \ + func (test19, long long, long long, 1, 127, op, opname) \ + func (test20, long long, unsigned long long, 0, 5, op, opname) \ + func (test21, long long, unsigned long long, 1, 127, op, opname) \ funcs (+, plus) funcs (-, minus) @@ -180,6 +206,10 @@ func (test12, unsigned short, 0, 5) func (test14, unsigned short, 1, 255) func (test15, unsigned char, 0, 5) func (test17, unsigned char, 1, 255) +func (test18, long long, 0, 5) +func (test19, long long, 1, 127) +func (test20, unsigned long long, 0, 5) +func (test21, unsigned long long, 1, 127) #undef func @@ -187,33 +217,39 @@ func (test17, unsigned char, 1, 255) GBR load, arithmetic, GBR store */ -#define func(name, type, disp, op, opname)\ +#define func(name, argtype, type, disp, op, opname)\ void \ - name ## _tp_load_arith_store_ ##opname (int a) \ + name ## _tp_load_arith_store_ ##opname (argtype a) \ { \ type* tp = (type*)__builtin_thread_pointer (); \ tp[disp] op a; \ } #define funcs(op, opname) \ - func (test00, int, 0, op, opname) \ - func (test01, int, 5, op, opname) \ - func (test02, int, 255, op, opname) \ - func (test03, short, 0, op, opname) \ - func (test04, short, 5, op, opname) \ - func (test05, short, 255, op, opname) \ - func (test06, char, 0, op, opname) \ - func (test07, char, 5, op, opname) \ - func (test08, char, 255, op, opname) \ - func (test09, unsigned int, 0, op, opname) \ - func (test10, unsigned int, 5, op, opname) \ - func (test11, unsigned int, 255, op, opname) \ - func (test12, unsigned short, 0, op, opname) \ - func (test13, unsigned short, 5, op, opname) \ - func (test14, unsigned short, 255, op, opname) \ - func (test15, unsigned char, 0, op, opname) \ - func (test16, unsigned char, 5, op, opname) \ - func (test17, unsigned char, 255, op, opname) \ + func (test00, int, int, 0, op, opname) \ + func (test01, int, int, 5, op, opname) \ + func (test02, int, int, 255, op, opname) \ + func (test03, int, short, 0, op, opname) \ + func (test04, int, short, 5, op, opname) \ + func (test05, int, short, 255, op, opname) \ + func (test06, int, char, 0, op, opname) \ + func (test07, int, char, 5, op, opname) \ + func (test08, int, char, 255, op, opname) \ + func (test09, int, unsigned int, 0, op, opname) \ + func (test10, int, unsigned int, 5, op, opname) \ + func (test11, int, unsigned int, 255, op, opname) \ + func (test12, int, unsigned short, 0, op, opname) \ + func (test13, int, unsigned short, 5, op, opname) \ + func (test14, int, unsigned short, 255, op, opname) \ + func (test15, int, unsigned char, 0, op, opname) \ + func (test16, int, unsigned char, 5, op, opname) \ + func (test17, int, unsigned char, 255, op, opname) \ + func (test18, long long, long long, 0, op, opname) \ + func (test19, long long, long long, 5, op, opname) \ + func (test20, long long, long long, 127, op, opname) \ + func (test21, long long, unsigned long long, 0, op, opname) \ + func (test22, long long, unsigned long long, 5, op, opname) \ + func (test23, long long, unsigned long long, 127, op, opname) \ funcs (+=, plus) funcs (-=, minus) diff --git a/gcc/testsuite/gcc.target/sh/pr54760-4.c b/gcc/testsuite/gcc.target/sh/pr54760-4.c new file mode 100644 index 000000000..3ee36a313 --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/pr54760-4.c @@ -0,0 +1,19 @@ +/* Check that the GBR address optimization does not combine a gbr store + and its use when a function call is inbetween, when GBR is a call used + register, i.e. it is invalidated by function calls. */ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-options "-O1 -fcall-used-gbr" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } } */ +/* { dg-final { scan-assembler "stc\tgbr" } } */ + +extern int test00 (void); +int +test01 (int x) +{ + /* We must see a stc gbr,rn before the function call, because + a function call could modify the gbr. In this case the user requests + the old gbr value, before the function call. */ + int* p = (int*)__builtin_thread_pointer (); + p[5] = test00 (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/sh/torture/pr34777.c b/gcc/testsuite/gcc.target/sh/torture/pr34777.c new file mode 100644 index 000000000..b2ec56adf --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/torture/pr34777.c @@ -0,0 +1,30 @@ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-additional-options "-fschedule-insns -fPIC -mprefergot" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-m5*" } { "" } } */ + +static __inline __attribute__ ((__always_inline__)) void * +_dl_mmap (void * start, int length, int prot, int flags, int fd, + int offset) +{ + register long __sc3 __asm__ ("r3") = 90; + register long __sc4 __asm__ ("r4") = (long) start; + register long __sc5 __asm__ ("r5") = (long) length; + register long __sc6 __asm__ ("r6") = (long) prot; + register long __sc7 __asm__ ("r7") = (long) flags; + register long __sc0 __asm__ ("r0") = (long) fd; + register long __sc1 __asm__ ("r1") = (long) offset; + __asm__ __volatile__ ("trapa %1" + : "=z" (__sc0) + : "i" (0x10 + 6), "0" (__sc0), "r" (__sc4), + "r" (__sc5), "r" (__sc6), "r" (__sc7), + "r" (__sc3), "r" (__sc1) + : "memory" ); +} + +extern int _dl_pagesize; +void +_dl_dprintf(int fd, const char *fmt, ...) +{ + static char *buf; + buf = _dl_mmap ((void *) 0, _dl_pagesize, 0x1 | 0x2, 0x02 | 0x20, -1, 0); +} diff --git a/gcc/testsuite/gcc.target/sh/torture/sh-torture.exp b/gcc/testsuite/gcc.target/sh/torture/sh-torture.exp new file mode 100644 index 000000000..f025aa3ef --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/torture/sh-torture.exp @@ -0,0 +1,41 @@ +# Copyright (C) 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the `gcc-dg.exp' driver, looping over +# optimization options. + +# Exit immediately if this isn't a SH target. +if { ![istarget sh*-*-*] } then { + return +} + +# Load support procs. +load_lib gcc-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CFLAGS +if ![info exists DEFAULT_CFLAGS] then { + set DEFAULT_CFLAGS " -ansi -pedantic-errors" +} + +# Initialize `dg'. +dg-init + +# Main loop. +gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] $DEFAULT_CFLAGS + +# All done. +dg-finish diff --git a/gcc/testsuite/gfortran.dg/class_optional_1.f90 b/gcc/testsuite/gfortran.dg/class_optional_1.f90 new file mode 100644 index 000000000..2b408dbda --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_optional_1.f90 @@ -0,0 +1,175 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! PR fortran/50981 +! PR fortran/54618 +! + + implicit none + type t + integer, allocatable :: i + end type t + type, extends (t):: t2 + integer, allocatable :: j + end type t2 + + class(t), allocatable :: xa, xa2(:), xac[:], xa2c(:)[:] + class(t), pointer :: xp, xp2(:) + + xp => null() + xp2 => null() + + call suba(alloc=.false., prsnt=.false.) + call suba(xa, alloc=.false., prsnt=.true.) + if (.not. allocated (xa)) call abort () + if (.not. allocated (xa%i)) call abort () + if (xa%i /= 5) call abort () + xa%i = -3 + call suba(xa, alloc=.true., prsnt=.true.) + if (allocated (xa)) call abort () + + call suba2(alloc=.false., prsnt=.false.) + call suba2(xa2, alloc=.false., prsnt=.true.) + if (.not. allocated (xa2)) call abort () + if (size (xa2) /= 1) call abort () + if (.not. allocated (xa2(1)%i)) call abort () + if (xa2(1)%i /= 5) call abort () + xa2(1)%i = -3 + call suba2(xa2, alloc=.true., prsnt=.true.) + if (allocated (xa2)) call abort () + + call subp(alloc=.false., prsnt=.false.) + call subp(xp, alloc=.false., prsnt=.true.) + if (.not. associated (xp)) call abort () + if (.not. allocated (xp%i)) call abort () + if (xp%i /= 5) call abort () + xp%i = -3 + call subp(xp, alloc=.true., prsnt=.true.) + if (associated (xp)) call abort () + + call subp2(alloc=.false., prsnt=.false.) + call subp2(xp2, alloc=.false., prsnt=.true.) + if (.not. associated (xp2)) call abort () + if (size (xp2) /= 1) call abort () + if (.not. allocated (xp2(1)%i)) call abort () + if (xp2(1)%i /= 5) call abort () + xp2(1)%i = -3 + call subp2(xp2, alloc=.true., prsnt=.true.) + if (associated (xp2)) call abort () + + call subac(alloc=.false., prsnt=.false.) + call subac(xac, alloc=.false., prsnt=.true.) + if (.not. allocated (xac)) call abort () + if (.not. allocated (xac%i)) call abort () + if (xac%i /= 5) call abort () + xac%i = -3 + call subac(xac, alloc=.true., prsnt=.true.) + if (allocated (xac)) call abort () + + call suba2c(alloc=.false., prsnt=.false.) + call suba2c(xa2c, alloc=.false., prsnt=.true.) + if (.not. allocated (xa2c)) call abort () + if (size (xa2c) /= 1) call abort () + if (.not. allocated (xa2c(1)%i)) call abort () + if (xa2c(1)%i /= 5) call abort () + xa2c(1)%i = -3 + call suba2c(xa2c, alloc=.true., prsnt=.true.) + if (allocated (xa2c)) call abort () + +contains + subroutine suba2c(x, prsnt, alloc) + class(t), optional, allocatable :: x(:)[:] + logical prsnt, alloc + if (present (x) .neqv. prsnt) call abort () + if (prsnt) then + if (alloc .neqv. allocated(x)) call abort () + if (.not. allocated (x)) then + allocate (x(1)[*]) + x(1)%i = 5 + else + if (x(1)%i /= -3) call abort() + deallocate (x) + end if + end if + end subroutine suba2c + + subroutine subac(x, prsnt, alloc) + class(t), optional, allocatable :: x[:] + logical prsnt, alloc + if (present (x) .neqv. prsnt) call abort () + if (present (x)) then + if (alloc .neqv. allocated(x)) call abort () + if (.not. allocated (x)) then + allocate (x[*]) + x%i = 5 + else + if (x%i /= -3) call abort() + deallocate (x) + end if + end if + end subroutine subac + + subroutine suba2(x, prsnt, alloc) + class(t), optional, allocatable :: x(:) + logical prsnt, alloc + if (present (x) .neqv. prsnt) call abort () + if (prsnt) then + if (alloc .neqv. allocated(x)) call abort () + if (.not. allocated (x)) then + allocate (x(1)) + x(1)%i = 5 + else + if (x(1)%i /= -3) call abort() + deallocate (x) + end if + end if + end subroutine suba2 + + subroutine suba(x, prsnt, alloc) + class(t), optional, allocatable :: x + logical prsnt, alloc + if (present (x) .neqv. prsnt) call abort () + if (present (x)) then + if (alloc .neqv. allocated(x)) call abort () + if (.not. allocated (x)) then + allocate (x) + x%i = 5 + else + if (x%i /= -3) call abort() + deallocate (x) + end if + end if + end subroutine suba + + subroutine subp2(x, prsnt, alloc) + class(t), optional, pointer :: x(:) + logical prsnt, alloc + if (present (x) .neqv. prsnt) call abort () + if (present (x)) then + if (alloc .neqv. associated(x)) call abort () + if (.not. associated (x)) then + allocate (x(1)) + x(1)%i = 5 + else + if (x(1)%i /= -3) call abort() + deallocate (x) + end if + end if + end subroutine subp2 + + subroutine subp(x, prsnt, alloc) + class(t), optional, pointer :: x + logical prsnt, alloc + if (present (x) .neqv. prsnt) call abort () + if (present (x)) then + if (alloc .neqv. associated(x)) call abort () + if (.not. associated (x)) then + allocate (x) + x%i = 5 + else + if (x%i /= -3) call abort() + deallocate (x) + end if + end if + end subroutine subp +end diff --git a/gcc/testsuite/gfortran.dg/class_optional_2.f90 b/gcc/testsuite/gfortran.dg/class_optional_2.f90 new file mode 100644 index 000000000..90b1719c1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_optional_2.f90 @@ -0,0 +1,800 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! PR fortran/50981 +! PR fortran/54618 +! + + implicit none + type t + integer, allocatable :: i + end type t + type, extends (t):: t2 + integer, allocatable :: j + end type t2 + + call s1a1() + call s1a() + call s1ac1() + call s1ac() + call s2() + call s2p(psnt=.false.) + call s2caf() + call s2elem() + call s2elem_t() + call s2elem_t2() + call s2t() + call s2tp(psnt=.false.) + call s2t2() + call s2t2p(psnt=.false.) + + call a1a1() + call a1a() + call a1ac1() + call a1ac() + call a2() + call a2p(psnt=.false.) + call a2caf() + + call a3a1() + call a3a() + call a3ac1() + call a3ac() + call a4() + call a4p(psnt=.false.) + call a4caf() + + call ar1a1() + call ar1a() + call ar1ac1() + call ar1ac() + call ar() + call art() + call arp(psnt=.false.) + call artp(psnt=.false.) + +contains + + subroutine s1a1(z, z2, z3, z4, z5) + type(t), optional :: z, z4[*] + type(t), pointer, optional :: z2 + type(t), allocatable, optional :: z3, z5[:] + type(t), allocatable :: x + type(t), pointer :: y + y => null() + call s2(x) + call s2(y) + call s2(z) + call s2(z2) + call s2(z3) + call s2(z4) + call s2(z5) + call s2p(y,psnt=.true.) + call s2p(z2,psnt=.false.) + call s2elem(x) + call s2elem(y) + call s2elem(z) + call s2elem(z2) + call s2elem(z3) + call s2elem(z4) + call s2elem(z5) + call s2elem_t(x) + call s2elem_t(y) + call s2elem_t(z) +! call s2elem_t(z2) ! FIXME: Segfault +! call s2elem_t(z3) ! FIXME: Segfault +! call s2elem_t(z4) ! FIXME: Segfault +! call s2elem_t(z5) ! FIXME: Segfault + call s2caf(z4) + call s2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) + call s2t(x) + call s2t(y) + call s2t(z) +! call s2t(z2) ! FIXME: Segfault +! call s2t(z3) ! FIXME: Segfault +! call s2t(z4) ! FIXME: Segfault +! call s2t(z5) ! FIXME: Segfault + call s2tp(y,psnt=.true.) + call s2tp(z2,psnt=.false.) + end subroutine s1a1 + subroutine s1a(z, z2, z3, z4, z5) + type(t2), optional :: z, z4[*] + type(t2), optional, pointer :: z2 + type(t2), optional, allocatable :: z3, z5[:] + type(t2), allocatable :: x + type(t2), pointer :: y + y => null() + call s2(x) + call s2(y) + call s2(z) + call s2(z2) + call s2(z3) + call s2(z4) + call s2(z5) + call s2p(y,psnt=.true.) + call s2p(z2,psnt=.false.) + call s2elem(x) + call s2elem(y) + call s2elem(z) + call s2elem(z2) + call s2elem(z3) + call s2elem(z4) + call s2elem(z5) + call s2elem_t2(x) + call s2elem_t2(y) + call s2elem_t2(z) +! call s2elem_t2(z2) ! FIXME: Segfault +! call s2elem_t2(z3) ! FIXME: Segfault +! call s2elem_t2(z4) ! FIXME: Segfault +! call s2elem_t2(z5) ! FIXME: Segfault + call s2caf(z4) + call s2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) + call s2t2(x) + call s2t2(y) + call s2t2(z) +! call s2t2(z2) ! FIXME: Segfault +! call s2t2(z3) ! FIXME: Segfault + call s2t2(z4) +! call s2t2(z5) ! FIXME: Segfault + call s2t2p(y,psnt=.true.) + call s2t2p(z2,psnt=.false.) + end subroutine s1a + subroutine s1ac1(z, z2, z3, z4, z5) + class(t), optional :: z, z4[*] + class(t), optional, pointer :: z2 + class(t), optional, allocatable :: z3, z5[:] + class(t), allocatable :: x + class(t), pointer :: y + y => null() + call s2(x) + call s2(y) + call s2(z) + call s2(z2) + call s2(z3) + call s2(z4) + call s2(z5) + call s2p(y,psnt=.true.) + call s2p(z2,psnt=.false.) + call s2elem(x) + call s2elem(y) + call s2elem(z) + call s2elem(z2) + call s2elem(z3) + call s2elem(z4) + call s2elem(z5) + call s2elem_t(x) + call s2elem_t(y) +! call s2elem_t(z) ! FIXME: Segfault +! call s2elem_t(z2) ! FIXME: Segfault +! call s2elem_t(z3) ! FIXME: Segfault +! call s2elem_t(z4) ! FIXME: Segfault +! call s2elem_t(z5) ! FIXME: Segfault + call s2caf(z4) + call s2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) + call s2t(x) + call s2t(y) +! call s2t(z) ! FIXME: Segfault +! call s2t(z2) ! FIXME: Segfault +! call s2t(z3) ! FIXME: Segfault +! call s2t(z4) ! FIXME: Segfault +! call s2t(z5) ! FIXME: Segfault + call s2tp(y,psnt=.true.) + call s2tp(z2,psnt=.false.) + end subroutine s1ac1 + subroutine s1ac(z, z2, z3, z4, z5) + class(t2), optional :: z, z4[*] + class(t2), optional, pointer :: z2 + class(t2), optional, allocatable :: z3, z5[:] + class(t2), allocatable :: x + class(t2), pointer :: y + y => null() + call s2(x) + call s2(y) + call s2(z) + call s2(z2) + call s2(z3) + call s2(z4) + call s2(z5) + call s2p(y,psnt=.true.) + call s2p(z2,psnt=.false.) + call s2elem(x) + call s2elem(y) + call s2elem(z) + call s2elem(z2) + call s2elem(z3) + call s2elem(z4) + call s2elem(z5) + call s2elem_t2(x) +! call s2elem_t2(y) ! FIXME: Segfault +! call s2elem_t2(z) ! FIXME: Segfault +! call s2elem_t2(z2) ! FIXME: Segfault +! call s2elem_t2(z3) ! FIXME: Segfault +! call s2elem_t2(z4) ! FIXME: Segfault +! call s2elem_t2(z5) ! FIXME: Segfault + call s2caf(z4) + call s2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) + call s2t2(x) + call s2t2(y) +! call s2t2(z) ! FIXME: Segfault +! call s2t2(z2) ! FIXME: Segfault +! call s2t2(z3) ! FIXME: Segfault +! call s2t2(z4) ! FIXME: Segfault +! call s2t2(z5) ! FIXME: Segfault + call s2t2p(y,psnt=.true.) + call s2t2p(z2,psnt=.false.) + end subroutine s1ac + + subroutine s2(x) + class(t), intent(in), optional :: x + if (present (x)) call abort () + !print *, present(x) + end subroutine s2 + subroutine s2p(x,psnt) + class(t), intent(in), pointer, optional :: x + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine s2p + subroutine s2caf(x) + class(t), intent(in), optional :: x[*] + if (present (x)) call abort () + !print *, present(x) + end subroutine s2caf + subroutine s2t(x) + type(t), intent(in), optional :: x + if (present (x)) call abort () + !print *, present(x) + end subroutine s2t + subroutine s2t2(x) + type(t2), intent(in), optional :: x + if (present (x)) call abort () + !print *, present(x) + end subroutine s2t2 + subroutine s2tp(x, psnt) + type(t), pointer, intent(in), optional :: x + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine s2tp + subroutine s2t2p(x, psnt) + type(t2), pointer, intent(in), optional :: x + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine s2t2p + impure elemental subroutine s2elem(x) + class(t), intent(in), optional :: x + if (present (x)) call abort () + !print *, present(x) + end subroutine s2elem + impure elemental subroutine s2elem_t(x) + type(t), intent(in), optional :: x + if (present (x)) call abort () + !print *, present(x) + end subroutine s2elem_t + impure elemental subroutine s2elem_t2(x) + type(t2), intent(in), optional :: x + if (present (x)) call abort () + !print *, present(x) + end subroutine s2elem_t2 + + + subroutine a1a1(z, z2, z3, z4, z5) + type(t), optional :: z(:), z4(:)[*] + type(t), optional, pointer :: z2(:) + type(t), optional, allocatable :: z3(:), z5(:)[:] + type(t), allocatable :: x(:) + type(t), pointer :: y(:) + y => null() + call a2(x) + call a2(y) + call a2(z) + call a2(z2) + call a2(z3) + call a2(z4) + call a2(z5) + call a2p(y,psnt=.true.) + call a2p(z2,psnt=.false.) + call a2caf(z4) + call a2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Segfault +! call s2elem(y) ! FIXME: Segfault +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t(x) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(y) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(z) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(z2) ! FIXME: Segfault +! call s2elem_t(z3) ! FIXME: Segfault +! call s2elem_t(z4) ! FIXME: Segfault +! call s2elem_t(z5) ! FIXME: Segfault + end subroutine a1a1 + subroutine a1a(z, z2, z3, z4, z5) + type(t2), optional :: z(:), z4(:)[*] + type(t2), optional, pointer :: z2(:) + type(t2), optional, allocatable :: z3(:), z5(:)[:] + type(t2), allocatable :: x(:) + type(t2), pointer :: y(:) + y => null() + call a2(x) + call a2(y) + call a2(z) + call a2(z2) + call a2(z3) + call a2(z4) + call a2(z5) + call a2p(y,psnt=.true.) + call a2p(z2,psnt=.false.) + call a2caf(z4) + call a2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Segfault +! call s2elem(y) ! FIXME: Segfault +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t2(x) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t2(y) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t2(z) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t2(z2) ! FIXME: Segfault +! call s2elem_t2(z3) ! FIXME: Segfault +! call s2elem_t2(z4) ! FIXME: Segfault +! call s2elem_t2(z5) ! FIXME: Segfault + end subroutine a1a + subroutine a1ac1(z, z2, z3, z4, z5) + class(t), optional :: z(:), z4(:)[*] + class(t), optional, pointer :: z2(:) + class(t), optional, allocatable :: z3(:), z5(:)[:] + class(t), allocatable :: x(:) + class(t), pointer :: y(:) + y => null() + call a2(x) + call a2(y) + call a2(z) + call a2(z2) + call a2(z3) + call a2(z4) + call a2(z5) + call a2p(y,psnt=.true.) + call a2p(z2,psnt=.false.) + call a2caf(z4) + call a2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Segfault +! call s2elem(y) ! FIXME: Segfault +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t(x) ! FIXME: Segfault +! call s2elem_t(y) ! FIXME: Segfault +! call s2elem_t(z) ! FIXME: Segfault +! call s2elem_t(z2) ! FIXME: Segfault +! call s2elem_t(z3) ! FIXME: Segfault +! call s2elem_t(z4) ! FIXME: Segfault +! call s2elem_t(z5) ! FIXME: Segfault + end subroutine a1ac1 + subroutine a1ac(z, z2, z3, z4, z5) + class(t2), optional :: z(:), z4(:)[*] + class(t2), optional, pointer :: z2(:) + class(t2), optional, allocatable :: z3(:), z5(:)[:] + class(t2), allocatable :: x(:) + class(t2), pointer :: y(:) + y => null() + call a2(x) + call a2(y) + call a2(z) + call a2(z2) + call a2(z3) + call a2(z4) + call a2(z5) + call a2p(y,psnt=.true.) + call a2p(z2,psnt=.false.) + call a2caf(z4) + call a2caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Segfault +! call s2elem(y) ! FIXME: Segfault +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t2(x) ! FIXME: Segfault +! call s2elem_t2(y) ! FIXME: Segfault +! call s2elem_t2(z) ! FIXME: Segfault +! call s2elem_t2(z2) ! FIXME: Segfault +! call s2elem_t2(z3) ! FIXME: Segfault +! call s2elem_t2(z4) ! FIXME: Segfault +! call s2elem_t2(z5) ! FIXME: Segfault + end subroutine a1ac + + subroutine a2(x) + class(t), intent(in), optional :: x(:) + if (present (x)) call abort () + ! print *, present(x) + end subroutine a2 + subroutine a2p(x, psnt) + class(t), pointer, intent(in), optional :: x(:) + logical psnt + if (present (x).neqv. psnt) call abort () + ! print *, present(x) + end subroutine a2p + subroutine a2caf(x) + class(t), intent(in), optional :: x(:)[*] + if (present (x)) call abort () + ! print *, present(x) + end subroutine a2caf + + + subroutine a3a1(z, z2, z3, z4, z5) + type(t), optional :: z(4), z4(4)[*] + type(t), optional, pointer :: z2(:) + type(t), optional, allocatable :: z3(:), z5(:)[:] + type(t), allocatable :: x(:) + type(t), pointer :: y(:) + y => null() + call a4(x) + call a4(y) + call a4(z) + call a4(z2) + call a4(z3) + call a4(z4) + call a4(z5) + call a4p(y,psnt=.true.) + call a4p(z2,psnt=.false.) + call a4t(x) + call a4t(y) + call a4t(z) +! call a4t(z2) ! FIXME: Segfault +! call a4t(z3) ! FIXME: Segfault +! call a4t(z4) ! FIXME: Segfault +! call a4t(z5) ! FIXME: Segfault + call a4tp(y,psnt=.true.) + call a4tp(z2,psnt=.false.) + call a4caf(z4) + call a4caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Segfault +! call s2elem(y) ! FIXME: Segfault +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t(x) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(y) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(z) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(z2) ! FIXME: Segfault +! call s2elem_t(z3) ! FIXME: Segfault +! call s2elem_t(z4) ! FIXME: Segfault +! call s2elem_t(z5) ! FIXME: Segfault + end subroutine a3a1 + subroutine a3a(z, z2, z3) + type(t2), optional :: z(4) + type(t2), optional, pointer :: z2(:) + type(t2), optional, allocatable :: z3(:) + type(t2), allocatable :: x(:) + type(t2), pointer :: y(:) + y => null() + call a4(x) + call a4(y) + call a4(z) + call a4(z2) + call a4(z3) + call a4p(y,psnt=.true.) + call a4p(z2,psnt=.false.) + call a4t2(x) + call a4t2(y) + call a4t2(z) +! call a4t2(z2) ! FIXME: Segfault +! call a4t2(z3) ! FIXME: Segfault + call a4t2p(y,psnt=.true.) + call a4t2p(z2,psnt=.false.) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Segfault +! call s2elem(y) ! FIXME: Segfault +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t2(x) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t2(y) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t2(z) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t2(z2) ! FIXME: Segfault +! call s2elem_t2(z3) ! FIXME: Segfault +! call s2elem_t2(z4) ! FIXME: Segfault +! call s2elem_t2(z5) ! FIXME: Segfault + end subroutine a3a + subroutine a3ac1(z, z2, z3, z4, z5) + class(t), optional :: z(4), z4(4)[*] + class(t), optional, pointer :: z2(:) + class(t), optional, allocatable :: z3(:), z5(:)[:] + class(t), allocatable :: x(:) + class(t), pointer :: y(:) + y => null() + call a4(x) + call a4(y) + call a4(z) + call a4(z2) + call a4(z3) + call a4(z4) + call a4(z5) + call a4p(y,psnt=.true.) + call a4p(z2,psnt=.false.) +! call a4t(x) ! FIXME: Segfault +! call a4t(y) ! FIXME: Segfault +! call a4t(z) ! FIXME: Segfault +! call a4t(z2) ! FIXME: Segfault +! call a4t(z3) ! FIXME: Segfault +! call a4t(z4) ! FIXME: Segfault +! call a4t(z5) ! FIXME: Segfault +! call a4tp(y,psnt=.true.) ! FIXME: Segfault +! call a4tp(z2,psnt=.false.) ! FIXME: Segfault + call a4caf(z4) + call a4caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) +! call s2elem(x) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem(y) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem(z) ! FIXME: Segfault +! call s2elem(z2) ! FIXME: Segfault +! call s2elem(z3) ! FIXME: Segfault +! call s2elem(z4) ! FIXME: Segfault +! call s2elem(z5) ! FIXME: Segfault +! call s2elem_t(x) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(y) ! FIXME: Conditional jump or move depends on uninitialised value +! call s2elem_t(z) ! FIXME: Segfault +! call s2elem_t(z2) ! FIXME: Segfault +! call s2elem_t(z3) ! FIXME: Segfault +! call s2elem_t(z4) ! FIXME: Segfault +! call s2elem_t(z5) ! FIXME: Segfault + end subroutine a3ac1 + subroutine a3ac(z, z2, z3, z4, z5) + class(t2), optional :: z(4), z4(4)[*] + class(t2), optional, pointer :: z2(:) + class(t2), optional, allocatable :: z3(:), z5(:)[:] + class(t2), allocatable :: x(:) + class(t2), pointer :: y(:) + y => null() + call a4(x) + call a4(y) + call a4(z) + call a4(z2) + call a4(z3) + call a4(z4) + call a4(z5) + call a4p(y,psnt=.true.) + call a4p(z2,psnt=.false.) +! call a4t2(x) ! FIXME: Segfault +! call a4t2(y) ! FIXME: Segfault +! call a4t2(z) ! FIXME: Segfault +! call a4t2(z2) ! FIXME: Segfault +! call a4t2(z3) ! FIXME: Segfault +! call a4t2(z4) ! FIXME: Segfault +! call a4t2(z5) ! FIXME: Segfault +! call a4t2p(y,psnt=.true.) ! FIXME: Segfault +! call a4t2p(z2,psnt=.false.) ! FIXME: Segfault + call a4caf(z4) + call a4caf(z5) + call ar(x) + call ar(y) + call ar(z) + call ar(z2) + call ar(z3) + call ar(z4) + call ar(z5) + call arp(y,psnt=.true.) + call arp(z2,psnt=.false.) + end subroutine a3ac + + subroutine a4(x) + class(t), intent(in), optional :: x(4) + if (present (x)) call abort () + !print *, present(x) + end subroutine a4 + subroutine a4p(x, psnt) + class(t), pointer, intent(in), optional :: x(:) + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine a4p + subroutine a4caf(x) + class(t), intent(in), optional :: x(4)[*] + if (present (x)) call abort () + !print *, present(x) + end subroutine a4caf + subroutine a4t(x) + type(t), intent(in), optional :: x(4) + if (present (x)) call abort () + !print *, present(x) + end subroutine a4t + subroutine a4t2(x) + type(t2), intent(in), optional :: x(4) + if (present (x)) call abort () + !print *, present(x) + end subroutine a4t2 + subroutine a4tp(x, psnt) + type(t), pointer, intent(in), optional :: x(:) + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine a4tp + subroutine a4t2p(x, psnt) + type(t2), pointer, intent(in), optional :: x(:) + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine a4t2p + + + subroutine ar(x) + class(t), intent(in), optional :: x(..) + if (present (x)) call abort () + !print *, present(x) + end subroutine ar + + subroutine art(x) + type(t), intent(in), optional :: x(..) + if (present (x)) call abort () + !print *, present(x) + end subroutine art + + subroutine arp(x, psnt) + class(t), pointer, intent(in), optional :: x(..) + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine arp + + subroutine artp(x, psnt) + type(t), intent(in), pointer, optional :: x(..) + logical psnt + if (present (x).neqv. psnt) call abort () + !print *, present(x) + end subroutine artp + + + + subroutine ar1a1(z, z2, z3) + type(t), optional :: z(..) + type(t), pointer, optional :: z2(..) + type(t), allocatable, optional :: z3(..) + call ar(z) + call ar(z2) + call ar(z3) + call art(z) + call art(z2) + call art(z3) + call arp(z2, .false.) + call artp(z2, .false.) + end subroutine ar1a1 + subroutine ar1a(z, z2, z3) + type(t2), optional :: z(..) + type(t2), optional, pointer :: z2(..) + type(t2), optional, allocatable :: z3(..) + call ar(z) + call ar(z2) + call ar(z3) + call arp(z2, .false.) + end subroutine ar1a + subroutine ar1ac1(z, z2, z3) + class(t), optional :: z(..) + class(t), optional, pointer :: z2(..) + class(t), optional, allocatable :: z3(..) + call ar(z) + call ar(z2) + call ar(z3) +! call art(z) ! FIXME: ICE - This requires packing support for assumed-rank +! call art(z2)! FIXME: ICE - This requires packing support for assumed-rank +! call art(z3)! FIXME: ICE - This requires packing support for assumed-rank + call arp(z2, .false.) +! call artp(z2, .false.) ! FIXME: ICE + end subroutine ar1ac1 + subroutine ar1ac(z, z2, z3) + class(t2), optional :: z(..) + class(t2), optional, pointer :: z2(..) + class(t2), optional, allocatable :: z3(..) + call ar(z) + call ar(z2) + call ar(z3) + call arp(z2, .false.) + end subroutine ar1ac +end diff --git a/gcc/testsuite/gfortran.dg/do_1.f90 b/gcc/testsuite/gfortran.dg/do_1.f90 index 171275af3..8ed0f7fb6 100644 --- a/gcc/testsuite/gfortran.dg/do_1.f90 +++ b/gcc/testsuite/gfortran.dg/do_1.f90 @@ -1,4 +1,5 @@ -! { dg-do run } +! { dg-do run { xfail *-*-* } } +! XFAIL is tracked in PR 54932 ! Program to check corner cases for DO statements. program do_1 implicit none diff --git a/gcc/testsuite/gfortran.dg/enum_10.f90 b/gcc/testsuite/gfortran.dg/enum_10.f90 index b387fe339..80e7fca80 100644 --- a/gcc/testsuite/gfortran.dg/enum_10.f90 +++ b/gcc/testsuite/gfortran.dg/enum_10.f90 @@ -1,7 +1,7 @@ ! { dg-do run } ! { dg-additional-sources enum_10.c } ! { dg-options "-fshort-enums -w" } -! { dg-options "-fshort-enums -w -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } } +! { dg-options "-fshort-enums -w -Wl,--no-enum-size-warning" { target arm*-*-linux* } } ! Make sure short enums are indeed interoperable with the ! corresponding C type. diff --git a/gcc/testsuite/gfortran.dg/enum_9.f90 b/gcc/testsuite/gfortran.dg/enum_9.f90 index 8a5c60a10..d3187c75b 100644 --- a/gcc/testsuite/gfortran.dg/enum_9.f90 +++ b/gcc/testsuite/gfortran.dg/enum_9.f90 @@ -1,6 +1,6 @@ ! { dg-do run } ! { dg-options "-fshort-enums" } -! { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } } +! { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux* } } ! Program to test enumerations when option -fshort-enums is given program main diff --git a/gcc/testsuite/gfortran.dg/pr54889.f90 b/gcc/testsuite/gfortran.dg/pr54889.f90 new file mode 100644 index 000000000..68c6bee00 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr54889.f90 @@ -0,0 +1,10 @@ +! PR tree-optimization/54889 +! { dg-do compile } +! { dg-options "-O3" } +! { dg-additional-options "-mavx" { target { i?86-*-* x86_64-*-* } } } + +subroutine foo(x,y,z) + logical, pointer :: x(:,:) + integer :: y, z + x=x(1:y,1:z) +end subroutine diff --git a/gcc/testsuite/gfortran.dg/public_private_module_7.f90 b/gcc/testsuite/gfortran.dg/public_private_module_7.f90 new file mode 100644 index 000000000..d03b7047a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/public_private_module_7.f90 @@ -0,0 +1,29 @@ +! { dg-do compile } +! { dg-options "-O2" } +! +! PR fortran/54884 +! +! Check that get_key_len is not optimized away as it +! is used in a publicly visible specification expression. +! +module m_common_attrs + private + !... + public :: get_key +contains + pure function get_key_len() result(n) + n = 5 + end function get_key_len + pure function other() result(n) + n = 5 + end function other + ! ... + function get_key() result(key) + ! ... + character(len=get_key_len()) :: key + key = '' + end function get_key +end module m_common_attrs + +! { dg-final { scan-assembler-not "__m_common_attrs_MOD_other" } } +! { dg-final { scan-assembler "__m_common_attrs_MOD_get_key_len" } } diff --git a/gcc/testsuite/gnat.dg/loop_optimization13.adb b/gcc/testsuite/gnat.dg/loop_optimization13.adb new file mode 100644 index 000000000..ffc516ff7 --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization13.adb @@ -0,0 +1,21 @@ +-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Loop_Optimization13_Pkg; use Loop_Optimization13_Pkg;
+
+package body Loop_Optimization13 is
+
+ function F (A : Rec) return Rec is
+ N : constant Integer := A.V'Length / L;
+ Res : Rec
+ := (True, new Complex_Vector' (0 .. A.V'Length / L - 1 => (0.0, 0.0)));
+ begin
+ for I in 0 .. L - 1 loop
+ for J in 0 .. N - 1 loop
+ Res.V (J) := Res.V (J) + A.V (I * N + J);
+ end loop;
+ end loop;
+ return Res;
+ end;
+
+end Loop_Optimization13;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization13.ads b/gcc/testsuite/gnat.dg/loop_optimization13.ads new file mode 100644 index 000000000..2d3b8e59f --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization13.ads @@ -0,0 +1,17 @@ +with Ada.Numerics.Complex_Types; use Ada.Numerics.Complex_Types;
+
+package Loop_Optimization13 is
+
+ type Complex_Vector is array (Integer range <>) of Complex;
+ type Complex_Vector_Ptr is access Complex_Vector;
+
+ type Rec (Kind : Boolean := False) is record
+ case Kind is
+ when True => V : Complex_Vector_Ptr;
+ when False => null;
+ end case;
+ end record;
+
+ function F (A : Rec) return Rec;
+
+end Loop_Optimization13;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization13_pkg.ads b/gcc/testsuite/gnat.dg/loop_optimization13_pkg.ads new file mode 100644 index 000000000..8f98b6e1f --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization13_pkg.ads @@ -0,0 +1,5 @@ +package Loop_Optimization13_Pkg is + + L : Integer; + +end Loop_Optimization13_Pkg; diff --git a/gcc/testsuite/gnat.dg/unchecked_convert9.adb b/gcc/testsuite/gnat.dg/unchecked_convert9.adb new file mode 100644 index 000000000..133f3b94c --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert9.adb @@ -0,0 +1,15 @@ +-- { dg-do compile } +-- { dg-options "-O -fdump-rtl-final" } + +package body Unchecked_Convert9 is + + procedure Proc is + L : Unsigned_32 := 16#55557777#; + begin + Var := Conv (L); + end; + +end Unchecked_Convert9; + +-- { dg-final { scan-rtl-dump-times "set \\(mem/v" 1 "final" } } +-- { dg-final { cleanup-rtl-dump "final" } } diff --git a/gcc/testsuite/gnat.dg/unchecked_convert9.ads b/gcc/testsuite/gnat.dg/unchecked_convert9.ads new file mode 100644 index 000000000..d4595f52a --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert9.ads @@ -0,0 +1,20 @@ +with System; +with Ada.Unchecked_Conversion; +with Interfaces; use Interfaces; + +package Unchecked_Convert9 is + + type R is record + H : Unsigned_16; + L : Unsigned_16; + end record; + + Var : R; + pragma Volatile (Var); + + function Conv is new + Ada.Unchecked_Conversion (Source => Unsigned_32, Target => R); + + procedure Proc; + +end Unchecked_Convert9; diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index bd8c026a5..c01e74c3c 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -2264,7 +2264,8 @@ foreach { armfunc armflag armdef } { v4 "-march=armv4 -marm" __ARM_ARCH_4__ v7a "-march=armv7-a" __ARM_ARCH_7A__ v7r "-march=armv7-r" __ARM_ARCH_7R__ v7m "-march=armv7-m -mthumb" __ARM_ARCH_7M__ - v7em "-march=armv7e-m -mthumb" __ARM_ARCH_7EM__ } { + v7em "-march=armv7e-m -mthumb" __ARM_ARCH_7EM__ + v8a "-march=armv8-a" __ARM_ARCH_8A__ } { eval [string map [list FUNC $armfunc FLAG $armflag DEF $armdef ] { proc check_effective_target_arm_arch_FUNC_ok { } { if { [ string match "*-marm*" "FLAG" ] && @@ -3953,7 +3954,7 @@ proc check_effective_target_sync_long_long_runtime { } { } } "" }] - } elseif { [istarget arm*-*-linux-gnueabi] } { + } elseif { [istarget arm*-*-linux-*] } { return [check_runtime sync_longlong_runtime { #include <stdlib.h> int main () @@ -3998,7 +3999,7 @@ proc check_effective_target_sync_int_long { } { || [istarget x86_64-*-*] || [istarget aarch64*-*-*] || [istarget alpha*-*-*] - || [istarget arm*-*-linux-gnueabi] + || [istarget arm*-*-linux-*] || [istarget bfin*-*linux*] || [istarget hppa*-*linux*] || [istarget s390*-*-*] @@ -4030,7 +4031,7 @@ proc check_effective_target_sync_char_short { } { || [istarget i?86-*-*] || [istarget x86_64-*-*] || [istarget alpha*-*-*] - || [istarget arm*-*-linux-gnueabi] + || [istarget arm*-*-linux-*] || [istarget hppa*-*linux*] || [istarget s390*-*-*] || [istarget powerpc*-*-*] |