diff options
Diffstat (limited to 'gcc/testsuite')
655 files changed, 8225 insertions, 918 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d9e9a4025f9..f6a20dc290a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,1385 @@ +2010-07-23 H.J. Lu <hongjiu.lu@intel.com> + + * gcc.target/i386/aes-avx-check.h (main): Require OSXSAVE for + AVX support. + * gcc.target/i386/pclmul-avx-check.h (main): Likewise. + * gcc.target/x86_64/abi/avx/avx-check.h (main): Likewise. + +2010-07-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * lib/target-supports.exp (add_options_for_tls): New proc. + * g++.dg/tls/static-1.C: Use dg-add-options tls. + * g++.dg/tls/static-1a.cc: Likewise. + * gcc.dg/tls/emutls-1.c: Likewise. + * gcc.dg/tls/opt-11.c: Likewise. + * gcc.dg/tls/opt-12.c: Likewise. + * gcc.dg/tls/pr24428-2.c: Likewise. + * gcc.dg/tls/pr24428.c: Likewise. + * obj-c++.dg/tls/static-1.mm: Likewise. + * obj-c++.dg/torture/tls/thr-init-1.mm: Likewise. + * obj-c++.dg/torture/tls/thr-init-2.mm: Likewise. + * obj-c++.dg/torture/tls/thr-init-3.mm: Likewise. + * objc.dg/torture/tls/thr-init-2.m: Likewise. + * objc.dg/torture/tls/thr-init-3.m: Likewise. + * objc.dg/torture/tls/thr-init.m: Likewise. + * gcc.dg/lto/20090210_0.c: Add -pthread for *-*-solaris2.[89]. + +2010-07-23 Uros Bizjak <ubizjak@gmail.com> + + * gcc.dg/tree-ssa/loadpre6.c: Cleanup fre dump file. + * gcc.dg/ipa/ipa-sra-6.c: Cleanup eipa_sra dump file. + * gcc.dg/ipa/pure-const-2.c: Cleanup local-pure-const1 and + optimized dump files. + +2010-07-23 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/45047 + * gcc.c-torture/compile/pr45047.c: New test. + +2010-07-23 Uros Bizjak <ubizjak@gmail.com> + + * gcc.dg/float-range-3.c: Use "dg-do compile" dejagnu directive + instead of dg-compile. + * gcc.dg/float-range-4.c: Ditto. + * gcc.dg/float-range-5.c: Ditto. + * gcc.dg/fold-overflow-1.c: Ditto. + * gcc.dg/gomp/sections-4.c: Ditto. + * gcc.dg/transparent-union-1.c: Ditto. + * gcc.dg/transparent-union-2.c: Ditto. + * gcc.target/i386/pr39315-check.c: Ditto. + * g++.dg/gomp/sections-4.C: Ditto. + * g++.dg/template/dtor7.C: Ditto. + * g++.dg/tree-ssa/pr19952.C: Ditto. + * gfortran.dg/derived_constructor_comps_3.f90: Ditto. + * gfortran.dg/graphite/pr42185.f90: Ditto. + * gfortran.dg/namelist_36.f90: Ditto. + * gnat.dg/noreturn1.adb: Ditto. + * gnat.dg/specs/small_alignment.ads: Ditto. + +2010-07-23 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/44915 + * g++.dg/torture/pr44915.C: New test. + +2010-07-23 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/44914 + * g++.dg/tree-ssa/pr44914.C: New test. + +2010-07-23 Jie Zhang <jie@codesourcery.com> + + PR target/44290 + * gcc.dg/pr44290-1.c: New test. + * gcc.dg/pr44290-2.c: New test. + +2010-07-23 Jason Merrill <jason@redhat.com> + + PR c++/45008 + * g++.dg/abi/mangle44.C: New. + +2010-07-23 Uros Bizjak <ubizjak@gmail.com> + + * gcc.target/i386/*.c: Do not require sse{,2,3,4} effective target + for compile-time only tests. + * gcc.target/i386/pr39315-2.c: Remove redundant sse2 effective + target check. + * gcc.target/i386/pr39315-4.c: Ditto. + * gcc.target/i386/vperm-v4si-1.c: Remove sse_runtime effective + target check. Include sse-os-support.h. + (main): Call check_isa and sse_os_support. + * gcc.target/i386/vperm-v4sf-1.c: Ditto. + * gcc.target/i386/vperm-v4si-2.c (main): Call check_isa. + * gcc.target/i386/vperm-v4sf-2.c: Ditto. + * gcc.target/i386/vperm-v2di.c: Remove sse2_runtime effective + target check. Include sse-os-support.h. + (main): Call check_isa and sse_os_support. + * gcc.target/i386/vperm-v2df.c: Ditto. + +2010-07-23 Uros Bizjak <ubizjak@gmail.com> + + * lib/target-supports.exp (check_avx_hw_available): New procedure. + (check_effective_target_avx_runtime): New procedure. + (check_effective_target_sse2_runtime): Add check_effective_target_sse2. + (check_effective_target_sse_runtime): Add check_effective_target_sse. + + * gcc.dg/compat/pr38736_main.c: Use avx_runtime effective target. + * gcc.dg/compat/vector-1b_main.c: Ditto. Remove cpuid.h include + and __get_cpuid test. + * gcc.dg/compat/vector-2b_main.c: Ditto. + + * gcc.target/i386/avx-check.h (main): Also check bit_OSXSAVE. + + * gcc.dg/20020418-1.c: Do not require sse{,2} effective target + for compile-time only test. + * gcc.dg/pr32716.c: Ditto. + * gcc.dg/pr34856.c: Ditto. + * gcc.dg/pr36997.c: Ditto. + * gcc.dg/prefetch-loop-arrays-1.c: Ditto. + * gfortran.dg/pr28158.f90: Ditto. + * gfortran.dg/pr30667.f: Ditto. + + * gcc.dg/vect/vect.exp: Use check_effective_target_sse2_runtime for + i?86-*-* and x86_64-*-* targets to disable execution on targets + without sse2 runtime support. + * g++.dg/vect/vect.exp: Ditto. + * gfortran.dg/vect/vect.exp: Ditto. + + * gcc.dg/pr36584.c: Remove redundant sse{,2} effective target check. + * gcc.dg/pr37544.c: Ditto. + * gcc.dg/pr40550.c: Ditto. + * gcc.dg/compat/union-m128-1_main.c: Ditto. + * gcc.dg/compat/vector-1a_main.c: Ditto. + * gcc.dg/compat/vector-2a_main.c: Ditto. + * gcc.dg/torture/pr16104-1.c: Ditto. + * gcc.dg/torture/pr35771-1.c: Ditto. + * gcc.dg/torture/pr35771-2.c: Ditto. + * gcc.dg/torture/pr35771-3.c: Ditto. + * gcc.dg/torture/stackalign/alloca-2.c: Ditto. + * gcc.dg/torture/stackalign/alloca-3.c: Ditto. + * gcc.dg/torture/stackalign/push-1.c: Ditto. + * gcc.dg/torture/stackalign/vararg-3.c: Ditto. + * g++.dg/other/i386-1.C: Ditto. + * g++.dg/other/pr40446.C: Ditto. + +2010-07-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * gcc.dg/pr43058.c: Use dg-timeout-factor 4. + +2010-07-23 Daniel Kraft <d@domob.eu> + + PR fortran/44709 + * gfortran.dg/exit_1.f08: New test. + * gfortran.dg/exit_2.f08: New test. + +2010-07-22 Sandra Loosemore <sandra@codesourcery.com> + + PR tree-optimization/39839 + * gcc.target/arm/pr39839.c: New test case. + +2010-07-22 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/unchecked_convert5b.adb: New test. + * gnat.dg/unchecked_convert6.adb: Likewise. + * gnat.dg/unchecked_convert6b.adb: Likewise. + +2010-07-22 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/aggr15.ad[sb]: New test. + +2010-07-22 Dodji Seketeli <dodji@redhat.com> + + PR debug/45024 + * g++.dg/debug/dwarf2/nested-2.C: New test case. + +2010-07-22 H.J. Lu <hongjiu.lu@intel.com> + + * gcc.dg/lto/20100722-1_0.c: Replace dg-require-lto-plugin + with dg-require-linker-plugin. + +2010-07-22 Richard Guenther <rguenther@suse.de> + + PR lto/43850 + * g++.dg/lto/20100722-1_0.C: New testcase. + +2010-07-22 Richard Guenther <rguenther@suse.de> + + PR lto/42451 + * gcc.dg/lto/20100720-3_0.c: New testcase. + * gcc.dg/lto/20100720-3_1.c: Likewise. + +2010-07-22 Richard Guenther <rguenther@suse.de> + + * lib/target-supports-dg.exp (dg-require-linker-plugin): New proc. + * lib/target-supports.exp (check_linker_plugin_available): Likewise. + + PR lto/43373 + * gcc.dg/lto/20100722-1_0.c: New testcase. + +2010-07-22 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/44891 + * testsuite/gcc.c-torture/compile/pr44891.c: New test. + +2010-07-22 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/45017 + * gcc.c-torture/execute/pr45017.c: New testcase. + +2010-07-22 Tobias Burnus <burnus@net-b.de> + + PR fortran/45019 + * gfortran.dg/aliasing_dummy_5.f90: New. + +2010-07-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> + + PR target/43698 + * gcc.target/arm/pr43698.c: New test. + +2010-07-21 Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/44929 + * Revert my commit r162325 for this PR. + +2010-07-21 Jakub Jelinek <jakub@redhat.com> + + PR debug/45015 + * gcc.target/m68k/pr45015.c: New test. + +2010-07-21 Jeffrey Yasskin <jyasskin@google.com> + + PR c++/44641 + * lib/scanasm.exp (dg-function-on-line): Fix regex for IA64's + comments. + +2010-07-21 Richard Guenther <rguenther@suse.de> + + PR lto/45018 + * g++.dg/lto/20100721-1_0.C: New testcase. + +2010-07-21 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/44900 + * g++.dg/torture/pr44900.C: New test. + +2010-07-21 Bernd Schmidt <bernds@codesourcery.com> + + PR middle-end/44738 + * c-c++-common/uninit-17.c: Correct expected error. + +2010-07-21 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/guality/asm-1.c: New test. + + PR debug/45003 + * gcc.dg/guality/pr45003-2.c: New test. + * gcc.dg/guality/pr45003-3.c: New test. + +2010-07-20 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/44697 + * gfortran.dg/ftell_3.f90: Take care of cr-lf record endings. + +2010-07-20 Jeffrey Yasskin <jyasskin@google.com> + + * lib/scanasm.exp (dg-function-on-line): Test that a function is + defined on the current line. + * g++.dg/debug/dwarf2/lineno-simple1.C: New. Line number sanity test. + * g++.dg/debug/dwarf2/pr44641.C: New. + +2010-07-20 Nathan Froyd <froydnj@codesourcery.com> + + * gcc.target/powerpc/block-move-1.c: New test. + * gcc.target/powerpc/block-move-2.c: New test. + +2010-07-20 Jason Merrill <jason@redhat.com> + + PR c++/44967 + * g++.dg/cpp0x/sfinae2.C: New. + +2010-07-20 Richard Guenther <rguenther@suse.de> + + PR lto/42696 + * gcc.dg/lto/20100720-4_0.c: New testcase. + +2010-07-20 Richard Guenther <rguenther@suse.de> + + PR lto/43221 + * gcc.dg/lto/20100720-2_0.c: New testcase. + * gcc.dg/lto/20100720-2_1.c: Likewise. + +2010-07-20 Richard Guenther <rguenther@suse.de> + + PR lto/43208 + * gcc.dg/lto/20100720-1_0.c: New testcase. + * gcc.dg/lto/20100720-1_1.c: Likewise. + +2010-07-20 Jakub Jelinek <jakub@redhat.com> + + PR debug/45003 + * gcc.dg/guality/pr45003-1.c: New test. + +2010-07-20 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44977 + * gcc.dg/torture/pr44977.c: New testcase. + +2010-07-20 Bingfeng Mei <bmei@broadcom.com> + + * gcc.dg/lto/20090313_0.c: Use dg-require-effective-target + sync_char_short + +2010-07-20 Richard Guenther <rguenther@suse.de> + + PR middle-end/44971 + PR middle-end/44988 + * gcc.dg/pr44971.c: New testcase. + * gcc.c-torture/compile/pr44988.c: Likewise. + +2010-07-19 Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/44929 + * gfortran.dg/allocate_with_typespec.f90: New test. + * gfortran.dg/allocate_derived_1.f90: Update error message. + +2010-07-19 Jason Merrill <jason@redhat.com> + + PR c++/44996 + * g++.dg/cpp0x/decltype23.C: New. + +2010-07-19 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/42385 + * gfortran.dg/class_defined_operator_1.f03 : New test. + +2010-07-19 Peter Bergner <bergner@vnet.ibm.com> + + * gcc.dg/vect/slp-perm-1.c (main): Make sure loops aren't vectorized. + * gcc.dg/vect/slp-perm-2.c (main): Likewise. + * gcc.dg/vect/slp-perm-3.c (main): Likewise. Fix loop limit. + * gcc.dg/vect/slp-perm-4.c (main): Fix loop limit. + +2010-07-19 Richard Guenther <rguenther@suse.de> + + PR middle-end/44941 + * gcc.c-torture/compile/pr44941.c: New testcase. + +2010-07-19 Jason Merrill <jason@redhat.com> + + PR c++/44969 + * g++.dg/template/sfinae24.C: New. + +2010-07-19 H.J. Lu <hongjiu.lu@intel.com> + + PR fortran/44353 + * gfortran.dg/data_implied_do_2.f90: Removed. + +2010-07-19 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/44969 + * g++.dg/template/sfinae23.C: New. + +2010-07-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * lib/target-supports.exp (check_sse_os_support_available): New + proc. + (check_sse_hw_available): New proc. + (check_effective_target_sse_runtime): New proc. + (check_effective_target_sse2_runtime): New proc. + * lib/fortran-torture.exp (get-fortran-torture-options): Only add + -msse2 if check_sse_os_support_available. + * g++.dg/vect/vect.exp: Only run -msse2 tests if + check_sse_os_support_available. + * gcc.dg/vect/vect.exp: Likewise. + * gfortran.dg/vect/vect.exp: Likewise. + * gcc.target/i386/sol2-check: Renamed to ... + * gcc.target/i386/sse-os-support.h: ... this. + (sol2_check): Renamed to ... + (sse_os_support): ... this. + Only test movss with xmm registers. + * gcc.target/i386/sse-check.h: Reflect new header and function names. + Removed ILL_INSN, ILL_INSN_LEN. + * gcc.target/i386/sse2-check.h: Likewise. + * gcc.target/i386/sse3-check.h: Likewise. + * gcc.dg/pr40550.c: Use dg-require-effective-target sse_runtime. + Removed cpuid.h, __get_cpuid test. + * g++.dg/other/i386-1.C: Use dg-require-effective-target sse2_runtime. + Removed cpuid.h, __get_cpuid test. + * g++.dg/other/pr40446.C: Likewise. + * gcc.dg/compat/union-m128-1_main.c: Likewise. + * gcc.dg/compat/vector-1a_main.c: Likewise. + * gcc.dg/compat/vector-2a_main.c: Likewise. + * gcc.dg/pr36584.c: Likewise. + * gcc.dg/pr37544.c: Likewise. + * gcc.dg/torture/pr16104-1.c: Likewise. + * gcc.dg/torture/stackalign/alloca-2.c: Likewise. + * gcc.dg/torture/stackalign/alloca-3.c: Likewise. + * gcc.dg/torture/stackalign/push-1.c: Likewise. + * gcc.dg/torture/stackalign/vararg-3.c: Likewise. + * gcc.dg/torture/pr35771.h: Removed cpuid.h, __get_cpuid test. + * gcc.dg/torture/pr35771-1.c: Use dg-require-effective-target + sse2_runtime. + * gcc.dg/torture/pr35771-2.c: Likewise. + * gcc.dg/torture/pr35771-3.c: Likewise. + * gcc.target/i386/pr39315-2.c: Likewise. + * gcc.target/i386/pr39315-4.c: Likewise. + * gcc.target/i386/vperm-v2df.c: Likewise. + * gcc.target/i386/vperm-v2di.c: Likewise. + * gcc.target/i386/vperm-v4si-1.c: Likewise. + * gcc.target/i386/vperm-v4sf-1.c: Use dg-require-effective-target + sse_runtime. + +2010-07-18 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/44353 + * gfortran.dg/data_implied_do_2.f90: New test. + +2010-07-18 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.target/mips/cache-1.c: Allow 0 instead of 0x0. + +2010-07-18 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.target/mips/mips.exp (mips_option_groups): Add -mflip-mips16 + to the "mips16" group. + (mips_using_mips16_p): New procedure. + (mips-dg-options): Use it. + +2010-07-18 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.target/mips/mips16-attributes-4.c: New test. + +2010-07-17 Iain Sandoe <iains@gcc.gnu.org> + + PR testsuite/44418 + * gcc.target/powerpc/recip-1.c: Do not run for powerpc*-apple-darwin* + * gcc.target/powerpc/recip-2.c: Ditto. + * gcc.target/powerpc/recip-3.c: Ditto. + +2010-07-17 Bernd Schmidt <bernds@codesourcery.com> + + * gcc.target/arm/pr42235.c: New test. + +2010-07-16 Jason Merrill <jason@redhat.com> + + PR c++/32505 + * g++.dg/template/partial8.C: New. + +2010-07-16 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/guality/guality.exp: Run also c-c++-common/guality/ tests. + * gcc.dg/guality/guality.h: Include unistd.h. Make the header usable + in C++. + (gualcvt): New overloaded inline. + (GUALCVT): Use it for C++. + * g++.dg/guality/guality.exp: New. + * g++.dg/guality/guality.h: New. + * g++.dg/guality/redeclaration1.C: New test. + * g++.dg/dg.exp: Prune also guality/* tests. + * gcc.dg/guality/pr43141.c: Moved to... + * c-c++-common/guality/pr43141.c: ... here. + +2010-07-16 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/37077 + * gfortran.dg/char4_iunit_2.f03: New test. + +2010-07-16 Iain Sandoe <iains@gcc.gnu.org> + + * lib/plugin-support.exp (plugin-test-execute): + Add ${gcc_objdir}/intl to includes. + +2010-07-16 Jakub Jelinek <jakub@redhat.com> + + PR target/44942 + * gcc.c-torture/execute/pr44942.c: New test. + * gcc.target/i386/pr44942.c: New test. + +2010-07-15 Jason Merrill <jason@redhat.com> + + PR c++/44909 + * g++.dg/cpp0x/implicit7.C: New. + * g++.dg/cpp0x/implicit8.C: New. + +2010-07-15 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> + + Disable float tests for __SPU__ targets due to lack of signed zero: + * c-c++-common/torture/complex-sign-add.c (check_add_float). + * c-c++-common/torture/complex-sign-sub.c (check_sub_float). + * c-c++-common/torture/complex-sign-mul.c (check_mul_float). + * c-c++-common/torture/complex-sign-mul-one.c (check_mul_float). + * c-c++-common/torture/complex-sign-mul-minus-one.c (check_mul_float). + * c-c++-common/torture/complex-sign-mixed-add.c (check_add_float). + * c-c++-common/torture/complex-sign-mixed-sub.c (check_sub_float). + * c-c++-common/torture/complex-sign-mixed-mul.c (check_mul_float). + * c-c++-common/torture/complex-sign-mixed-div.c (check_div_float). + +2010-07-15 Jakub Jelinek <jakub@redhat.com> + + * gfortran.dg/select_char_2.f90: New test. + +2010-07-15 Nathan Froyd <froydnj@codesourcery.com> + + * g++.dg/plugin/attribute_plugin.c: Carefully replace TREE_CHAIN + with DECL_CHAIN. + +2010-07-15 Janus Weil <janus@gcc.gnu.org> + + PR fortran/44936 + * gfortran.dg/typebound_generic_9.f03: New. + +2010-07-15 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44946 + * gcc.c-torture/compile/pr44946.c: New testcase. + +2010-07-15 Jakub Jelinek <jakub@redhat.com> + + PR fortran/40206 + * gfortran.dg/select_char_3.f90: New test. + +2010-07-15 Magnus Granberg <zorry@gentoo.org> + Kevin F. Quinn <kevquinn@gentoo.org> + + * gcc.dg/Wtrampolines.c: New. + +2010-07-14 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/44934 + * gfortran.dg/endfile_2.f90: Fix to unformatted file type. + +2010-07-14 Jason Merrill <jason@redhat.com> + + PR c++/44810 + * g++.dg/torture/pr36745.C: Avoid undefined behavior. + + Implement C++0x unrestricted unions (N2544) + * g++.dg/cpp0x/union1.C: New. + * g++.dg/cpp0x/union2.C: New. + * g++.dg/cpp0x/union3.C: New. + * g++.dg/cpp0x/defaulted2.C: Adjust. + * g++.old-deja/g++.bugs/900121_02.C: Adjust. + * g++.old-deja/g++.ext/anon2.C: Adjust. + * g++.old-deja/g++.mike/misc6.C: Adjust. + +2010-07-14 Janus Weil <janus@gcc.gnu.org> + + PR fortran/44925 + * gfortran.dg/c_loc_tests_15.f90: New. + +2010-07-13 Jason Merrill <jason@redhat.com> + + PR c++/44909 + * g++.dg/cpp0x/implicit6.C: New. + +2010-07-13 Jason Merrill <jason@redhat.com> + + PR c++/44540 + * g++.dg/abi/noreturn1.C: New. + * g++.dg/abi/noreturn2.C: New. + +2010-07-13 Joern Rennecke <joern.rennecke@embecosm.com> + + PR other/44874 + PR debug/44832 + * c-c++-common/pr44832.c: New test. + +2010-07-13 Iain Sandoe <iains@gcc.gnu.org> + + PR objc/44488 + * lib/objc-torture.exp (objc-set-runtime-options): Base runtime list + on the target. Make sure that we can assemble the emitted asm when + the test type is 'compile'. + +2010-07-13 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/36960 + * g++.dg/torture/pr36960.C: New testcase. + +2010-07-13 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/44908 + * g++.dg/template/sfinae21.C: New. + * g++.dg/template/sfinae22.C: Likewise. + +2010-07-16 Jack Howarth <howarth@bromo.med.uc.edu> + + PR testsuite/42843 + * gcc.dg/plugin/selfassign.c: Include diagnostic.h. + * gcc.dg/plugin/ggcplug.c: Likewise. + * g++.dg/plugin/selfassign.c: Likewise. + * g++.dg/plugin/attribute_plugin.c: Likewise. + * g++.dg/plugin/dumb_plugin.c: Likewise. + * g++.dg/plugin/pragma_plugin.c: Likewise. + +2010-07-13 Kaz Kojima <kkojima@gcc.gnu.org> + + * gcc.c-torture/execute/pr44683.x: New. + * gcc.dg/torture/builtin-cproj-1.c: Add dg-add-options ieee. + +2010-07-13 Janus Weil <janus@gcc.gnu.org> + + PR fortran/44434 + PR fortran/44565 + PR fortran/43945 + PR fortran/44869 + * gfortran.dg/dynamic_dispatch_1.f03: Fixed invalid test case. + * gfortran.dg/dynamic_dispatch_2.f03: Ditto. + * gfortran.dg/dynamic_dispatch_3.f03: Ditto. + * gfortran.dh/typebound_call_16.f03: New. + * gfortran.dg/typebound_generic_6.f03: New. + * gfortran.dg/typebound_generic_7.f03: New. + * gfortran.dg/typebound_generic_8.f03: New. + +2010-07-12 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/37077 + * gfortran.dg/char4_iunit_1.f03: New test. + +2010-07-12 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/tree-ssa/vrp53.c: New test. + +2010-07-12 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/44907 + * g++.dg/template/sfinae19.C: New. + * g++.dg/template/sfinae20.C: Likewise. + +2010-07-12 Jie Zhang <jie@codesourcery.com> + + * gcc.target/arm/interrupt-1.c: New test. + * gcc.target/arm/interrupt-2.c: New test. + +2010-07-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * gcc.dg/pr42427.c: Require c99_runtime. + * gcc.target/i386/avx-cmpsd-1.c: Use dg-require-effective-target + c99_runtime. + * gcc.target/i386/avx-cmpss-1.c: Likewise. + * gcc.target/i386/avx-vcmppd-1.c: Likewise. + * gcc.target/i386/avx-vcmppd-256-1.c: Likewise. + * gcc.target/i386/avx-vcmpps-1.c: Likewise. + * gcc.target/i386/avx-vcmpps-256-1.c: Likewise. + * gcc.target/i386/avx-vcmpsd-1.c: Likewise. + * gcc.target/i386/avx-vcmpss-1.c: Likewise. + * gcc.target/i386/sse-cmpss-1.c: Likewise. + * gcc.target/i386/sse2-cmpsd-1.c: Likewise + * gcc.target/i386/pr37275.c: Require visibility support. + +2010-07-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * lib/target-supports.exp (check_effective_target_sse): New proc. + * gcc.target/i386/sol2-check.h: New file. + * gcc.target/i386/sse-check.h (ILL_INSN, ILL_INSN_LEN): Define. + Include sol2-check.h. + (main) Only run do_test () if sol2_check (). + * gcc.target/i386/sse2-check.h: Likewise. + * gcc.target/i386/sse3-check.h: Likewise. + * gcc.dg/vect/tree-vect.h (check_vect) [__i386__ || __x86_64__] + [__sun__ && __svr4__]: Execute SSE2 instruction. + * gcc.target/i386/math-torture/math-torture.exp: Only add options + with -msse to MATH_TORTURE_OPTIONS if check_effective_target_sse. + * g++.dg/debug/dwarf2/const2b.C: Use dg-require-effective-target sse. + * g++.dg/ext/vector14.C: Likewise. + * g++.dg/other/mmintrin.C: Likewise. + * gcc.dg/20020418-1.c: Likewise. + * gcc.dg/debug/dwarf2/const-2b.c: Likewise. + * gcc.dg/format/ms_unnamed-1.c: Likewise. + * gcc.dg/format/unnamed-1.c: Likewise. + Adapt dg-warning line number. + * gcc.dg/graphite/pr40281.c: Likewise. + * gcc.dg/pr32176.c: Likewise. + * gcc.dg/pr40550.c: Likewise. + * gcc.dg/prefetch-loop-arrays-1.c: Likewise. + * gcc.dg/torture/pr36891.c: Likewise. + * gcc.target/i386/20020218-1.c: Likewise. + * gcc.target/i386/20020523.c: Likewise. + * gcc.target/i386/abi-1.c: Likewise. + * gcc.target/i386/brokensqrt.c: Likewise. + * gcc.target/i386/fastcall-sseregparm.c: Likewise. + * gcc.target/i386/pr13366.c: Likewise. + * gcc.target/i386/pr13685.c: Likewise. + * gcc.target/i386/pr24306.c: Likewise. + * gcc.target/i386/pr31486.c: Likewise. + * gcc.target/i386/pr32065-1.c: Likewise. + * gcc.target/i386/pr32065-2.c: Likewise. + * gcc.target/i386/pr32389.c: Likewise. + * gcc.target/i386/pr38824.c: Likewise. + * gcc.target/i386/pr38931.c: Likewise. + * gcc.target/i386/pr39592-1.c: Likewise. + * gcc.target/i386/pr43766.c: Likewise. + * gcc.target/i386/recip-divf.c: Likewise. + * gcc.target/i386/recip-sqrtf.c: Likewise. + * gcc.target/i386/recip-vec-divf.c: Likewise. + * gcc.target/i386/recip-vec-sqrtf.c: Likewise. + * gcc.target/i386/sse-1.c: Likewise. + * gcc.target/i386/sse-16.c: Likewise. + * gcc.target/i386/sse-2.c: Likewise. + * gcc.target/i386/sse-20.c: Likewise. + * gcc.target/i386/sse-3.c: Likewise. + * gcc.target/i386/sse-7.c: Likewise. + * gcc.target/i386/sse-9.c: Likewise. + * gcc.target/i386/sse-addps-1.c: Likewise. + * gcc.target/i386/sse-addss-1.c: Likewise. + * gcc.target/i386/sse-andnps-1.c: Likewise. + * gcc.target/i386/sse-andps-1.c: Likewise. + * gcc.target/i386/sse-cmpss-1.c: Likewise. + * gcc.target/i386/sse-comiss-1.c: Likewise. + * gcc.target/i386/sse-comiss-2.c: Likewise. + * gcc.target/i386/sse-comiss-3.c: Likewise. + * gcc.target/i386/sse-comiss-4.c: Likewise. + * gcc.target/i386/sse-comiss-5.c: Likewise. + * gcc.target/i386/sse-comiss-6.c: Likewise. + * gcc.target/i386/sse-copysignf-vec.c: Likewise. + * gcc.target/i386/sse-cvtsi2ss-1.c: Likewise. + * gcc.target/i386/sse-cvtsi2ss-2.c: Likewise. + * gcc.target/i386/sse-cvtss2si-1.c: Likewise. + * gcc.target/i386/sse-cvtss2si-2.c: Likewise. + * gcc.target/i386/sse-cvttss2si-1.c: Likewise. + * gcc.target/i386/sse-cvttss2si-2.c: Likewise. + * gcc.target/i386/sse-divps-1.c: Likewise. + * gcc.target/i386/sse-divss-1.c: Likewise. + * gcc.target/i386/sse-init-v4hi-1.c: Likewise. + * gcc.target/i386/sse-init-v4sf-1.c: Likewise. + * gcc.target/i386/sse-maxps-1.c: Likewise. + * gcc.target/i386/sse-maxss-1.c: Likewise. + * gcc.target/i386/sse-minps-1.c: Likewise. + * gcc.target/i386/sse-minss-1.c: Likewise. + * gcc.target/i386/sse-movaps-1.c: Likewise. + * gcc.target/i386/sse-movaps-2.c: Likewise. + * gcc.target/i386/sse-movhlps-1.c: Likewise. + * gcc.target/i386/sse-movhps-1.c: Likewise. + * gcc.target/i386/sse-movhps-2.c: Likewise. + * gcc.target/i386/sse-movlhps-1.c: Likewise. + * gcc.target/i386/sse-movmskps-1.c: Likewise. + * gcc.target/i386/sse-movntps-1.c: Likewise. + * gcc.target/i386/sse-movss-1.c: Likewise. + * gcc.target/i386/sse-movss-2.c: Likewise. + * gcc.target/i386/sse-movss-3.c: Likewise. + * gcc.target/i386/sse-movups-1.c: Likewise. + * gcc.target/i386/sse-movups-2.c: Likewise. + * gcc.target/i386/sse-mulps-1.c: Likewise. + * gcc.target/i386/sse-mulss-1.c: Likewise. + * gcc.target/i386/sse-orps-1.c: Likewise. + * gcc.target/i386/sse-rcpps-1.c: Likewise. + * gcc.target/i386/sse-recip-vec.c: Likewise. + * gcc.target/i386/sse-recip.c: Likewise. + * gcc.target/i386/sse-rsqrtps-1.c: Likewise. + * gcc.target/i386/sse-set-ps-1.c: Likewise. + * gcc.target/i386/sse-sqrtps-1.c: Likewise. + * gcc.target/i386/sse-subps-1.c: Likewise. + * gcc.target/i386/sse-subss-1.c: Likewise. + * gcc.target/i386/sse-ucomiss-1.c: Likewise. + * gcc.target/i386/sse-ucomiss-2.c: Likewise. + * gcc.target/i386/sse-ucomiss-3.c: Likewise. + * gcc.target/i386/sse-ucomiss-4.c: Likewise. + * gcc.target/i386/sse-ucomiss-5.c: Likewise. + * gcc.target/i386/sse-ucomiss-6.c: Likewise. + * gcc.target/i386/sse-unpckhps-1.c: Likewise. + * gcc.target/i386/sse-unpcklps-1.c: Likewise. + * gcc.target/i386/sse-xorps-1.c: Likewise. + * gcc.target/i386/ssefn-1.c: Likewise. + * gcc.target/i386/ssefn-3.c: Likewise. + * gcc.target/i386/sseregparm-1.c: Likewise. + * gcc.target/i386/stackalign/return-3.c: Likewise. + * gcc.target/i386/vectorize1.c: Likewise. + * gcc.target/i386/vperm-v4sf-1.c: Likewise. + * gcc.target/i386/xorps-sse.c: Likewise. + * gfortran.dg/pr28158.f90: Likewise. + * gfortran.dg/pr30667.f: Likewise. + * gnat.dg/loop_optimization7.adb: Likewise. + * gnat.dg/sse_nolib.adb: Likewise. + +2010-07-11 Tobias Burnus <burnus@net-b.de> + + PR fortran/44702 + * gfortran.dg/use_rename_6.f90: New. + * gfortran.dg/use_iso_c_binding.f90: Update dg-error. + +2010-07-11 Janus Weil <janus@gcc.gnu.org> + + PR fortran/44869 + * gfortran.dg/class_24.f03: New. + +2010-07-10 Richard Guenther <rguenther@suse.de> + + PR lto/44889 + * gcc.dg/lto/20100709-1_0.c: New testcase. + * gcc.dg/lto/20100709-1_1.c: Likewise. + +2010-07-10 Richard Sandiford <r.sandiford@uk.ibm.com> + + * gcc.dg/attr-weak-hidden-1.c, gcc.dg/attr-weak-hidden-1a.c: New test. + +2010-07-10 Iain Sandoe <iains@gcc.gnu.org> + + PR objc/44140 + * objc.dg/lto/trivial-1_0.m: New. + * objc.dg/lto/lto.exp: New. + * obj-c++.dg/lto/trivial-1_0.mm: New. + * obj-c++.dg/lto/lto.exp: New. + * objc.dg/symtab-1.m: Adjust sizes. + * objc.dg/image-info.m: Do not run for gnu-runtime. + +2010-07-09 Bernd Schmidt <bernds@codesourcery.com> + + * gcc.dg/pr32370.c: Allow another kind of error message. + +2010-07-09 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/atomic3.adb: New test. + +2010-07-09 Jakub Jelinek <jakub@redhat.com> + Denys Vlasenko <dvlasenk@redhat.com> + Bernhard Reutner-Fischer <aldot@gcc.gnu.org> + + PR tree-optimization/28632 + * gcc.dg/tree-ssa/vrp51.c: New test. + * gcc.dg/tree-ssa/vrp52.c: New test. + +2010-07-09 Jason Merrill <jason@redhat.com> + + * g++.dg/abi/covariant6.C: New. + * g++.dg/inherit/covariant17.C: Test both bases. + * g++.dg/inherit/covariant7.C: Check vtable layout. + +2010-07-09 Tom de Vries <tjvries@xs4all.nl> + + * gcc.dg/debug/dwarf2/pr31230.c: New testcase. + +2010-07-09 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44852 + * gcc.c-torture/execute/pr44852.c: New testcase. + +2010-07-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * gcc.target/x86_64/abi/asm-support.S (snapshot): Replace + multiplication by values. + * gcc.target/x86_64/abi/asm-support-darwin.s (_snapshot): Likewise. + * gcc.target/x86_64/abi/avx/asm-support.S (snapshot): Likewise. + +2010-07-09 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44882 + * gfortran.dg/pr44882.f90: New testcase. + +2010-07-09 Bernd Schmidt <bernds@codesourcery.com> + + PR target/40657 + * gcc.target/arm/pr40657-1.c: New test. + * gcc.target/arm/pr40657-2.c: New test. + * gcc.c-torture/execute/pr40657.c: New test. + +2010-07-09 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/tree-ssa/vrp50.c: New test. + * gcc.dg/vect/slp-perm-4.c (main): Make sure loop isn't vectorized. + +2010-07-08 Janus Weil <janus@gcc.gnu.org> + + PR fortran/44649 + * gfortran.dg/c_sizeof_1.f90: Modified. + * gfortran.dg/storage_size_1.f08: New. + * gfortran.dg/storage_size_2.f08: New. + +2010-07-08 Mikael Pettersson <mikpe@it.uu.se> + + * gcc.c-torture/execute/20100708-1.c: New test. + +2010-07-08 Jakub Jelinek <jakub@redhat.com> + + PR fortran/44847 + * gfortran.dg/gomp/pr44847.f90: New test. + +2010-07-08 Sebastian Pop <sebastian.pop@amd.com> + + PR tree-optimization/44710 + * gcc.dg/tree-ssa/ifc-6.c: New. + * gcc.dg/tree-ssa/ifc-pr44710.c: New. + +2010-07-08 Tobias Burnus <burnus@net-b.de> + + PR fortran/18918 + * gfortran.dg/coarray_10.f90: Add an additional test. + +2010-07-08 Peter Bergner <bergner@vnet.ibm.com> + + PR middle-end/44828 + * gcc.c-torture/execute/pr44828.c (foo): Use signed char. + * gcc.c-torture/execute/pr44828.x: Revert. + +2010-07-08 Jason Merrill <jason@redhat.com> + + PR c++/43120 + * g++.dg/inherit/covariant17.C: New. + * g++.dg/abi/covariant1.C: Actually test for the bug. + +2010-07-08 H.J. Lu <hongjiu.lu@intel.com> + + PR rtl-optimization/44838 + * gcc.dg/pr44838.c: New. + +2010-07-08 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44831 + * gcc.c-torture/compile/pr44831.c: New testcase. + * gcc.dg/tree-ssa/pr21463.c: Adjust. + +2010-07-08 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44861 + * g++.dg/vect/pr44861.cc: New testcase. + +2010-07-07 Peter Bergner <bergner@vnet.ibm.com> + + PR middle-end/44828 + * gcc.c-torture/execute/pr44828.x: New file. + +2010-07-07 Peter Bergner <bergner@vnet.ibm.com> + + * g++.dg/ext/altivec-2.C: Add -Wno-unused-but-set-variable to + dg-options. + * g++.dg/ext/altivec-17.C: Adjust error message. + +2010-07-07 Tom Tromey <tromey@redhat.com> + + * g++.dg/debug/dwarf2/pubnames-1.C: Make darwin-specific. + +2010-07-07 H.J. Lu <hongjiu.lu@intel.com> + + PR target/44844 + * gcc.target/i386/rdrand-1.c: Scan "jnc". + * gcc.target/i386/rdrand-2.c: Likewise. + * gcc.target/i386/rdrand-3.c: Likewise. + +2010-07-07 Jan Hubicka <jh@suse.cz> + + PR middle-end/44813 + * g++.dg/torture/pr44813.C: New testcase. + * g++.dg/torture/pr44826.C: New testcase. + +2010-07-07 Bernd Schmidt <bernds@codesourcery.com> + + PR rtl-optimization/44787 + * gcc.c-torture/compile/pr44788.c: New test. + * gcc.target/arm/pr44788.c: New test. + +2010-07-06 Peter Bergner <bergner@vnet.ibm.com> + + * gcc.target/powerpc/altivec-volatile.c: Adjust expected warning. + +2010-07-06 Peter Bergner <bergner@vnet.ibm.com> + + * gcc.target/powerpc/ppu-intrinsics.c: Add -Wno-unused-but-set-variable + to dg-options. + +2010-07-06 Tobias Burnus <burnus@net-b.de> + + PR fortran/44742 + * gfortran.dg/parameter_array_init_6.f90: New. + * gfortran.dg/initialization_20.f90: Update dg-error. + * gfortran.dg/initialization_24.f90: Ditto. + +2010-07-06 Thomas Koenig <tkoenig@gcc.gnu.org> + PR fortran/PR44693 + * gfortran.dg/dim_range_1.f90: New test. + * gfortran.dg/minmaxloc_4.f90: Remove invalid test. + +2010-07-06 Jason Merrill <jason@redhat.com> + + PR c++/44703 + * g++.dg/cpp0x/initlist41.C: New. + + PR c++/44778 + * g++.dg/template/ptrmem22.C: New. + +2010-07-06 Kai Tietz <kai.tietz@onevision.com> + + * gcc.target/i386/ms_hook_prologue.c: Add x64 ms_hook_prologue + support. + * gcc.target/i386/i386.exp: Likewise. + +2010-07-06 Peter Bergner <bergner@vnet.ibm.com> + + PR testsuite/44195 + * gcc.dg/lto/20100518_0.c: Limit to x86. + +2010-07-06 Richard Guenther <rguenther@suse.de> + + PR middle-end/44828 + * gcc.c-torture/execute/pr44828.c: New testcase. + +2010-07-06 Shujing Zhao <pearly.zhao@oracle.com> + + * g++.dg/warn/noeffect2.C: Adjust expected warning. + * g++.dg/warn/volatile1.C: Likewise. + * g++.dg/template/warn1.C: Likewise. + +2010-07-05 H.J. Lu <hongjiu.lu@intel.com> + + AVX Programming Reference (June, 2010) + * g++.dg/other/i386-2.C: Add -mfsgsbase -mrdrnd -mf16c. + * g++.dg/other/i386-3.C: Likewise. + * gcc.target/i386/sse-12.c: Likewise. + + * gcc.target/i386/f16c-check.h: New. + * gcc.target/i386/rdfsbase-1.c: Likewise. + * gcc.target/i386/rdfsbase-2.c: Likewise. + * gcc.target/i386/rdgsbase-1.c: Likewise. + * gcc.target/i386/rdgsbase-2.c: Likewise. + * gcc.target/i386/rdrand-1.c: Likewise. + * gcc.target/i386/rdrand-2.c: Likewise. + * gcc.target/i386/rdrand-3.c: Likewise. + * gcc.target/i386/vcvtph2ps-1.c: Likewise. + * gcc.target/i386/vcvtph2ps-2.c: Likewise. + * gcc.target/i386/vcvtph2ps-3.c: Likewise. + * gcc.target/i386/vcvtps2ph-1.c: Likewise. + * gcc.target/i386/vcvtps2ph-2.c: Likewise. + * gcc.target/i386/vcvtps2ph-3.c: Likewise. + * gcc.target/i386/wrfsbase-1.c: Likewise. + * gcc.target/i386/wrfsbase-2.c: Likewise. + * gcc.target/i386/wrgsbase-1.c: Likewise. + * gcc.target/i386/wrgsbase-2.c: Likewise. + + * gcc.target/i386/sse-13.c: Add -mfsgsbase -mrdrnd -mf16c. + (__builtin_ia32_vcvtps2ph): New. + (__builtin_ia32_vcvtps2ph256): Likewise. + + * gcc.target/i386/sse-14.c: Add -mfsgsbase -mrdrnd -mf16c. + Test _cvtss_sh, _mm_cvtps_ph and _mm256_cvtps_ph. + + * gcc.target/i386/sse-22.c: Add fsgsbase,rdrnd,f16c. + Test _cvtss_sh, _mm_cvtps_ph and _mm256_cvtps_ph. + + * gcc.target/i386/sse-23.c (__builtin_ia32_vcvtps2ph): New. + (__builtin_ia32_vcvtps2ph256): Likewise. + Add fsgsbase,rdrnd,f16c. + + * lib/target-supports.exp (check_effective_target_f16c): New. + +2010-07-05 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/guality/nrv-1.c: New test. + +2010-07-05 Sandra Loosemore <sandra@codesourcery.com> + + PR middle-end/42505 + * gcc.target/arm/pr42505.c: New test case. + +2010-07-05 Jakub Jelinek <jakub@redhat.com> + + PR c++/44808 + * g++.dg/opt/nrv16.C: New test. + +2010-07-05 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44784 + * gcc.c-torture/compile/pr44784.c: New testcase. + +2010-07-05 Ira Rosen <irar@il.ibm.com> + + * gcc.dg/vect/costmodel/i386/costmodel-fast-math-vect-pr29925.c: + Increase loop bound and array size. + * gcc.dg/vect/costmodel/x86_64/costmodel-fast-math-vect-pr29925.c: + Likewise. + +2010-07-05 Ira Rosen <irar@il.ibm.com> + + * gcc.dg/vect/costmodel/ppc/costmodel-vect-31d.c: Remove. + * gcc.dg/vect/costmodel/ppc/costmodel-vect-76a.c: Increase loop bound. + * gcc.dg/vect/costmodel/ppc/costmodel-vect-76b.c: Likewise. + * gcc.dg/vect/costmodel/ppc/costmodel-vect-68d.c: Remove. + * gcc.dg/vect/pr35821-altivec.c, gcc.dg/vect/pr35821-spu.c: Likewise. + +2010-07-05 Shujing Zhao <pearly.zhao@oracle.com> + + PR c++/22138 + * g++.dg/parse/template25.C: New. + +2010-07-04 H.J. Lu <hongjiu.lu@intel.com> + + PR rtl-optimization/44695 + * gcc.dg/torture/pr44695.c: New. + +2010-07-04 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c++/16630 + * g++.dg/ext/pretty3.C: New. + +2010-07-04 Richard Guenther <rguenther@suse.de> + + PR middle-end/44809 + * g++.dg/torture/pr44809.C: New testcase. + +2010-07-04 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44656 + * gcc.dg/tree-ssa/loadpre6.c: Remove XFAIL. + +2010-07-04 Ira Rosen <irar@il.ibm.com> + Revital Eres <eres@il.ibm.com> + + * gcc.dg/vect/vect-42.c: Don't expect peeling on targets that support + misaligned stores. + * gcc.dg/vect/vect-60.c, gcc.dg/vect/vect-56.c, gcc.dg/vect/vect-93.c, + gcc.dg/vect/vect-96.c: Likewise. + * gcc.dg/vect/vect-109.c: Expect vectorization only on targets that + that support misaligned stores. Change the number of expected + misaligned accesses. + * gcc.dg/vect/vect-peel-1.c: New test. + * gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/vect-peel-3.c, + gcc.dg/vect/vect-peel-4.c: Likewise. + * gcc.dg/vect/vect-multitypes-1.c: Change the test to make it + vectorizable on all targets that support realignment. + * gcc.dg/vect/vect-multitypes-4.c: Likewise. + +2010-07-03 H.J. Lu <hongjiu.lu@intel.com> + + PR c/44806 + * gcc.dg/torture/pr44806.c: New. + +2010-07-03 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/cond_expr1.adb: New test. + +2010-07-03 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/modular3.adb: New test. + * gnat.dg/modular3_pkg.ads: New helper. + +2010-07-03 Iain Sandoe <iains@gcc.gnu.org> + Mikael Pettersson <mikpe@it.uu.se> + + PR testsuite/44518 + * obj-c++.dg/encode-2.mm: Produce object and save temps. + Make signed-ness of chars explicit. Scan the object for + strings that are split by some target assemblers. + * obj-c++.dg/encode-3.mm: Make the signed-ness of chars + explicit. + +2010-07-03 Hans-Peter Nilsson <hp@axis.com> + + * gfortran.dg/char_bounds_check_fail_1.f90: Correct dg-output string. + +2010-07-02 Le-Chun Wu <lcwu@google.com> + + PR/44128 + * g++.dg/warn/Wshadow-7.C: New test. + +2010-07-02 Daniel Jacobowitz <dan@codesourcery.com> + Julian Brown <julian@codesourcery.com> + Sandra Loosemore <sandra@codesourcery.com> + + * gcc.c-torture/execute/20100416-1.c: New test case. + +2010-07-02 Julian Brown <julian@codesourcery.com> + Sandra Loosemore <sandra@codesourcery.com> + + PR target/43703 + + * gcc.dg/vect/vect.exp: Add -ffast-math for NEON. + * gcc.dg/vect/vect-reduc-6.c: Add XFAIL for NEON. + +2010-07-02 Sandra Loosemore <sandra@codesourcery.com> + Julian Brown <julian@codesourcery.com> + + * gcc.target/arm/neon/vadds64.c: Regenerated. + * gcc.target/arm/neon/vaddu64.c: Regenerated. + * gcc.target/arm/neon/vsubs64.c: Regenerated. + * gcc.target/arm/neon/vsubu64.c: Regenerated. + * gcc.target/arm/neon-vmla-1.c: Add -ffast-math to options. + * gcc.target/arm/neon-vmls-1.c: Likewise. + * gcc.target/arm/neon-vsubs64.c: New execution test. + * gcc.target/arm/neon-vsubu64.c: New execution test. + * gcc.target/arm/neon-vadds64.c: New execution test. + * gcc.target/arm/neon-vaddu64.c: New execution test. + +2010-07-02 Sandra Loosemore <sandra@codesourcery.com> + + * gcc.target/arm/neon-vands64.c: New. + * gcc.target/arm/neon-vandu64.c: New. + * gcc.target/arm/neon-vbics64.c: New. + * gcc.target/arm/neon-vbicu64.c: New. + * gcc.target/arm/neon-veors64.c: New. + * gcc.target/arm/neon-veoru64.c: New. + * gcc.target/arm/neon-vorns64.c: New. + * gcc.target/arm/neon-vornu64.c: New. + * gcc.target/arm/neon-vorrs64.c: New. + * gcc.target/arm/neon-vorru64.c: New. + * gcc.target/arm/neon/vands64.c: Regenerated. + * gcc.target/arm/neon/vandu64.c: Regenerated. + * gcc.target/arm/neon/vbics64.c: Regenerated. + * gcc.target/arm/neon/vbicu64.c: Regenerated. + * gcc.target/arm/neon/veors64.c: Regenerated. + * gcc.target/arm/neon/veoru64.c: Regenerated. + * gcc.target/arm/neon/vorns64.c: Regenerated. + * gcc.target/arm/neon/vornu64.c: Regenerated. + * gcc.target/arm/neon/vorrs64.c: Regenerated. + * gcc.target/arm/neon/vorru64.c: Regenerated. + +2010-07-02 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + * gfortran.dg/runtime_warning_1.f90: Remove extra dg line. + +2010-07-02 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + * gfortran.dg/runtime_warning_1.f90: Fix dg syntax. + * gfortran.dg/intent_out_5.f90: Same. + * gfortran.dg/ltrans-7.f90: Same. + * gfortran.dg/char_bounds_check_fail_1.f90: Same. + +2010-07-02 Jan Hubicka <jh@suse.cz> + + * gcc.dg/tree-ssa/ipa-split-5.c: New function. + +2010-07-02 Iain Sandoe <iains@gcc.gnu.org> + + * objc-obj-c++-shared/Object1.h: Correct Line endings. + +2010-07-02 Jakub Jelinek <jakub@redhat.com> + + PR c++/44780 + * c-c++-common/Wunused-var-12.c: New test. + +2010-07-02 Bernd Schmidt <bernds@codesourcery.com> + + PR target/42835 + * gcc.target/arm/pr42835.c: New test. + + PR target/42172 + * gcc.target/arm/pr42172-1.c: New test. + +2010-07-02 Paolo Carlini <paolo.carlini@oracle.com> + + * g++.dg/template/crash98.C: Remove stray // from dg-error comment. + +2010-07-02 Sandra Loosemore <sandra@codesourcery.com> + + * gcc.target/arm/neon/vdup_ns64.c: Regenerated. + * gcc.target/arm/neon/vdup_nu64.c: Regenerated. + * gcc.target/arm/neon/vdupQ_ns64.c: Regenerated. + * gcc.target/arm/neon/vdupQ_nu64.c: Regenerated. + * gcc.target/arm/neon/vmov_ns64.c: Regenerated. + * gcc.target/arm/neon/vmov_nu64.c: Regenerated. + * gcc.target/arm/neon/vmovQ_ns64.c: Regenerated. + * gcc.target/arm/neon/vmovQ_nu64.c: Regenerated. + * gcc.target/arm/neon/vget_lanes64.c: Regenerated. + * gcc.target/arm/neon/vget_laneu64.c: Regenerated. + * gcc.target/arm/neon/vset_lanes64.c: Regenerated. + * gcc.target/arm/neon/vset_laneu64.c: Regenerated. + * gcc.target/arm/neon-vdup_ns64.c: New. + * gcc.target/arm/neon-vdup_nu64.c: New. + * gcc.target/arm/neon-vdupQ_ns64.c: New. + * gcc.target/arm/neon-vdupQ_nu64.c: New. + * gcc.target/arm/neon-vdupQ_lanes64.c: New. + * gcc.target/arm/neon-vdupQ_laneu64.c: New. + * gcc.target/arm/neon-vmov_ns64.c: New. + * gcc.target/arm/neon-vmov_nu64.c: New. + * gcc.target/arm/neon-vmovQ_ns64.c: New. + * gcc.target/arm/neon-vmovQ_nu64.c: New. + * gcc.target/arm/neon-vget_lanes64.c: New. + * gcc.target/arm/neon-vget_laneu64.c: New. + * gcc.target/arm/neon-vset_lanes64.c: New. + * gcc.target/arm/neon-vset_laneu64.c: New. + +2010-07-02 Richard Guenther <rguenther@suse.de> + + * g++.dg/torture/20100702-1.C: New testcase. + +2010-07-02 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> + + PR target/44707 + * gcc.c-torture/compile/pr44707.c: New test. + +2010-07-02 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/44039 + * g++.dg/template/crash101.C: New. + +2010-07-02 Iain Sandoe <iains@gcc.gnu.org> + + * obj-c++.dg/cxx-ivars-3.mm: Make the test require OSX <= 10.4. + Use the ABI-0 accessors and fail it for m64. + +2010-07-02 Jan Hubicka <jh@suse.cz> + + * g++.dg/tree-ssa/pr44706.C: New testcase. + +2010-07-02 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/44748 + * gcc.dg/tree-ssa/ssa-ccp-29.c: New testcase. + +2010-07-02 Iain Sandoe <iains@gcc.gnu.org> + + * objc-obj-c++-shared/next-abi.h: Remove dependency on system + headers. Add clause to reflect that, pre-10.5, ABI is always 0. + * objc/execute/forward-1.m: Depend only on __NEXT_RUNTIME__ for + the method types to forward:. + +2010-06-30 Jason Merrill <jason@redhat.com> + + * g++.dg/cpp0x/nullptr04.C: Use __INTPTR_TYPE__. + * g++.dg/other/pr25632.C: Likewise. + +2010-07-01 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/40421 + * gfortran.fortran-torture/compile/pr40421.f90: New test. + +2010-07-01 Richard Guenther <rguenther@suse.de> + + PR middle-end/42834 + PR middle-end/44468 + * gcc.c-torture/execute/20100316-1.c: New testcase. + * gcc.c-torture/execute/pr44468.c: Likewise. + * gcc.c-torture/compile/20100609-1.c: Likewise. + * gcc.dg/volatile2.c: Adjust. + * gcc.dg/plugin/selfassign.c: Likewise. + * gcc.dg/pr36902.c: Likewise. + * gcc.dg/tree-ssa/foldaddr-2.c: Remove. + * gcc.dg/tree-ssa/foldaddr-3.c: Likewise. + * gcc.dg/tree-ssa/forwprop-8.c: Adjust. + * gcc.dg/tree-ssa/pr17141-1.c: Likewise. + * gcc.dg/tree-ssa/ssa-fre-13.c: Likewise. + * gcc.dg/tree-ssa/ssa-fre-14.c: Likewise. + * gcc.dg/tree-ssa/ssa-ccp-21.c: Likewise. + * gcc.dg/tree-ssa/pta-ptrarith-1.c: Likewise. + * gcc.dg/tree-ssa/20030807-7.c: Likewise. + * gcc.dg/tree-ssa/forwprop-10.c: Likewise. + * gcc.dg/tree-ssa/ssa-fre-1.c: Likewise. + * gcc.dg/tree-ssa/pta-ptrarith-2.c: Likewise. + * gcc.dg/tree-ssa/ssa-ccp-23.c: Likewise. + * gcc.dg/tree-ssa/forwprop-1.c: Likewise. + * gcc.dg/tree-ssa/forwprop-2.c: Likewise. + * gcc.dg/tree-ssa/struct-aliasing-1.c: Likewise. + * gcc.dg/tree-ssa/ssa-ccp-25.c: Likewise. + * gcc.dg/tree-ssa/ssa-pre-26.c: Likewise. + * gcc.dg/tree-ssa/struct-aliasing-2.c: Likewise. + * gcc.dg/tree-ssa/ssa-ccp-26.c: Likewise. + * gcc.dg/tree-ssa/ssa-sccvn-4.c: Likewise. + * gcc.dg/tree-ssa/ssa-pre-7.c: Likewise. + * gcc.dg/tree-ssa/forwprop-5.c: Likewise. + * gcc.dg/struct/w_prof_two_strs.c: XFAIL. + * gcc.dg/struct/wo_prof_escape_arg_to_local.c: Likewise. + * gcc.dg/struct/wo_prof_global_var.c: Likewise. + * gcc.dg/struct/wo_prof_malloc_size_var.c: Likewise. + * gcc.dg/struct/w_prof_local_array.c: Likewise. + * gcc.dg/struct/w_prof_single_str_global.c: Likewise. + * gcc.dg/struct/wo_prof_escape_str_init.c: Likewise. + * gcc.dg/struct/wo_prof_array_through_pointer.c: Likewise. + * gcc.dg/struct/w_prof_global_array.c: Likewise. + * gcc.dg/struct/wo_prof_array_field.c: Likewise. + * gcc.dg/struct/wo_prof_single_str_local.c: Likewise. + * gcc.dg/struct/w_prof_local_var.c: Likewise. + * gcc.dg/struct/wo_prof_two_strs.c: Likewise. + * gcc.dg/struct/wo_prof_empty_str.c: Likewise. + * gcc.dg/struct/wo_prof_local_array.c: Likewise. + * gcc.dg/struct/w_prof_global_var.c: Likewise. + * gcc.dg/struct/wo_prof_single_str_global.c: Likewise. + * gcc.dg/struct/wo_prof_escape_substr_value.c: Likewise. + * gcc.dg/struct/wo_prof_global_array.c: Likewise. + * gcc.dg/struct/wo_prof_escape_return.c: Likewise. + * gcc.dg/struct/wo_prof_escape_substr_array.c: Likewise. + * gcc.dg/struct/wo_prof_double_malloc.c: Likewise. + * gcc.dg/struct/w_ratio_cold_str.c: Likewise. + * gcc.dg/struct/wo_prof_escape_substr_pointer.c: Likewise. + * gcc.dg/struct/wo_prof_local_var.c: Likewise. + * gcc.dg/tree-prof/stringop-1.c: Adjust. + * g++.dg/tree-ssa/pr31146.C: Likewise. + * g++.dg/tree-ssa/copyprop-1.C: Likewise. + * g++.dg/tree-ssa/pr33604.C: Likewise. + * g++.dg/plugin/selfassign.c: Likewise. + * gfortran.dg/array_memcpy_3.f90: Likewise. + * gfortran.dg/array_memcpy_4.f90: Likewise. + * c-c++-common/torture/pr42834.c: New testcase. + +2010-06-30 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/44628 + * g++.dg/template/crash100.C: New. + 2010-06-30 Jan Hubicka <jh@suse.cz> * gcc.dg/tree-ssa/ipa-split-4.c: New testcase. diff --git a/gcc/testsuite/c-c++-common/Wunused-var-12.c b/gcc/testsuite/c-c++-common/Wunused-var-12.c new file mode 100644 index 00000000000..312680a72e8 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wunused-var-12.c @@ -0,0 +1,25 @@ +/* PR c++/44780 */ +/* { dg-do compile } */ +/* { dg-options "-Wunused" } */ + +typedef double vec __attribute__ ((__vector_size__ (16))); +vec c, d; + +void +foo (void) +{ + vec a; + vec b; + a = c; + b = a; + d = b; +} + +void +bar (void) +{ + vec a; + vec b; /* { dg-warning "set but not used" } */ + a = c; + b = a; +} diff --git a/gcc/testsuite/gcc.dg/guality/pr43141.c b/gcc/testsuite/c-c++-common/guality/pr43141.c index e6fe79a0efc..e6fe79a0efc 100644 --- a/gcc/testsuite/gcc.dg/guality/pr43141.c +++ b/gcc/testsuite/c-c++-common/guality/pr43141.c diff --git a/gcc/testsuite/c-c++-common/pr44832.c b/gcc/testsuite/c-c++-common/pr44832.c new file mode 100644 index 00000000000..4138e37f01d --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr44832.c @@ -0,0 +1,160 @@ +/* PR debug/44832 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug" } */ + +struct rtx_def; +typedef struct rtx_def *rtx; +typedef const struct rtx_def *const_rtx; +struct rtvec_def; +typedef struct rtvec_def *rtvec; +extern int ix86_isa_flags; + +enum machine_mode +{ + VOIDmode, + V8HImode, + V16QImode, + V4SImode, + V2DImode, + V32QImode, + MAX_MACHINE_MODE, + + NUM_MACHINE_MODES = MAX_MACHINE_MODE +}; +extern unsigned char mode_size[NUM_MACHINE_MODES]; +extern const unsigned char mode_inner[NUM_MACHINE_MODES]; +extern const unsigned char mode_nunits[NUM_MACHINE_MODES]; +enum rtx_code { + +CONST_INT , + +CONST_FIXED , + +CONST_DOUBLE + + }; +union rtunion_def +{ + rtvec rt_rtvec; +}; +typedef union rtunion_def rtunion; +struct rtx_def { + + __extension__ enum rtx_code code: 16; + + __extension__ enum machine_mode mode : 8; + + union u { + rtunion fld[1]; + } u; +}; +struct rtvec_def { + rtx elem[1]; +}; +extern int rtx_equal_p (const_rtx, const_rtx); +extern rtx gen_reg_rtx (enum machine_mode); + +extern void +ix86_expand_vector_init_concat (enum machine_mode mode, + rtx target, rtx *ops, int n); + +static void +ix86_expand_vector_init_general (unsigned char mmx_ok, enum machine_mode mode, + rtx target, rtx vals) +{ + rtx ops[32], op0, op1; + enum machine_mode half_mode = VOIDmode; + int n, i; + + switch (mode) + { + case V4SImode: + case V2DImode: + n = mode_nunits[mode]; + ix86_expand_vector_init_concat (mode, target, ops, n); + return; + + case V32QImode: + goto half; +half: +{ + typedef int eger; + if (mode != V4SImode) + ops[0] = 0; +} + n = mode_nunits[mode]; + for (i = 0; i < n; i++) + ops[i] = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]); + op0 = gen_reg_rtx (VOIDmode); + return; + + case V16QImode: + if (!((ix86_isa_flags & (1 << 19)) != 0)) + break; + + case V8HImode: + if (!((ix86_isa_flags & (1 << 17)) != 0)) + break; + + n = mode_nunits[mode]; + for (i = 0; i < n; i++) + ops[i] = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]); + return; + + default: + ; + } + + { + int n_words; + + n_words = ((unsigned short) mode_size[mode]) / 4; + + if (n_words == 4) + ix86_expand_vector_init_general (0, V4SImode, 0, 0); + } +} + + +void +ix86_expand_vector_init (unsigned char mmx_ok, rtx target, rtx vals) +{ + enum machine_mode mode = ((enum machine_mode) (target)->mode); + enum machine_mode inner_mode = ((enum machine_mode) mode_inner[mode]); + int n_elts = mode_nunits[mode]; + int n_var = 0, one_var = -1; + unsigned char all_same = 1, all_const_zero = 1; + int i; + rtx x; + + for (i = 0; i < n_elts; ++i) + { + x = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]); + if (!((((enum rtx_code) (x)->code) == CONST_INT) + || ((enum rtx_code) (x)->code) == CONST_DOUBLE + || ((enum rtx_code) (x)->code) == CONST_FIXED)) + n_var++, one_var = i; + else + all_const_zero = 0; + if (i > 0 && !rtx_equal_p (x, (((((vals)->u.fld[0]).rt_rtvec))->elem[0]))) + all_same = 0; + } + + + if (n_var == 0) + { + return; + } + + if (all_same) + return; + + if (n_var == 1) + { + if (all_const_zero) + return; + + } + + ix86_expand_vector_init_general (mmx_ok, mode, target, vals); +} diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-add.c b/gcc/testsuite/c-c++-common/torture/complex-sign-add.c index e81223224dc..bcaf8bba9e3 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-add.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-add.c @@ -28,7 +28,9 @@ void check_add_float (void) { +#ifndef __SPU__ CHECK_ADD (float, __builtin_copysignf, 0.0f, 0.0if); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-add.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-add.c index d1e20912ae1..caea562e8bd 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-add.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-add.c @@ -28,7 +28,9 @@ void check_add_float (void) { +#ifndef __SPU__ CHECK_ADD (float, __builtin_copysignf, 0.0f, 0.0if); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-div.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-div.c index f7ee48341c0..269d5ec42ea 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-div.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-div.c @@ -20,7 +20,9 @@ void check_div_float (void) { +#ifndef __SPU__ CHECK_DIV (float, __builtin_copysignf, 0.0f, 0.0if, 1.0f); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-mul.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-mul.c index 02f936b75bd..e79db6d4559 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-mul.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-mul.c @@ -28,7 +28,9 @@ void check_mul_float (void) { +#ifndef __SPU__ CHECK_MUL (float, __builtin_copysignf, 0.0f, 0.0if); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-sub.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-sub.c index 739500d2f8b..d9e083cfdce 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-sub.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mixed-sub.c @@ -28,7 +28,9 @@ void check_sub_float (void) { +#ifndef __SPU__ CHECK_SUB (float, __builtin_copysignf, 0.0f, 0.0if); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mul-minus-one.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mul-minus-one.c index 05cc4fabea4..d20b5e6c87f 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mul-minus-one.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mul-minus-one.c @@ -36,7 +36,9 @@ void check_mul_float (void) { +#ifndef __SPU__ CHECK_MUL (float, __builtin_copysignf, 0.0f, 0.0if, 1.0f); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mul-one.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mul-one.c index 014d813e99e..ad02a2cd666 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mul-one.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mul-one.c @@ -36,7 +36,9 @@ void check_mul_float (void) { +#ifndef __SPU__ CHECK_MUL (float, __builtin_copysignf, 0.0f, 0.0if, 1.0f); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-mul.c b/gcc/testsuite/c-c++-common/torture/complex-sign-mul.c index 08d247aa5c0..a3274d2ea44 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-mul.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-mul.c @@ -28,7 +28,9 @@ void check_mul_float (void) { +#ifndef __SPU__ CHECK_MUL (float, __builtin_copysignf, 0.0f, 0.0if); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/complex-sign-sub.c b/gcc/testsuite/c-c++-common/torture/complex-sign-sub.c index d4da14dc5f5..0a4e3029e68 100644 --- a/gcc/testsuite/c-c++-common/torture/complex-sign-sub.c +++ b/gcc/testsuite/c-c++-common/torture/complex-sign-sub.c @@ -28,7 +28,9 @@ void check_sub_float (void) { +#ifndef __SPU__ CHECK_SUB (float, __builtin_copysignf, 0.0f, 0.0if); +#endif } void diff --git a/gcc/testsuite/c-c++-common/torture/pr42834.c b/gcc/testsuite/c-c++-common/torture/pr42834.c new file mode 100644 index 00000000000..a1ba49e46d4 --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/pr42834.c @@ -0,0 +1,23 @@ +/* { dg-do run } */ + +void __attribute__((noinline,noclone)) +foo(int *p, float *q) { __asm__ volatile ("" : : : "memory"); } + +int main() +{ + if (sizeof (int) == sizeof (float)) + { + int i; + float f; + int *p; + /* Prevent i and f from being rewritten into SSA form. */ + foo (&i, &f); + i = 0; + f = 1.0; + p = (int *)&f; + __builtin_memcpy (&i, p, 4); + if (*(float *)&i != 1.0) + __builtin_abort (); + } + return 0; +} diff --git a/gcc/testsuite/c-c++-common/uninit-17.c b/gcc/testsuite/c-c++-common/uninit-17.c index b895ac7dcd9..628296213d5 100644 --- a/gcc/testsuite/c-c++-common/uninit-17.c +++ b/gcc/testsuite/c-c++-common/uninit-17.c @@ -9,9 +9,9 @@ static void bar(int a, int *ptr) { do { - int b; /* { dg-message "note: 'b' was declared here" } */ + int b; /* { dg-warning "is used uninitialized" } */ if (b < 40) { - ptr[0] = b; /* { dg-warning "may be used uninitialized" } */ + ptr[0] = b; } b += 1; ptr++; diff --git a/gcc/testsuite/g++.dg/abi/covariant1.C b/gcc/testsuite/g++.dg/abi/covariant1.C index 203ec2c9fcb..ae8c5e603da 100644 --- a/gcc/testsuite/g++.dg/abi/covariant1.C +++ b/gcc/testsuite/g++.dg/abi/covariant1.C @@ -1,8 +1,8 @@ // { dg-do compile } // { dg-options "-w" } -// We don't want to use a covariant thunk to have a virtual -// primary base +// If a covariant thunk is overriding a virtual primary base, we have to +// use the vcall offset even though we know it will be 0. struct c4 {}; @@ -16,6 +16,11 @@ struct c12 : c11 { }; struct c14 : virtual c12, - virtual c11 { virtual c12* f17(); }; + virtual c11 { virtual void f(); c12* f17(); }; -// { dg-final { scan-assembler-not "\n_ZTch0_v0_n16_N3c143f17Ev\[: \t\n\]" } } +void c14::f() { } + +// { dg-final { scan-assembler "_ZTcv0_n12_v0_n16_N3c143f17Ev" { target ilp32 } } } +// { dg-final { scan-assembler-not "_ZTch0_v0_n16_N3c143f17Ev" } } +// { dg-final { scan-assembler "_ZTcv0_n24_v0_n32_N3c143f17Ev" { target lp64 } } } +// { dg-final { scan-assembler-not "_ZTch0_v0_n32_N3c143f17Ev" } } diff --git a/gcc/testsuite/g++.dg/abi/covariant6.C b/gcc/testsuite/g++.dg/abi/covariant6.C new file mode 100644 index 00000000000..9dfc5ba74ab --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/covariant6.C @@ -0,0 +1,34 @@ +struct A +{ + virtual A* f(); +}; + +struct B: virtual A +{ + virtual A* f(); +}; + +struct C: B +{ + virtual C* f(); +}; + +C* C::f() { return 0; } + +// When we emit C::f, we should emit both thunks: one for B and one for A. +// { dg-final { scan-assembler "_ZTch0_v0_n16_N1C1fEv" { target ilp32 } } } +// { dg-final { scan-assembler "_ZTch0_v0_n32_N1C1fEv" { target lp64 } } } +// { dg-final { scan-assembler "_ZTcv0_n12_v0_n16_N1C1fEv" { target ilp32 } } } +// { dg-final { scan-assembler "_ZTcv0_n24_v0_n32_N1C1fEv" { target lp64 } } } + +struct D: B +{ + virtual void dummy (); + virtual D* f(); +}; + +void D::dummy() { } + +// When we emit the D vtable, it should refer to the thunk for B. +// { dg-final { scan-assembler "_ZTch0_v0_n16_N1D1fEv" { target ilp32 } } } +// { dg-final { scan-assembler "_ZTch0_v0_n32_N1D1fEv" { target lp64 } } } diff --git a/gcc/testsuite/g++.dg/abi/mangle44.C b/gcc/testsuite/g++.dg/abi/mangle44.C new file mode 100644 index 00000000000..8454148421c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle44.C @@ -0,0 +1,19 @@ +// PR c++/45008 + +template <typename T> +struct A +{ + void fn1 () { + struct Nested { + static void fn2 () { } + }; + Nested::fn2(); + } +}; + +void fn3 () { + A<double> a; + a.fn1(); +} + +// { dg-final { scan-assembler-not "_ZZN1AIT_E3fn1EvEN6Nested3fn2Ev" } } diff --git a/gcc/testsuite/g++.dg/abi/noreturn1.C b/gcc/testsuite/g++.dg/abi/noreturn1.C new file mode 100644 index 00000000000..0532cf2f803 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/noreturn1.C @@ -0,0 +1,14 @@ +// Test that attribute noreturn is not part of the mangled name. +// { dg-options -fabi-version=0 } + +void baz (const char *fmt, ...); + +// { dg-final { scan-assembler "_Z3barPFvPKczE" } } +void bar (void (*baz) (const char *fmt, ...) + __attribute__ ((noreturn, format (printf, 1, 2)))); + +void +foo () +{ + bar (&baz); +} diff --git a/gcc/testsuite/g++.dg/abi/noreturn2.C b/gcc/testsuite/g++.dg/abi/noreturn2.C new file mode 100644 index 00000000000..72accafe660 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/noreturn2.C @@ -0,0 +1,14 @@ +// Test for buggy mangling of attribute noreturn in abi<=4 +// { dg-options -fabi-version=4 } + +void baz (const char *fmt, ...); + +// { dg-final { scan-assembler "_Z3barPVFvPKczE" } } +void bar (void (*baz) (const char *fmt, ...) + __attribute__ ((noreturn, format (printf, 1, 2)))); + +void +foo () +{ + bar (&baz); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype23.C b/gcc/testsuite/g++.dg/cpp0x/decltype23.C new file mode 100644 index 00000000000..78eb89d8ee2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype23.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +int x, &&y = static_cast<int &&>(x); +typedef decltype((y)) myInt; // `y' is a parenthesized id-expression of type int that is an lvalue +typedef int &myInt; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc/testsuite/g++.dg/cpp0x/defaulted2.C index 909ebc5e6e0..1f400f4fad0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted2.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted2.C @@ -54,7 +54,7 @@ G::G() = default; union U { - G g; // { dg-error "constructor" } + G g; // { dg-error "union member.*non-trivial" } }; int main() @@ -62,5 +62,7 @@ int main() F f; F f2(f); // { dg-error "use" } B* b = new const B; // { dg-error "uninitialized const" } + U u; // { dg-error "deleted" } } +// { dg-prune-output "implicitly deleted because" } diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit6.C b/gcc/testsuite/g++.dg/cpp0x/implicit6.C new file mode 100644 index 00000000000..c7902969dce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit6.C @@ -0,0 +1,23 @@ +// Circular implicit declarations were causing errors +// { dg-options -std=c++0x } + +struct Ray; + +struct Vector +{ + virtual void f(); // make non-trivially-copyable + Vector(const Ray &) ; +}; + +struct array +{ + Vector v; +}; + +struct Ray +{ + array a; +}; + +extern Ray r1; +Ray r2=r1; diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit7.C b/gcc/testsuite/g++.dg/cpp0x/implicit7.C new file mode 100644 index 00000000000..f29e5009fbd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit7.C @@ -0,0 +1,37 @@ +// PR c++/44909 +// { dg-options -std=c++0x } +// Declaring A<D<E>>'s copy ctor means choosing a ctor to initialize D<E>, +// which means choosing a ctor for C<B<E>>, which meant considering +// C(const B<E>&) which means choosing a ctor for B<E>, which means choosing +// a ctor for A<D<E>>. Cycle. + +template<typename T> +struct A +{ + T t; +}; + +template <typename T> +struct B +{ + typename T::U u; +}; + +template <typename T> +struct C +{ + C(const T&); +}; + +template <typename T> +struct D +{ + C<B<T> > v; +}; + +struct E { + typedef A<D<E> > U; +}; + +extern A<D<E> > a; +A<D<E> > a2(a); diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit8.C b/gcc/testsuite/g++.dg/cpp0x/implicit8.C new file mode 100644 index 00000000000..2f3febae8b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit8.C @@ -0,0 +1,34 @@ +// The hack for PR c++/44909 breaks this testcase. We need feedback +// from the C++ committee to know how to proceed. +// { dg-options -std=c++0x } +// { dg-prune-output "implicitly deleted" } +// { dg-prune-output "cannot bind" } +// { dg-prune-output "initializing argument" } + +struct A +{ + A(); + A(A&); +}; + +struct B; +struct BP +{ + BP(const B&); +}; + +struct B +{ + B(); + B(B&&); + B(const BP&); +}; + +// If B(B&&) suppresses the B copy constructor, then copying the B +// subobject of C should use B(const BP&). But we ignore that constructor +// in order to break the cycle in 44909. Perhaps the move ctor shouldn't +// suppress the copy ctor? +struct C: A, B { }; + +C c; +C c2(c); // { dg-bogus "deleted" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist41.C b/gcc/testsuite/g++.dg/cpp0x/initlist41.C new file mode 100644 index 00000000000..b5385480c89 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist41.C @@ -0,0 +1,14 @@ +// PR c++/44703 +// { dg-options -std=c++0x } + +#include <initializer_list> + +typedef std::initializer_list<int> type ; +void f(type) {} + +int main() +{ +// error: could not convert '{1, 2, 3}' to 'type' + f({1,2,3}) ; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr04.C b/gcc/testsuite/g++.dg/cpp0x/nullptr04.C index 6e1d1256c57..be581bcb6e3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr04.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr04.C @@ -3,17 +3,15 @@ // Test cast to int -#define unsigned -__extension__ typedef __SIZE_TYPE__ ssize_t; -#undef unsigned +__extension__ typedef __INTPTR_TYPE__ intptr_t; const int n4 = static_cast<const int>(nullptr); // { dg-error "invalid static_cast " } const short int n5 = reinterpret_cast<short int>(nullptr); // { dg-error "loses precision" } -const ssize_t n6 = reinterpret_cast<ssize_t>(nullptr); -const ssize_t n7 = (ssize_t)nullptr; +const intptr_t n6 = reinterpret_cast<intptr_t>(nullptr); +const intptr_t n7 = (intptr_t)nullptr; decltype(nullptr) mynull = 0; const int n8 = static_cast<const int>(mynull); // { dg-error "invalid static_cast " } const short int n9 = reinterpret_cast<short int>(mynull); // { dg-error "loses precision" } -const ssize_t n10 = reinterpret_cast<ssize_t>(mynull); -const ssize_t n11 = (ssize_t)mynull; +const intptr_t n10 = reinterpret_cast<intptr_t>(mynull); +const intptr_t n11 = (intptr_t)mynull; diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae2.C b/gcc/testsuite/g++.dg/cpp0x/sfinae2.C new file mode 100644 index 00000000000..b9ef70d99cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae2.C @@ -0,0 +1,39 @@ +// PR c++/44967 +// { dg-options -std=c++0x } + +template <typename T> T&& declval(); + +template<typename T1, typename T2, typename... Args> +struct has_construct +{ + typedef char one; + typedef struct {char _m[2]; } two; + + template<typename U1, typename U2, typename... Args2> + static decltype(declval<U1>().construct(declval<U2*>(), declval<Args2>()...), one()) test(int); + template<typename, typename, typename...> + static two test(...); + + static const bool value = sizeof(test<T1, T2, Args...>(0)) == 1; +}; + + +struct A0 +{}; + +struct A1 +{ + void construct(int*, int); +}; + +template<typename _Tp> +struct A2 +{ + template<typename _Tp1, typename... _Args> + void construct(_Tp1*, _Args&&...) {} +}; + +#define SA(X) static_assert(X,#X) +SA((!has_construct<A0, int, int>::value)); // ok +SA((has_construct<A1, int, int>::value)); // bang +SA((has_construct<A2<int>, int>::value)); // bang diff --git a/gcc/testsuite/g++.dg/cpp0x/union1.C b/gcc/testsuite/g++.dg/cpp0x/union1.C new file mode 100644 index 00000000000..291853d5aae --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union1.C @@ -0,0 +1,34 @@ +// Negative test for C++0x unrestricted unions +// { dg-options -std=c++0x } +// { dg-prune-output "implicitly deleted because" } + +struct A +{ + A(); + A(const A&); + ~A(); +}; + +union B +{ + A a; // { dg-error "union member" } +}; + +B b; // { dg-error "B::B\\(\\)" } +B b2(b); // { dg-error "B::B\\(const B&\\)" } + +struct C +{ + union + { + A a; // { dg-error "union member" } + }; +}; + +C c; // { dg-error "C::C\\(\\)" } +C c2(c); // { dg-error "C::C\\(const C&\\)" } + +// { dg-error "B::~B" "" { target *-*-* } 17 } +// { dg-error "B::~B" "" { target *-*-* } 18 } +// { dg-error "C::~C" "" { target *-*-* } 28 } +// { dg-error "C::~C" "" { target *-*-* } 29 } diff --git a/gcc/testsuite/g++.dg/cpp0x/union2.C b/gcc/testsuite/g++.dg/cpp0x/union2.C new file mode 100644 index 00000000000..4f193e281c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union2.C @@ -0,0 +1,34 @@ +// Positive test for C++0x unrestricted unions +// { dg-options -std=c++0x } + +struct A +{ + A(); + A(const A&); + ~A(); +}; + +union B +{ + A a; + B(); + B(const B&); + ~B(); +}; + +B b; +B b2(b); + +struct C +{ + union + { + A a; + }; + C(); + C(const C&); + ~C(); +}; + +C c; +C c2(c); diff --git a/gcc/testsuite/g++.dg/cpp0x/union3.C b/gcc/testsuite/g++.dg/cpp0x/union3.C new file mode 100644 index 00000000000..f1e8ddb6109 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union3.C @@ -0,0 +1,69 @@ +// Runtime test for C++0x unrestricted unions +// { dg-options -std=c++0x } +// { dg-do run } + +int c, d; +struct A +{ + int i; + A(): i(1) { ++c; } + A(const A&): i(2) { ++c; } + ~A() { ++d; } +}; + +union B +{ + A a; + B() { } + B(const B& b) { } + ~B() { } +}; + +struct C +{ + union { A a; }; + C() { } + C(const C&) { } + ~C() { } +}; + +union D +{ + A a; + D(): a() { } + D(const D& d): a(d.a) { } + ~D() { a.~A(); } +}; + +struct E +{ + union { A a; }; + E(): a() { } + E(const E& e): a (e.a) { } + ~E() { a.~A(); } +}; + +int main() +{ + { + B b1; + B b2(b1); + + C c1; + C c2(c1); + } + + if (c != 0 || d != 0) + return c+d*10; + + { + D d1; + D d2(d1); + + E e1; + E e2(e1); + } + + if (c != 4 || d != 4) + return c*100+d*1000; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C index 593e080ac69..81360c2439f 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C @@ -1,5 +1,6 @@ /* { dg-do compile { target i386*-*-* } } */ /* { dg-options "-O -gdwarf-2 -dA -msse" } */ +/* { dg-require-effective-target sse } */ /* { dg-final { scan-assembler "DW_AT_const_value" } } */ typedef float FloatVect __attribute__((__vector_size__(16))); diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C b/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C new file mode 100644 index 00000000000..e0ef7f71ca3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-g -O0 -dA" } + +struct C { // { dg-function-on-line {_ZN1CC[12]Ev} } + virtual void + foo() {} // { dg-function-on-line _ZN1C3fooEv } +}; +static C dummy; + +int +main (void) +{ // { dg-function-on-line main } +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C new file mode 100644 index 00000000000..2386baaacb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C @@ -0,0 +1,37 @@ +/* + Origin: PR debug/45024 + { dg-options "-g -dA -fno-merge-debug-strings" } + { dg-do compile } +*/ + +struct S { + template<typename Z> struct T { }; +}; + +S::T<int> tval; + +/* +We want to express that the DIE of S::T<int> must be a child of the DIE of S, like in assembly this output: + + .uleb128 0x2 # (DIE (0x9e) DW_TAG_structure_type) + .ascii "S\0" # DW_AT_name + .byte 0x1 # DW_AT_byte_size + .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc) + .byte 0x1 # DW_AT_decl_line + .long 0xbc # DW_AT_sibling + .uleb128 0x3 # (DIE (0xa8) DW_TAG_structure_type) + .ascii "T<int>\0" # DW_AT_name + .byte 0x1 # DW_AT_byte_size + .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc) + .byte 0x2 # DW_AT_decl_line + .uleb128 0x4 # (DIE (0xb3) DW_TAG_template_type_param) + .ascii "Z\0" # DW_AT_name + .long 0xbc # DW_AT_type + .byte 0 # end of children of DIE 0xa8 + .byte 0 # end of children of DIE 0x9e + +Hence the slightly odd regexp: + + { dg-final { scan-assembler "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"S\\\\0\"\[ \t\]+#\[ \t\]+DW_AT_name\[\n\r\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"T<int>\\\\0\"\[ \t\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_template_type_param\\)\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*#\[ \t\]+end of children of DIE\[^\n\r\]*\[\n\r\]+\[^\n\r\]*end of children of DIE\[^\n\r\]*" } } + + */ diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C new file mode 100644 index 00000000000..2df002f6b00 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C @@ -0,0 +1,41 @@ +// Origin: PR 44641 +// { dg-do compile } +// { dg-options "-g -O0 -dA" } + +template <class A> struct MisplacedDbg; +template<class T> struct MisplacedDbg<T*>; +struct Full; +template<> struct MisplacedDbg<Full>; + +struct Arg; +typedef MisplacedDbg<Arg> Typedef1; +typedef MisplacedDbg<Arg*> Typedef2; +typedef MisplacedDbg<Full> Typedef3; + +template<typename T> struct Base { + virtual ~Base() { + } +}; + +template <> +struct MisplacedDbg<Full> // { dg-function-on-line {_ZN12MisplacedDbgI4FullEC[12]Ev} } + // { dg-function-on-line {_ZN12MisplacedDbgI4FullED0Ev} { target *-*-* } 21 } + + : public Base<int> { +}; + +template <class T> +struct MisplacedDbg<T*> // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgEC[12]Ev} } + // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgED0Ev} { target *-*-* } 28 } + : public Base<int> { +}; + +template <class A> +struct MisplacedDbg // { dg-function-on-line {_ZN12MisplacedDbgI3ArgEC[12]Ev} } + // { dg-function-on-line {_ZN12MisplacedDbgI3ArgED0Ev} { target *-*-* } 34 } + : public Base<int> { +}; + +static MisplacedDbg<Arg> static_var1; +static MisplacedDbg<Arg*> static_var2; +static MisplacedDbg<Full> static_var3; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C index 543439da323..18d1df0d952 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C @@ -1,7 +1,7 @@ // Contributed by Dodji Seketeli <dodji@redhat.com> // Origin PR debug/39706 +// { dg-do compile { target *-*-darwin* } } // { dg-options "-g -dA -fno-merge-debug-strings" } -// { dg-do compile } // // There should be one debug_pubnames section generated. // On Darwin though, there is also a label pointing at the begining of the diff --git a/gcc/testsuite/g++.dg/dg.exp b/gcc/testsuite/g++.dg/dg.exp index 5758218a267..5851dcc94f2 100644 --- a/gcc/testsuite/g++.dg/dg.exp +++ b/gcc/testsuite/g++.dg/dg.exp @@ -1,4 +1,4 @@ -# Copyright (C) 2000, 2007 Free Software Foundation, Inc. +# Copyright (C) 2000, 2007, 2009, 2010 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 @@ -47,6 +47,7 @@ set tests [prune $tests $srcdir/$subdir/gomp/*] set tests [prune $tests $srcdir/$subdir/tree-prof/*] set tests [prune $tests $srcdir/$subdir/torture/*] set tests [prune $tests $srcdir/$subdir/graphite/*] +set tests [prune $tests $srcdir/$subdir/guality/*] # Main loop. dg-runtest $tests "" $DEFAULT_CXXFLAGS diff --git a/gcc/testsuite/g++.dg/ext/altivec-17.C b/gcc/testsuite/g++.dg/ext/altivec-17.C index e83c46b7039..54eff8a24ed 100644 --- a/gcc/testsuite/g++.dg/ext/altivec-17.C +++ b/gcc/testsuite/g++.dg/ext/altivec-17.C @@ -12,5 +12,5 @@ typedef vector__ bool__ int bool_simd_type; void Foo (bool_simd_type const &a) { - simd_type const &v = a; // { dg-error "'const __vector.4. unsigned int&' from expression of type 'const __vector.4. __bool int'" } + simd_type const &v = a; // { dg-error "'const simd_type&' from expression of type 'const bool_simd_type'" } } diff --git a/gcc/testsuite/g++.dg/ext/altivec-2.C b/gcc/testsuite/g++.dg/ext/altivec-2.C index 1185a79e5ec..eb8a92942bc 100644 --- a/gcc/testsuite/g++.dg/ext/altivec-2.C +++ b/gcc/testsuite/g++.dg/ext/altivec-2.C @@ -1,6 +1,6 @@ /* { dg-do compile { target powerpc*-*-* } } */ /* { dg-require-effective-target powerpc_altivec_ok } */ -/* { dg-options "-maltivec -Wall" } */ +/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable" } */ /* This test checks if AltiVec builtins accept const-qualified arguments. */ diff --git a/gcc/testsuite/g++.dg/ext/pretty3.C b/gcc/testsuite/g++.dg/ext/pretty3.C new file mode 100644 index 00000000000..01b14579af2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pretty3.C @@ -0,0 +1,19 @@ +// PR c++/16630 +// { dg-do compile } +// { dg-options "" } +extern "C" int printf (const char*, ...); + +template <class T> +struct B { typedef T X; }; + +template <class U> +struct D +{ + const char* foo (typename B<U>::X) { return __PRETTY_FUNCTION__; } +}; + +int main () +{ + printf ("%s\n", D<int>().foo (0)); +} +// { dg-final { scan-assembler "const char\\* D<U>::foo\\(typename B<U>::X\\)" } } diff --git a/gcc/testsuite/g++.dg/ext/vector14.C b/gcc/testsuite/g++.dg/ext/vector14.C index 78109c1a676..8e792108fb8 100644 --- a/gcc/testsuite/g++.dg/ext/vector14.C +++ b/gcc/testsuite/g++.dg/ext/vector14.C @@ -1,6 +1,7 @@ // PR c++/35758 // { dg-do compile } -// { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +// { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-require-effective-target sse } // Ignore warning on some powerpc-linux configurations. // { dg-prune-output "non-standard ABI extension" } // { dg-prune-output "mangled name" } diff --git a/gcc/testsuite/g++.dg/gomp/sections-4.C b/gcc/testsuite/g++.dg/gomp/sections-4.C index 44e7de98c20..62a2ecddf9a 100644 --- a/gcc/testsuite/g++.dg/gomp/sections-4.C +++ b/gcc/testsuite/g++.dg/gomp/sections-4.C @@ -1,5 +1,5 @@ /* PR c++/24613 */ -/* { dg-compile } */ +/* { dg-do compile } */ #pragma omp section /* { dg-error "may only be used in" } */ diff --git a/gcc/testsuite/g++.dg/guality/guality.exp b/gcc/testsuite/g++.dg/guality/guality.exp new file mode 100644 index 00000000000..9a1785036ef --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/guality.exp @@ -0,0 +1,53 @@ +# This harness is for tests that should be run at all optimisation levels. + +load_lib g++-dg.exp +load_lib gcc-gdb-test.exp + +# Disable on darwin until radr://7264615 is resolved. +if { [istarget *-*-darwin*] } { + return +} + +proc check_guality {args} { + set result [eval check_compile guality_check executable $args "-g -O0"] + set lines [lindex $result 0] + set output [lindex $result 1] + set ret 0 + if {[string match "" $lines]} { + set execout [g++_load "./$output"] + set ret [string match "*1 PASS, 0 FAIL, 0 UNRESOLVED*" $execout] + } + remote_file build delete $output + return $ret +} + +dg-init + +global GDB +if ![info exists ::env(GUALITY_GDB_NAME)] { + if [info exists GDB] { + set guality_gdb_name "$GDB" + } else { + set guality_gdb_name "[transform gdb]" + } + setenv GUALITY_GDB_NAME "$guality_gdb_name" +} + +if {[check_guality " + #include \"$srcdir/$subdir/guality.h\" + volatile long int varl = 6; + int main (int argc, char *argv\[\]) + { + GUALCHKVAL (varl); + return 0; + } +"]} { + gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" + gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "" +} + +if [info exists guality_gdb_name] { + unsetenv GUALITY_GDB_NAME +} + +dg-finish diff --git a/gcc/testsuite/g++.dg/guality/guality.h b/gcc/testsuite/g++.dg/guality/guality.h new file mode 100644 index 00000000000..dd858d28b4b --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/guality.h @@ -0,0 +1 @@ +#include "../../gcc.dg/guality/guality.h" diff --git a/gcc/testsuite/g++.dg/guality/redeclaration1.C b/gcc/testsuite/g++.dg/guality/redeclaration1.C new file mode 100644 index 00000000000..16f2f0ca481 --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/redeclaration1.C @@ -0,0 +1,26 @@ +// { dg-do run } +// { dg-options "-g" } + +volatile int l; + +namespace S +{ + int i = 24; + void __attribute__((noinline)) + f() + { + int i = 42; + l = i; // { dg-final { gdb-test 13 "i" "42" } } + { + extern int i; + l = i; // { dg-final { gdb-test 16 "i" "24" } } + } + } +} + +int +main (void) +{ + S::f (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant17.C b/gcc/testsuite/g++.dg/inherit/covariant17.C new file mode 100644 index 00000000000..b2de15f7ed6 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant17.C @@ -0,0 +1,43 @@ +// PR c++/43120 +// { dg-do run } + +extern "C" void abort (); + +struct A { + int a; + + A(int a_) : a(a_) {} + + A(const A &other) { } + + virtual void dummy() {} +}; + +struct B { + virtual B *clone() const = 0; +}; + +struct C : public virtual B { + virtual C *clone() const = 0; +}; + +struct E* ep; +struct E : public A, public C { + E(int a_) : A(a_) { ep = this; } + + virtual E *clone() const { + if (this != ep) + abort(); + return 0; + } +}; + +int main() { + E *a = new E(123); + C *c = a; + B *b = a; + c->clone(); + b->clone(); + delete a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant7.C b/gcc/testsuite/g++.dg/inherit/covariant7.C index cbd58bb24e1..4d519ed400b 100644 --- a/gcc/testsuite/g++.dg/inherit/covariant7.C +++ b/gcc/testsuite/g++.dg/inherit/covariant7.C @@ -1,4 +1,6 @@ // { dg-do compile } +// { dg-prune-output "direct base" } +// { dg-options "-fdump-class-hierarchy" } // Copyright (C) 2002 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com> @@ -27,7 +29,23 @@ struct c4 : virtual c3, virtual c0, virtual c1 int m; }; -struct c6 : c0, c3, c4 // { dg-warning "direct base" "" } +struct c6 : c0, c3, c4 { virtual c1 &f2() volatile; }; + +// f2 appears four times in the c6 vtables: +// once in c1-in-c3-in-c6 - covariant, virtual base, uses c1 vcall offset and c0 vbase offset +// { dg-final { scan-tree-dump "24 c6::_ZTcv0_n16_v0_n12_NV2c62f2Ev" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "48 c6::_ZTcv0_n32_v0_n24_NV2c62f2Ev" "class" { target lp64 } } } +// once in c3-in-c6 - non-covariant, non-virtual base, calls f2 directly +// { dg-final { scan-tree-dump "28 c6::f2" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "56 c6::f2" "class" { target lp64 } } } +// once in c1-in-c3-in-c4-in-c6 - lost primary +// { dg-final { scan-tree-dump "80 0u" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "160 0u" "class" { target lp64 } } } +// once in c3-in-c4-in-c6 - c3 vcall offset +// { dg-final { scan-tree-dump "84 c6::_ZTv0_n16_NV2c62f2Ev" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "168 c6::_ZTv0_n32_NV2c62f2Ev" "class" { target lp64 } } } + +// { dg-final { cleanup-tree-dump "class" } } diff --git a/gcc/testsuite/g++.dg/lto/20100721-1_0.C b/gcc/testsuite/g++.dg/lto/20100721-1_0.C new file mode 100644 index 00000000000..09132e5992b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100721-1_0.C @@ -0,0 +1,9 @@ +/* { dg-lto-do assemble } */ + +static inline int __gthread_active_p (void) { } +template <int rank, int dim> class Tensor; +template <int dimension> struct G; +template <int dim> class T { + typedef void A; + typedef Tensor<1,dim> F[G<dim>::v]; +}; diff --git a/gcc/testsuite/g++.dg/lto/20100722-1_0.C b/gcc/testsuite/g++.dg/lto/20100722-1_0.C new file mode 100644 index 00000000000..72393950d03 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100722-1_0.C @@ -0,0 +1,5 @@ +/* { dg-lto-do assemble } */ + +template <class T> void void_cast_register(T *) __attribute__ ((used)); +template <class T> void void_cast_register(T *) { } + diff --git a/gcc/testsuite/g++.dg/opt/nrv16.C b/gcc/testsuite/g++.dg/opt/nrv16.C new file mode 100644 index 00000000000..7b24d4a4ee0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv16.C @@ -0,0 +1,16 @@ +// PR c++/44808 +// { dg-do compile } + +struct S +{ + void *a, *b; + int c; +}; + +S +foo () +{ + S x; + S y = x; + return x; +} diff --git a/gcc/testsuite/g++.dg/other/i386-1.C b/gcc/testsuite/g++.dg/other/i386-1.C index 5a91e603660..ec572ec948d 100644 --- a/gcc/testsuite/g++.dg/other/i386-1.C +++ b/gcc/testsuite/g++.dg/other/i386-1.C @@ -1,11 +1,9 @@ /* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ #include <xmmintrin.h> -#include "cpuid.h" - static void sse2_test (void) { @@ -25,14 +23,6 @@ sse2_test (void) int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - sse2_test (); - + sse2_test (); return 0; } diff --git a/gcc/testsuite/g++.dg/other/i386-2.C b/gcc/testsuite/g++.dg/other/i386-2.C index 952fa14c364..729706852e2 100644 --- a/gcc/testsuite/g++.dg/other/i386-2.C +++ b/gcc/testsuite/g++.dg/other/i386-2.C @@ -1,5 +1,5 @@ /* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-O -pedantic-errors -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ +/* { dg-options "-O -pedantic-errors -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, xopintrin.h, abmintrin.h, lwpintrin.h, popcntintrin.h and mm3dnow.h are usable with diff --git a/gcc/testsuite/g++.dg/other/i386-3.C b/gcc/testsuite/g++.dg/other/i386-3.C index 88dd7693891..75515efb42b 100644 --- a/gcc/testsuite/g++.dg/other/i386-3.C +++ b/gcc/testsuite/g++.dg/other/i386-3.C @@ -1,5 +1,5 @@ /* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-O -fkeep-inline-functions -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ +/* { dg-options "-O -fkeep-inline-functions -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, xopintrin.h, abmintrin.h, lwpintrin.h, popcntintrin.h and mm3dnow.h are usable with diff --git a/gcc/testsuite/g++.dg/other/mmintrin.C b/gcc/testsuite/g++.dg/other/mmintrin.C index 417a1acc6de..8315f93d355 100644 --- a/gcc/testsuite/g++.dg/other/mmintrin.C +++ b/gcc/testsuite/g++.dg/other/mmintrin.C @@ -1,4 +1,5 @@ // { dg-do compile { target i?86-*-* x86_64-*-* } } // { dg-options "-msse" } +// { dg-require-effective-target sse } #include <xmmintrin.h> diff --git a/gcc/testsuite/g++.dg/other/pr25632.C b/gcc/testsuite/g++.dg/other/pr25632.C index fe0ad7a2497..e66ae3b51ec 100644 --- a/gcc/testsuite/g++.dg/other/pr25632.C +++ b/gcc/testsuite/g++.dg/other/pr25632.C @@ -2,14 +2,12 @@ /* { dg-do compile } */ -#define unsigned -__extension__ typedef __SIZE_TYPE__ ssize_t; -#undef unsigned +__extension__ typedef __INTPTR_TYPE__ intptr_t; struct sockaddr_un { char sun_path[1]; }; -const unsigned SI_SUN_HEAD_LEN = (ssize_t)(((struct sockaddr_un *)0)->sun_path); +const unsigned SI_SUN_HEAD_LEN = (intptr_t)(((struct sockaddr_un *)0)->sun_path); int SiGetPeerName () { return SI_SUN_HEAD_LEN; diff --git a/gcc/testsuite/g++.dg/other/pr40446.C b/gcc/testsuite/g++.dg/other/pr40446.C index dd0aa482075..72cd1960649 100644 --- a/gcc/testsuite/g++.dg/other/pr40446.C +++ b/gcc/testsuite/g++.dg/other/pr40446.C @@ -1,10 +1,9 @@ // PR middle-end/40446 // { dg-do run { target i?86-*-* x86_64-*-* } } // { dg-options "-O1 -msse2" } -// { dg-require-effective-target sse2 } +// { dg-require-effective-target sse2_runtime } #include <emmintrin.h> -#include "cpuid.h" extern "C" void abort (); @@ -34,14 +33,6 @@ sse2_test () int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - sse2_test (); - + sse2_test (); return 0; } diff --git a/gcc/testsuite/g++.dg/parse/error28.C b/gcc/testsuite/g++.dg/parse/error28.C index 7e235a13b21..a0b1e7f690f 100644 --- a/gcc/testsuite/g++.dg/parse/error28.C +++ b/gcc/testsuite/g++.dg/parse/error28.C @@ -3,7 +3,7 @@ struct virt { virt () {} virt (int i) {} }; struct der : public virtual virt { // { dg-message "8:der::der" } - der (int i) : virt(i) {} // { dg-message "3:candidates are: der" } + der (int i) : virt(i) {} // { dg-message "3:der::der" } }; struct top : public der { top () {} // { dg-bogus "der\\(const" } diff --git a/gcc/testsuite/g++.dg/parse/template25.C b/gcc/testsuite/g++.dg/parse/template25.C new file mode 100644 index 00000000000..8ffcd121e18 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template25.C @@ -0,0 +1,14 @@ +// PR c++/22318. Improve diagnostic for local template declaration. +// { dg-do compile } +void f(void) +{ + template<typename T> class A /* { dg-error "a template declaration cannot appear at block scope" } */ + { + }; +} + +void g(void) +{ + template f<int>(); /* { dg-error "expected primary-expression" } */ + /* { dg-error "expected ';'" "" { target *-*-* } 12 } */ +} diff --git a/gcc/testsuite/g++.dg/plugin/attribute_plugin.c b/gcc/testsuite/g++.dg/plugin/attribute_plugin.c index 6327095f7cd..e5b0566837d 100644 --- a/gcc/testsuite/g++.dg/plugin/attribute_plugin.c +++ b/gcc/testsuite/g++.dg/plugin/attribute_plugin.c @@ -10,6 +10,7 @@ #include "intl.h" #include "toplev.h" #include "plugin.h" +#include "diagnostic.h" int plugin_is_GPL_compatible; @@ -43,7 +44,7 @@ handle_pre_generic (void *event_data, void *data) { tree fndecl = (tree) event_data; tree arg; - for (arg = DECL_ARGUMENTS(fndecl); arg; arg = TREE_CHAIN (arg)) { + for (arg = DECL_ARGUMENTS(fndecl); arg; arg = DECL_CHAIN (arg)) { tree attr; for (attr = DECL_ATTRIBUTES (arg); attr; attr = TREE_CHAIN (attr)) { tree attrname = TREE_PURPOSE (attr); diff --git a/gcc/testsuite/g++.dg/plugin/dumb_plugin.c b/gcc/testsuite/g++.dg/plugin/dumb_plugin.c index f12a6a0d35b..5bbd5d790fe 100644 --- a/gcc/testsuite/g++.dg/plugin/dumb_plugin.c +++ b/gcc/testsuite/g++.dg/plugin/dumb_plugin.c @@ -10,6 +10,7 @@ #include "tree-pass.h" #include "intl.h" #include "toplev.h" +#include "diagnostic.h" int plugin_is_GPL_compatible; diff --git a/gcc/testsuite/g++.dg/plugin/pragma_plugin.c b/gcc/testsuite/g++.dg/plugin/pragma_plugin.c index 4a9ea47195d..940c302df7d 100644 --- a/gcc/testsuite/g++.dg/plugin/pragma_plugin.c +++ b/gcc/testsuite/g++.dg/plugin/pragma_plugin.c @@ -14,6 +14,7 @@ #include "tree-pass.h" #include "intl.h" #include "toplev.h" +#include "diagnostic.h" int plugin_is_GPL_compatible; diff --git a/gcc/testsuite/g++.dg/plugin/selfassign.c b/gcc/testsuite/g++.dg/plugin/selfassign.c index df42abd27df..84d2801d202 100644 --- a/gcc/testsuite/g++.dg/plugin/selfassign.c +++ b/gcc/testsuite/g++.dg/plugin/selfassign.c @@ -14,6 +14,7 @@ #include "tree-pass.h" #include "intl.h" #include "plugin-version.h" +#include "diagnostic.h" int plugin_is_GPL_compatible; @@ -52,9 +53,7 @@ get_real_ref_rhs (tree expr) /* We are only interested in an assignment with a single rhs operand because if it is not, the original assignment will not possibly be a self-assignment. */ - if (is_gimple_assign (def_stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (def_stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (def_stmt)) return get_real_ref_rhs (gimple_assign_rhs1 (def_stmt)); else return NULL_TREE; @@ -66,7 +65,7 @@ get_real_ref_rhs (tree expr) case PARM_DECL: case FIELD_DECL: case COMPONENT_REF: - case INDIRECT_REF: + case MEM_REF: case ARRAY_REF: return expr; default: @@ -116,17 +115,18 @@ get_non_ssa_expr (tree expr) else return expr; } - case INDIRECT_REF: + case MEM_REF: { tree orig_base = TREE_OPERAND (expr, 0); - tree base = get_non_ssa_expr (orig_base); - if (!base) - return NULL_TREE; - /* If BASE is converted, build a new indirect reference tree. */ - if (base != orig_base) - return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (base)), base); - else - return expr; + if (TREE_CODE (orig_base) == SSA_NAME) + { + tree base = get_non_ssa_expr (orig_base); + if (!base) + return NULL_TREE; + return fold_build2 (MEM_REF, TREE_TYPE (expr), + base, TREE_OPERAND (expr, 1)); + } + return expr; } case ARRAY_REF: { @@ -153,9 +153,7 @@ get_non_ssa_expr (tree expr) && !gimple_nop_p (SSA_NAME_DEF_STMT (expr))) { gimple def_stmt = SSA_NAME_DEF_STMT (expr); - if (is_gimple_assign (def_stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (def_stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (def_stmt)) vdecl = gimple_assign_rhs1 (def_stmt); } return get_non_ssa_expr (vdecl); @@ -201,9 +199,7 @@ warn_self_assign (gimple stmt) tree rhs, lhs; /* Check assigment statement. */ - if (is_gimple_assign (stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (stmt)) { rhs = get_real_ref_rhs (gimple_assign_rhs1 (stmt)); if (!rhs) diff --git a/gcc/testsuite/g++.dg/template/crash100.C b/gcc/testsuite/g++.dg/template/crash100.C new file mode 100644 index 00000000000..c67ae2eca38 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash100.C @@ -0,0 +1,24 @@ +// PR c++/44628 + +template <typename T> +class Temp +{ + int Val; + public: + operator T&(void) { return Val; } + + virtual T& operator=(T a ) // { dg-error "overriding" } + { + Val = a; + return Val; + } +}; + +class Int : public Temp<int> +{ + public: + Int& operator=(int a) // { dg-error "conflicting return type" } + { + return (*this); + } +}; diff --git a/gcc/testsuite/g++.dg/template/crash101.C b/gcc/testsuite/g++.dg/template/crash101.C new file mode 100644 index 00000000000..c59737a8938 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash101.C @@ -0,0 +1,12 @@ +// PR c++/44039 + +struct locale { }; + +template<class charT> + void + foo() + { locale::locale(); } // { dg-error "cannot call|function-style" } + +void +bar() +{ foo<char>(); } diff --git a/gcc/testsuite/g++.dg/template/dtor7.C b/gcc/testsuite/g++.dg/template/dtor7.C index e96f56397eb..186b561e9c3 100644 --- a/gcc/testsuite/g++.dg/template/dtor7.C +++ b/gcc/testsuite/g++.dg/template/dtor7.C @@ -1,5 +1,5 @@ // PR c++/40373 -// { dg-compile } +// { dg-do compile } struct A; namespace diff --git a/gcc/testsuite/g++.dg/template/partial8.C b/gcc/testsuite/g++.dg/template/partial8.C new file mode 100644 index 00000000000..4db7e18689e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial8.C @@ -0,0 +1,4 @@ +// PR c++/32505 +template <class T> struct A { }; +A<int*> a; +template <class T> struct A<T*> { }; // { dg-error "A<int\\*>" } diff --git a/gcc/testsuite/g++.dg/template/ptrmem17.C b/gcc/testsuite/g++.dg/template/ptrmem17.C index a79e3c882fa..5c5ee3fc30e 100644 --- a/gcc/testsuite/g++.dg/template/ptrmem17.C +++ b/gcc/testsuite/g++.dg/template/ptrmem17.C @@ -7,4 +7,4 @@ template<int> struct A ~A() { &A::i; } // { dg-error "reference" } }; -A<0> a; // { dg-message "instantiated" } +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/ptrmem22.C b/gcc/testsuite/g++.dg/template/ptrmem22.C new file mode 100644 index 00000000000..762f377f5b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem22.C @@ -0,0 +1,29 @@ +// PR c++/44778 + +enum Healpix_Ordering_Scheme { RING, NEST }; + +class Healpix_Base + { + protected: + Healpix_Ordering_Scheme scheme_; + int nest2ring (int pix) const; + int ring2nest (int pix) const; + + typedef int (Healpix_Base::*swapfunc)(int pix) const; + }; + +template<typename T> class Healpix_Map: public Healpix_Base + { + public: + void Import_nograde (const Healpix_Map<T> &orig) + { + swapfunc swapper = (scheme_ == NEST) ? + &Healpix_Map::ring2nest : &Healpix_Map::nest2ring; + } + }; + +int main() + { + Healpix_Map<double> a,b; + a.Import_nograde(b); + } diff --git a/gcc/testsuite/g++.dg/template/sfinae19.C b/gcc/testsuite/g++.dg/template/sfinae19.C new file mode 100644 index 00000000000..59be183feb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae19.C @@ -0,0 +1,44 @@ +// PR c++/44907 + +struct A { }; + +struct B +: public A { }; + +struct C +: public A { }; + +struct D +: public B, public C { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static typename + enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +int Test1[mini_is_convertible<D*, A*>::value ? -1 : 1]; +int Test2[mini_is_convertible<A*, D*>::value ? -1 : 1]; +int Test3[mini_is_convertible<D, A>::value ? -1 : 1]; +int Test4[mini_is_convertible<A, D>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae20.C b/gcc/testsuite/g++.dg/template/sfinae20.C new file mode 100644 index 00000000000..9767bc02984 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae20.C @@ -0,0 +1,45 @@ +// PR c++/44907 +// { dg-options "-std=c++0x" } + +#include <utility> + +struct A { }; + +struct B +: public A { }; + +struct C +: public A { }; + +struct D +: public B, public C { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static decltype(test_aux<To1>(std::declval<From1>()), one()) + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +static_assert (!mini_is_convertible<D*, A*>::value, ""); +static_assert (!mini_is_convertible<A*, D*>::value, ""); +static_assert (!mini_is_convertible<D&, A&>::value, ""); +static_assert (!mini_is_convertible<A&, D&>::value, ""); +static_assert (!mini_is_convertible<D, A>::value, ""); +static_assert (!mini_is_convertible<A, D>::value, ""); diff --git a/gcc/testsuite/g++.dg/template/sfinae21.C b/gcc/testsuite/g++.dg/template/sfinae21.C new file mode 100644 index 00000000000..6086f2f9e7d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae21.C @@ -0,0 +1,40 @@ +// PR c++/44908 + +struct A { }; + +struct B +: public virtual A { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static typename + enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +int Test1[mini_is_convertible<int (B::*) (int), + int (A::*) (int)>::value ? -1 : 1]; +int Test2[mini_is_convertible<int (B::*), int (A::*)>::value ? -1 : 1]; +int Test3[mini_is_convertible<int (A::*) (int), + int (B::*) (int)>::value ? -1 : 1]; +int Test4[mini_is_convertible<int (A::*), int (B::*)>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae22.C b/gcc/testsuite/g++.dg/template/sfinae22.C new file mode 100644 index 00000000000..cdac99d91b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae22.C @@ -0,0 +1,39 @@ +// PR c++/44908 +// { dg-options "-std=c++0x" } + +#include <utility> + +struct A { }; + +struct B +: public virtual A { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static decltype(test_aux<To1>(std::declval<From1>()), one()) + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +static_assert (!mini_is_convertible<int (B::*) (int), + int (A::*) (int)>::value, ""); +static_assert (!mini_is_convertible<int (B::*), int (A::*)>::value, ""); +static_assert (!mini_is_convertible<int (A::*) (int), + int (B::*) (int)>::value, ""); +static_assert (!mini_is_convertible<int (A::*), int (B::*)>::value, ""); diff --git a/gcc/testsuite/g++.dg/template/sfinae23.C b/gcc/testsuite/g++.dg/template/sfinae23.C new file mode 100644 index 00000000000..9e0197a7050 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae23.C @@ -0,0 +1,23 @@ +// PR c++/44969 +// { dg-options "-std=c++0x" } + +template<typename Tp, typename... Args> + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename Tp1, typename... Args1> + static decltype(Tp1(Args1()...), one()) + test(int); + + template<typename, typename...> + static two test(...); + + public: + static const bool value = sizeof(test<Tp, Args...>(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible<int, A, A>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae24.C b/gcc/testsuite/g++.dg/template/sfinae24.C new file mode 100644 index 00000000000..7138c96e66f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae24.C @@ -0,0 +1,26 @@ +// PR c++/44969 + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename Tp, typename Arg1, typename Arg2> + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename Tp1, typename Arg1_, typename Arg2_> + static typename + enable_if<(sizeof(Tp1(Arg1_(), Arg2_()), 1) > 0), one>::type + test(int); + + template<typename, typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<Tp, Arg1, Arg2>(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible<int, A, A>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/warn1.C b/gcc/testsuite/g++.dg/template/warn1.C index 0cdffcd3c51..2b804f7ca8f 100644 --- a/gcc/testsuite/g++.dg/template/warn1.C +++ b/gcc/testsuite/g++.dg/template/warn1.C @@ -9,8 +9,8 @@ template <class T> void Foo(T i) { i++, i++; - i, i++; // { dg-warning "left-hand operand" "" } - i++, i; // { dg-warning "right-hand operand" "" } + i, i++; // { dg-warning "left operand" "" } + i++, i; // { dg-warning "right operand" "" } for (;; --i, ++i) ; } diff --git a/gcc/testsuite/g++.dg/tls/static-1.C b/gcc/testsuite/g++.dg/tls/static-1.C index 027a9429766..506b0fcf7a0 100644 --- a/gcc/testsuite/g++.dg/tls/static-1.C +++ b/gcc/testsuite/g++.dg/tls/static-1.C @@ -1,6 +1,7 @@ // { dg-do run } // { dg-options "-O2" } // { dg-require-effective-target tls_runtime } +// { dg-add-options tls } // { dg-additional-sources "static-1a.cc" } extern "C" void abort (); diff --git a/gcc/testsuite/g++.dg/tls/static-1a.cc b/gcc/testsuite/g++.dg/tls/static-1a.cc index 47a7a2717c0..1c6109f861e 100644 --- a/gcc/testsuite/g++.dg/tls/static-1a.cc +++ b/gcc/testsuite/g++.dg/tls/static-1a.cc @@ -1,6 +1,7 @@ // { dg-do run } // { dg-options "-O2" } // { dg-require-effective-target tls_runtime } +// { dg-add-options tls } // { dg-additional-sources "static-1a.cc" } struct A diff --git a/gcc/testsuite/g++.dg/torture/20100702-1.C b/gcc/testsuite/g++.dg/torture/20100702-1.C new file mode 100644 index 00000000000..3d223fffb48 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20100702-1.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// { dg-options "-fprefetch-loop-arrays -w" } + +class ggPoint3 { +public: + ggPoint3(); + inline double &x() { + return e[0]; + } + inline double &y() { + return e[1]; + } + ggPoint3(const ggPoint3 &p); + double e[3]; +}; +class ggBox3 { +public: + ggPoint3 min() const; +}; +class ggHAffineMatrix3; +ggPoint3 operator*(const ggHAffineMatrix3 &m, const ggPoint3 &v); +void foo (ggPoint3 *); +void SetMatrix(ggHAffineMatrix3& toworld, ggBox3& box) +{ + ggPoint3 p[2][2][2]; + int i, j, k; + for (i = 0; i < 2; j++) + for (k = 0; k < 2; k++) + { + if (i == 0) + p[i][j][k].x() = box.min().x(); + if (j == 0) + p[i][j][k].y() = box.min().y(); + p[i][j][k] = toworld * p[i][j][k]; + } + foo (&p[0][0][0]); +} diff --git a/gcc/testsuite/g++.dg/torture/pr36745.C b/gcc/testsuite/g++.dg/torture/pr36745.C index 86047f1f0d8..53845aaa78e 100644 --- a/gcc/testsuite/g++.dg/torture/pr36745.C +++ b/gcc/testsuite/g++.dg/torture/pr36745.C @@ -52,6 +52,7 @@ public: inline QMap ():d (&QMapData::shared_null) }; struct QVectorData { + QBasicAtomicInt ref; static QVectorData shared_null; }; template < typename T > struct QVectorTypedData diff --git a/gcc/testsuite/g++.dg/torture/pr36960.C b/gcc/testsuite/g++.dg/torture/pr36960.C new file mode 100644 index 00000000000..280a6755d95 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36960.C @@ -0,0 +1,22 @@ +// { dg-do run } + +struct Lower { + const int& ref; + Lower(const int& ref) : ref(ref) { } +}; +struct Middle : public virtual Lower { + Middle(const int& ref) : Lower(ref) { } +}; +struct Upper : public Middle { + Upper(const int& ref) : Lower(ref), Middle(ref) { } + int get() { return ref; } +}; +extern "C" void abort (void); +int main() +{ + int i = 0; + Upper upper(i); + if (upper.get() != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr44809.C b/gcc/testsuite/g++.dg/torture/pr44809.C new file mode 100644 index 00000000000..b6615f23f1c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44809.C @@ -0,0 +1,6 @@ +// { dg-do compile } +unsigned int mEvictionRank[(1 << 5)]; +void Unswap(int i) +{ + mEvictionRank[i] = ({ unsigned int __v = i; __v; }); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44813.C b/gcc/testsuite/g++.dg/torture/pr44813.C new file mode 100644 index 00000000000..1dc01b06a17 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44813.C @@ -0,0 +1,60 @@ +typedef unsigned int PRUint32; +typedef int PRInt32; +typedef unsigned long PRUint64; +typedef int PRIntn; +typedef PRIntn PRBool; +struct nsRect { + nsRect(const nsRect& aRect) { } +}; +enum nsCompatibility { eCompatibility_NavQuirks = 3 }; +class gfxContext; +typedef PRUint64 nsFrameState; +class nsPresContext { +public: + nsCompatibility CompatibilityMode() const { } +}; +class nsStyleContext { +public: + PRBool HasTextDecorations() const; +}; +class nsIFrame { +public: + nsPresContext* PresContext() const; + nsStyleContext* GetStyleContext() const; + nsFrameState GetStateBits() const; + nsRect GetOverflowRect() const; +}; +class nsFrame : public nsIFrame { }; +class nsLineList_iterator { }; +class nsLineList { +public: + typedef nsLineList_iterator iterator; +}; +class gfxSkipCharsIterator { }; +class gfxTextRun { +public: + class PropertyProvider { }; +}; +class nsTextFrame : public nsFrame +{ + virtual nsRect ComputeTightBounds(gfxContext* aContext) const; + gfxSkipCharsIterator EnsureTextRun(gfxContext* aReferenceContext = 0L, + nsIFrame* aLineContainer = 0L, + const nsLineList::iterator* aLine = 0L, + PRUint32* aFlowEndInTextRun = 0L); +}; +class PropertyProvider : public gfxTextRun::PropertyProvider +{ +public: + PropertyProvider(nsTextFrame* aFrame, const gfxSkipCharsIterator& aStart); + PRInt32 mLength[64]; +}; +nsRect nsTextFrame::ComputeTightBounds(gfxContext* aContext) const +{ + if ((GetStyleContext()->HasTextDecorations() + && eCompatibility_NavQuirks == PresContext()->CompatibilityMode()) + || (GetStateBits() & (nsFrameState(1) << (23)))) + return GetOverflowRect(); + gfxSkipCharsIterator iter = const_cast<nsTextFrame*>(this)->EnsureTextRun(); + PropertyProvider provider(const_cast<nsTextFrame*>(this), iter); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44826.C b/gcc/testsuite/g++.dg/torture/pr44826.C new file mode 100644 index 00000000000..aece1407070 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44826.C @@ -0,0 +1,44 @@ +typedef unsigned short PRUint16; +typedef PRUint16 PRUnichar; +template <class CharT> struct nsCharTraits { +}; +class nsAString_internal { +public: + typedef PRUnichar char_type; +}; +class nsString : public nsAString_internal { +public: + typedef nsString self_type; + nsString( const self_type& str ); +}; +class nsDependentString : public nsString { +public: + explicit nsDependentString( const char_type* data ); +}; +typedef struct sqlite3_stmt sqlite3_stmt; +const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +class nsIVariant { }; +template <typename DataType> struct variant_storage_traits { + typedef DataType ConstructorType; + typedef DataType StorageType; + static inline StorageType storage_conversion(ConstructorType aData) { + return aData; + } +}; +template <typename DataType> class Variant : public nsIVariant { +public: + Variant(typename variant_storage_traits<DataType>::ConstructorType aData) + : mData(variant_storage_traits<DataType>::storage_conversion(aData)) {} + typename variant_storage_traits<DataType>::StorageType mData; +}; +typedef Variant<nsString> TextVariant; +class Row { + void initialize(sqlite3_stmt *aStatement); +}; +void Row::initialize(sqlite3_stmt *aStatement) +{ + nsDependentString str(static_cast<const PRUnichar +*>(::sqlite3_column_text16(aStatement, 0))); + new TextVariant(str); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr44900.C b/gcc/testsuite/g++.dg/torture/pr44900.C new file mode 100644 index 00000000000..5c0efcb4b4e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44900.C @@ -0,0 +1,76 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-msse" } */ +/* { dg-require-effective-target sse } */ + +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef float __v4sf __attribute__ ((__vector_size__ (16))); + +extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, +__artificial__)) +_mm_set_ps (const float __Z, const float __Y, const float __X, const float __W) +{ + return __extension__ (__m128)(__v4sf){ __W, __X, __Y, __Z }; +} + +struct vec +{ + union { + __m128 v; + float e[4]; + }; + + static const vec & zero() + { + static const vec v = _mm_set_ps(0, 0, 0, 0); + return v; + } + + vec() {} + vec(const __m128 & a) : v(a) {} + + operator const __m128&() const { return v; } +}; + +struct vec2 +{ + vec _v1; + vec _v2; + + vec2() {} + vec2(const vec & a, const vec & b) : _v1(a), _v2(b) {} + + static vec2 load(const float * a) + { + return vec2( + __builtin_ia32_loadups(&a[0]), + __builtin_ia32_loadups(&a[4])); + } + + const vec & v1() const { return _v1; } + const vec & v2() const { return _v2; } +}; + +extern "C" void abort(void); + + +inline bool operator==(const vec & a, const vec & b) +{ return 0xf == __builtin_ia32_movmskps(__builtin_ia32_cmpeqps(a, b)); } + +int main( int argc, char * argv[] ) +{ + __attribute__((aligned(16))) float data[] = + { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5 }; + + float * p = &data[2]; + vec2 a; + + a = vec2::load(p); + + vec v1 = a.v1(); + vec v2 = a.v2(); + + if (v2.e[3] != 7.0) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr44915.C b/gcc/testsuite/g++.dg/torture/pr44915.C new file mode 100644 index 00000000000..ba7e9660622 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44915.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-findirect-inlining" } */ + +struct A; + +typedef void (A::*f_ptr) (); + +void dummy (f_ptr) { } + +void call_dummy (f_ptr cb) +{ + dummy (cb); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C b/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C index 2be04691537..03f6b1207c7 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C +++ b/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C @@ -25,5 +25,7 @@ int foo(Object&o) return o[0]; } -/* { dg-final { scan-tree-dump-not ".* = \[^>;\]*;" "dce2" } } */ +/* Remaining should be two loads. */ + +/* { dg-final { scan-tree-dump-times " = \[^\n\]*;" 2 "dce2" } } */ /* { dg-final { cleanup-tree-dump "dce2" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19952.C b/gcc/testsuite/g++.dg/tree-ssa/pr19952.C index 92d669c1415..54589a294cc 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/pr19952.C +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19952.C @@ -1,5 +1,5 @@ /* PR 19952 */ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-options "-ftree-vectorize -O2" } */ int i; diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr31146.C b/gcc/testsuite/g++.dg/tree-ssa/pr31146.C index 96790239693..478a488e3c2 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/pr31146.C +++ b/gcc/testsuite/g++.dg/tree-ssa/pr31146.C @@ -12,5 +12,5 @@ void foo (int j) *q = 1; } -/* { dg-final { scan-tree-dump "i\\\[j.*\\\] =.* 1;" "forwprop1" } } */ +/* { dg-final { scan-tree-dump "MEM\\\[.*&i\\\]\\\[j.*\\\] =.* 1;" "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop?" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr33604.C b/gcc/testsuite/g++.dg/tree-ssa/pr33604.C index d78006220ed..7e820d3ef16 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/pr33604.C +++ b/gcc/testsuite/g++.dg/tree-ssa/pr33604.C @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-O -fdump-tree-forwprop1" } */ +/* { dg-options "-O -fdump-tree-optimized-vops" } */ struct Value { @@ -35,12 +35,14 @@ int main(int argc, char *argv[]) return 0; } -/* Check that we forward propagated +/* Check that we propagate D.2182_13 = (struct Ref *) &D.2137.lhs; to D.2182_13->lhs.m ={v} &I; yielding - D.2137.lhs.m ={v} &I; */ + D.2137.lhs.m ={v} &I; + so that SRA can promote all locals to registers and we end up + referencing a single virtual operand at abort () after optimization. */ -/* { dg-final { scan-tree-dump-times "D\\\.....\\\..hs\\\.m =" 2 "forwprop1" } } */ -/* { dg-final { cleanup-tree-dump "forwprop1" } } */ +/* { dg-final { scan-tree-dump-times ".MEM_\[0-9\]*\\\(D\\\)" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr44706.C b/gcc/testsuite/g++.dg/tree-ssa/pr44706.C new file mode 100644 index 00000000000..39904d8b9e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr44706.C @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fnsplit" } */ +class MemoryManager; +class XMLExcepts { +public : + enum Codes { + AttrList_BadIndex + }; +}; +class XMLException { +public: + XMLException(const char* const srcFile, const unsigned int srcLine, +MemoryManager* const memoryManager = 0); +}; +class ArrayIndexOutOfBoundsException : public XMLException { +public: + ArrayIndexOutOfBoundsException(const char* const srcFile , const unsigned +int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = +0) : XMLException(srcFile, srcLine, memoryManager) { + } +}; +class XMLAttDef { + bool fExternalAttribute; +}; +class XMLAttDefList { +public: + MemoryManager* getMemoryManager() const; +}; +class DTDAttDef : public XMLAttDef { +}; +class DTDAttDefList : public XMLAttDefList { + virtual const XMLAttDef &getAttDef(unsigned int index) const ; + DTDAttDef** fArray; + unsigned int fCount; +}; +const XMLAttDef &DTDAttDefList::getAttDef(unsigned int index) const { + if(index >= fCount) + throw ArrayIndexOutOfBoundsException("foo.cpp", 0, +XMLExcepts::AttrList_BadIndex, getMemoryManager()); + return *(fArray[index]); +} + +/* Mistake in branch prediction caused us to split away real body of the function keeping + only throw () invokation. This is bad idea. */ +/* { dg-final { scan-tree-dump-not "Splitting function" "fnsplit"} } */ +/* { dg-final { cleanup-tree-dump "fnsplit" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr44914.C b/gcc/testsuite/g++.dg/tree-ssa/pr44914.C new file mode 100644 index 00000000000..57ca7e83f17 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr44914.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fipa-sra -fnon-call-exceptions" } */ + +struct A +{ + ~A () { } +}; + +struct B +{ + A a; + int i; + void f (int) { } + B () + { + f (i); + } +}; + +B b; diff --git a/gcc/testsuite/g++.dg/vect/pr44861.cc b/gcc/testsuite/g++.dg/vect/pr44861.cc new file mode 100644 index 00000000000..07c59a1382d --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr44861.cc @@ -0,0 +1,34 @@ +// { dg-do compile } + +bool f(); + +struct counted_base { + virtual void destroy() { } + void release() { if (f()) destroy(); } +}; + +struct shared_count { + shared_count() { } + ~shared_count() { if (pi) pi->release(); } + shared_count(shared_count& r) : pi(r.pi) { if (pi) pi->release(); } + counted_base* pi; +}; + +struct Foo; + +struct shared_ptr { + Foo& operator*() { return *ptr; } + Foo* ptr; + shared_count refcount; +}; + +struct Bar { + Bar(Foo&, shared_ptr); +}; + +void g() { + shared_ptr foo; + new Bar(*foo, foo); +} + +// { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc/testsuite/g++.dg/vect/vect.exp b/gcc/testsuite/g++.dg/vect/vect.exp index aa450661107..fe173429a76 100644 --- a/gcc/testsuite/g++.dg/vect/vect.exp +++ b/gcc/testsuite/g++.dg/vect/vect.exp @@ -75,11 +75,8 @@ if [istarget "powerpc-*paired*"] { } elseif { [istarget "spu-*-*"] } { set dg-do-what-default run } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { - if { ![check_effective_target_sse2] } then { - return - } lappend DEFAULT_VECTCFLAGS "-msse2" - if [check_sse2_hw_available] { + if { [check_effective_target_sse2_runtime] } { set dg-do-what-default run } else { set dg-do-what-default compile diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-7.C b/gcc/testsuite/g++.dg/warn/Wshadow-7.C new file mode 100644 index 00000000000..5de952ee790 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-7.C @@ -0,0 +1,37 @@ +// PR c++/44128 +// { dg-options "-Wshadow" } + +typedef long My_ssize_t; // { dg-warning "shadowed declaration" } +typedef int Foo; // { dg-warning "shadowed declaration" } +struct Bar1 { // { dg-bogus "shadowed declaration" } + int a; +}; +struct Bar2 { // { dg-warning "shadowed declaration" } + int a; +}; + +void func() { + typedef int My_ssize_t; // { dg-warning "shadows a global" } + typedef char My_Num; // { dg-warning "shadowed declaration" } + { + typedef short My_Num; // { dg-warning "shadows a previous local" } + } + int Foo; // { dg-warning "shadows a global" } + float Bar1; // { dg-bogus "shadows a global" } + struct Bar2 { // { dg-warning "shadows a global" } + int a; + }; + struct Bar3 { // { dg-warning "shadowed declaration" } + int a; + }; + struct Bar4 { // { dg-bogus "shadowed declaration" } + int a; + }; + { + struct Bar3 { // { dg-warning "shadows a previous local" } + int a; + }; + char Bar4; // { dg-bogus "shadows a previous local" } + int My_Num; // { dg-warning "shadows a previous local" } + } +} diff --git a/gcc/testsuite/g++.dg/warn/noeffect2.C b/gcc/testsuite/g++.dg/warn/noeffect2.C index 01323659597..451e0382a86 100644 --- a/gcc/testsuite/g++.dg/warn/noeffect2.C +++ b/gcc/testsuite/g++.dg/warn/noeffect2.C @@ -10,11 +10,11 @@ extern "C" void FormatDisk(); template <class T> struct C { - C(){ FormatDisk(), 0; } // { dg-warning "right-hand operand of comma" "" } + C(){ FormatDisk(), 0; } // { dg-warning "right operand of comma" "" } }; template struct C<int>; // { dg-message "instantiated" } template <class T> - void f() { FormatDisk(), 0; } // { dg-warning "right-hand operand of comma" "" } + void f() { FormatDisk(), 0; } // { dg-warning "right operand of comma" "" } template void f<int> (); // { dg-message "instantiated" } -void g() { FormatDisk(), 0; } // { dg-warning "right-hand operand of comma" "" } +void g() { FormatDisk(), 0; } // { dg-warning "right operand of comma" "" } diff --git a/gcc/testsuite/g++.dg/warn/volatile1.C b/gcc/testsuite/g++.dg/warn/volatile1.C index 5b1050f9a1c..ac9dd4df354 100644 --- a/gcc/testsuite/g++.dg/warn/volatile1.C +++ b/gcc/testsuite/g++.dg/warn/volatile1.C @@ -8,5 +8,5 @@ struct A }; void A::baz() volatile { - *this; // { dg-warning "will not be accessed" } + *this; // { dg-warning "indirection will not access" } } diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900121_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900121_02.C index cb313667ebd..1a96e8e3b06 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900121_02.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900121_02.C @@ -1,4 +1,6 @@ // { dg-do assemble } +// { dg-prune-output "note" } + // g++ 1.36.1 bug 900121_02 // Assignment of structs is defined as memberwise assignment, diff --git a/gcc/testsuite/g++.old-deja/g++.ext/anon2.C b/gcc/testsuite/g++.old-deja/g++.ext/anon2.C index 6cf16bf2412..5bde08db952 100644 --- a/gcc/testsuite/g++.old-deja/g++.ext/anon2.C +++ b/gcc/testsuite/g++.old-deja/g++.ext/anon2.C @@ -1,5 +1,6 @@ // { dg-do assemble } // { dg-options "" } +// { dg-prune-output "note" } struct S { diff --git a/gcc/testsuite/g++.old-deja/g++.mike/misc6.C b/gcc/testsuite/g++.old-deja/g++.mike/misc6.C index 5fbca65b952..1a07c12b34a 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/misc6.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/misc6.C @@ -1,4 +1,6 @@ // { dg-do assemble } +// { dg-prune-output "note" } + // GROUPS uncaught // Cfront bug A.4 (See Language System Release Notes for the // SPARCompiler C++ version 3.0) diff --git a/gcc/testsuite/gcc.c-torture/compile/20100609-1.c b/gcc/testsuite/gcc.c-torture/compile/20100609-1.c new file mode 100644 index 00000000000..8e1175faa32 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20100609-1.c @@ -0,0 +1,8 @@ +extern unsigned long int strtoul (__const char *__restrict __nptr, char **__restrict __endptr, int __base); +int find_reloads (int i, char *p) +{ + int c; + while ((c = *p++)) + return strtoul (p - 1, &p, 10); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44707.c b/gcc/testsuite/gcc.c-torture/compile/pr44707.c new file mode 100644 index 00000000000..9031f0042c9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44707.c @@ -0,0 +1,14 @@ +extern struct { int a, b, c, d; } v; +extern int w; + +void +foo (void) +{ + int e1 = v.a; + int e2 = w; + int e3 = v.b; + int e4 = v.c; + int e5 = v.d; + __asm__ volatile ("/* %0 %1 %2 %3 %4 */" : : "nro" (e1), "nro" (e2), "nro" (e3), "nro" (e4), "nro" (e5)); +} + diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44784.c b/gcc/testsuite/gcc.c-torture/compile/pr44784.c new file mode 100644 index 00000000000..54d531a3dff --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44784.c @@ -0,0 +1,47 @@ +typedef struct rtx_def *rtx; +enum rtx_code { SUBREG }; +typedef union rtunion_def { + long rtint; + unsigned long rtuint; + rtx rtx; +} rtunion; +struct rtx_def { + enum rtx_code code: 8; + rtunion fld[1]; +}; +typedef struct simple_bitmap_def { + unsigned long long elms[1]; +} *sbitmap; +struct df_link { + struct df_link *next; + rtx reg; +}; +typedef enum { UNDEFINED, CONSTANT, VARYING } latticevalue; +typedef struct { + latticevalue lattice_val; +} value; +static value *values; +static sbitmap ssa_edges; +void defs_to_varying (struct df_link *start) +{ + struct df_link *currdef; + for (currdef = start; + currdef; + currdef = currdef->next) + { + rtx reg = currdef->reg; + if (values[(reg->code == SUBREG + ? reg->fld[0].rtx + : reg)->fld[0].rtuint].lattice_val != VARYING) + ssa_edges->elms [(reg->code == SUBREG + ? reg->fld[0].rtx + : reg)->fld[0].rtuint / 64] + |= ((unsigned long long) 1 + << (reg->code == SUBREG + ? reg->fld[0].rtx + : reg)->fld[0].rtuint % 64); + values[(reg->code == SUBREG + ? reg->fld[0].rtx + : reg)->fld[0].rtuint].lattice_val = VARYING; + } +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44788.c b/gcc/testsuite/gcc.c-torture/compile/pr44788.c new file mode 100644 index 00000000000..99dc7982394 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44788.c @@ -0,0 +1,8 @@ +void joint_decode(float* mlt_buffer1, int t) { + int i; + float decode_buffer[1060]; + foo(decode_buffer); + for (i=0; i<10 ; i++) { + mlt_buffer1[i] = i * decode_buffer[t]; + } +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44831.c b/gcc/testsuite/gcc.c-torture/compile/pr44831.c new file mode 100644 index 00000000000..5539583deb0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44831.c @@ -0,0 +1,15 @@ +typedef unsigned char UCHAR, *PUCHAR; +typedef void *HANDLE; +typedef struct _NCB { + UCHAR ncb_reserve[10]; +} NCB, *PNCB; +struct NBCmdQueue { + PNCB head; +}; +PNCB *NBCmdQueueFindNBC(struct NBCmdQueue *queue, PNCB ncb) +{ + PNCB *ret = &queue->head; + while (ret && *ret != ncb) + ret = (PNCB *)((*ret)->ncb_reserve + sizeof(HANDLE)); +} + diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44891.c b/gcc/testsuite/gcc.c-torture/compile/pr44891.c new file mode 100644 index 00000000000..145b1446903 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44891.c @@ -0,0 +1,26 @@ +struct S +{ + float f; + long l; +}; + +extern int gi; +extern float gf; + +long foo (long p) +{ + struct S s; + float *pf; + + s.l = p; + + pf = &s.f; + + pf++; + pf--; + + gf = *pf + 3.3; + gi = *((int *)pf) + 2; + + return s.l + 6; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44941.c b/gcc/testsuite/gcc.c-torture/compile/pr44941.c new file mode 100644 index 00000000000..7d9cc8372fc --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44941.c @@ -0,0 +1,8 @@ +struct S { }; + +extern void bar(struct S); + +void foo (int i) +{ + bar (*(struct S *)&i); +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44946.c b/gcc/testsuite/gcc.c-torture/compile/pr44946.c new file mode 100644 index 00000000000..7b230124585 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44946.c @@ -0,0 +1,27 @@ +struct A +{ + int i; + long l; +}; + +struct B +{ + int i; +}; + +struct C +{ + int i; + struct B b; +}; + +struct B foo (struct A a) +{ + struct C *c = (struct C *) &a; + return c->b; +} +void bar (struct A a, struct B b) +{ + struct C *c = (struct C *) &a; + c->b = b; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44988.c b/gcc/testsuite/gcc.c-torture/compile/pr44988.c new file mode 100644 index 00000000000..317eafdf7c8 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr44988.c @@ -0,0 +1,13 @@ +struct S +{ + int i; +}; + +extern void bar (struct S); + +void +foo (void) +{ + int i = 0; + bar (*(struct S *) &i); +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr45047.c b/gcc/testsuite/gcc.c-torture/compile/pr45047.c new file mode 100644 index 00000000000..f37955a0372 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr45047.c @@ -0,0 +1,9 @@ +/* PR tree-optimization/45047 */ + +void +foo (const unsigned short *w, char *x, int y, int z) +{ + int i; + for (i = 0; i < y; i++) + x[i] = w[i] == z; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/20100316-1.c b/gcc/testsuite/gcc.c-torture/execute/20100316-1.c new file mode 100644 index 00000000000..8367d7273d2 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20100316-1.c @@ -0,0 +1,24 @@ +struct Foo { + int i; + unsigned precision : 10; + unsigned blah : 3; +} f; + +int __attribute__((noinline,noclone)) +foo (struct Foo *p) +{ + struct Foo *q = p; + return (*q).precision; +} + +extern void abort (void); + +int main() +{ + f.i = -1; + f.precision = 0; + f.blah = -1; + if (foo (&f) != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/20100416-1.c b/gcc/testsuite/gcc.c-torture/execute/20100416-1.c new file mode 100644 index 00000000000..8b5a6f45e87 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20100416-1.c @@ -0,0 +1,40 @@ +void abort(void); + +int +movegt(int x, int y, long long a) +{ + int i; + int ret = 0; + for (i = 0; i < y; i++) + { + if (a >= (long long) 0xf000000000000000LL) + ret = x; + else + ret = y; + } + return ret; +} + +struct test +{ + long long val; + int ret; +} tests[] = { + { 0xf000000000000000LL, -1 }, + { 0xefffffffffffffffLL, 1 }, + { 0xf000000000000001LL, -1 }, + { 0x0000000000000000LL, -1 }, + { 0x8000000000000000LL, 1 }, +}; + +int +main() +{ + int i; + for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) + { + if (movegt (-1, 1, tests[i].val) != tests[i].ret) + abort (); + } + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/20100708-1.c b/gcc/testsuite/gcc.c-torture/execute/20100708-1.c new file mode 100644 index 00000000000..590a94a70b7 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20100708-1.c @@ -0,0 +1,29 @@ +/* PR middle-end/44843 */ +/* Verify that we don't use the alignment of struct S for inner accesses. */ + +struct S +{ + double for_alignment; + struct { int x, y, z; } a[16]; +}; + +void f(struct S *s) __attribute__((noinline)); + +void f(struct S *s) +{ + unsigned int i; + + for (i = 0; i < 16; ++i) + { + s->a[i].x = 0; + s->a[i].y = 0; + s->a[i].z = 0; + } +} + +int main (void) +{ + struct S s; + f (&s); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr40657.c b/gcc/testsuite/gcc.c-torture/execute/pr40657.c new file mode 100644 index 00000000000..e6d8dda9f99 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr40657.c @@ -0,0 +1,23 @@ +/* Verify that that Thumb-1 epilogue size optimization does not clobber the + return value. */ + +long long v = 0x123456789abc; + +__attribute__((noinline)) void bar (int *x) +{ + asm volatile ("" : "=m" (x) ::); +} + +__attribute__((noinline)) long long foo() +{ + int x; + bar(&x); + return v; +} + +int main () +{ + if (foo () != v) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr44468.c b/gcc/testsuite/gcc.c-torture/execute/pr44468.c new file mode 100644 index 00000000000..c4bd492656d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr44468.c @@ -0,0 +1,60 @@ +#include <stddef.h> + +struct S { + int i; + int j; +}; +struct R { + int k; + struct S a; +}; +struct Q { + float k; + struct S a; +}; +struct Q s; +int __attribute__((noinline,noclone)) +test1 (void *q) +{ + struct S *b = (struct S *)((char *)q + sizeof (int)); + s.a.i = 0; + b->i = 3; + return s.a.i; +} +int __attribute__((noinline,noclone)) +test2 (void *q) +{ + struct S *b = &((struct R *)q)->a; + s.a.i = 0; + b->i = 3; + return s.a.i; +} +int __attribute__((noinline,noclone)) +test3 (void *q) +{ + s.a.i = 0; + ((struct S *)((char *)q + sizeof (int)))->i = 3; + return s.a.i; +} +extern void abort (void); +int +main() +{ + if (sizeof (float) != sizeof (int) + || offsetof (struct R, a) != sizeof (int) + || offsetof (struct Q, a) != sizeof (int)) + return 0; + s.a.i = 1; + s.a.j = 2; + if (test1 ((void *)&s) != 3) + abort (); + s.a.i = 1; + s.a.j = 2; + if (test2 ((void *)&s) != 3) + abort (); + s.a.i = 1; + s.a.j = 2; + if (test3 ((void *)&s) != 3) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr44683.x b/gcc/testsuite/gcc.c-torture/execute/pr44683.x new file mode 100644 index 00000000000..20413409a20 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr44683.x @@ -0,0 +1,6 @@ +if { [istarget "sh*-*-*"] } { + # SH require -mieee for this test. + set additional_flags "-mieee" +} + +return 0 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr44828.c b/gcc/testsuite/gcc.c-torture/execute/pr44828.c new file mode 100644 index 00000000000..93837344b2d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr44828.c @@ -0,0 +1,19 @@ +extern void abort (void); + +static signed char +foo (signed char si1, signed char si2) +{ + return si1 * si2; +} + +int a = 0x105F61CA; + +int +main (void) +{ + int b = 0x0332F5C8; + if (foo (b, a) > 0) + abort (); + return 0; +} + diff --git a/gcc/testsuite/gcc.c-torture/execute/pr44852.c b/gcc/testsuite/gcc.c-torture/execute/pr44852.c new file mode 100644 index 00000000000..440653e5f17 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr44852.c @@ -0,0 +1,22 @@ +__attribute__ ((__noinline__)) +char *sf(char *s, char *s0) +{ + asm (""); + while (*--s == '9') + if (s == s0) + { + *s = '0'; + break; + } + ++*s++; + return s; +} + +int main() +{ + char s[] = "999999"; + char *x = sf (s+2, s); + if (x != s+1 || __builtin_strcmp (s, "199999") != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr44942.c b/gcc/testsuite/gcc.c-torture/execute/pr44942.c new file mode 100644 index 00000000000..3ef0830220d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr44942.c @@ -0,0 +1,70 @@ +/* PR target/44942 */ + +#include <stdarg.h> + +void +test1 (int a, int b, int c, int d, int e, int f, int g, long double h, ...) +{ + int i; + va_list ap; + + va_start (ap, h); + i = va_arg (ap, int); + if (i != 1234) + __builtin_abort (); + va_end (ap); +} + +void +test2 (int a, int b, int c, int d, int e, int f, int g, long double h, int i, + long double j, int k, long double l, int m, long double n, ...) +{ + int o; + va_list ap; + + va_start (ap, n); + o = va_arg (ap, int); + if (o != 1234) + __builtin_abort (); + va_end (ap); +} + +void +test3 (double a, double b, double c, double d, double e, double f, + double g, long double h, ...) +{ + double i; + va_list ap; + + va_start (ap, h); + i = va_arg (ap, double); + if (i != 1234.0) + __builtin_abort (); + va_end (ap); +} + +void +test4 (double a, double b, double c, double d, double e, double f, double g, + long double h, double i, long double j, double k, long double l, + double m, long double n, ...) +{ + double o; + va_list ap; + + va_start (ap, n); + o = va_arg (ap, double); + if (o != 1234.0) + __builtin_abort (); + va_end (ap); +} + +int +main () +{ + test1 (0, 0, 0, 0, 0, 0, 0, 0.0L, 1234); + test2 (0, 0, 0, 0, 0, 0, 0, 0.0L, 0, 0.0L, 0, 0.0L, 0, 0.0L, 1234); + test3 (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0L, 1234.0); + test4 (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0L, 0.0, 0.0L, + 0.0, 0.0L, 0.0, 0.0L, 1234.0); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr45017.c b/gcc/testsuite/gcc.c-torture/execute/pr45017.c new file mode 100644 index 00000000000..37ff286cc72 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr45017.c @@ -0,0 +1,22 @@ +int tester(char *bytes) +{ + union { + struct { + unsigned int r1:4; + unsigned int r2:4; + } fmt; + char value[1]; + } ovl; + + ovl.value[0] = bytes[0]; + return ovl.fmt.r1; +} +extern void abort (void); +int main() +{ + char buff = 0x2f; + if (tester(&buff) != 0x0f) + abort (); + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/Wtrampolines.c b/gcc/testsuite/gcc.dg/Wtrampolines.c new file mode 100644 index 00000000000..dcb36814774 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wtrampolines.c @@ -0,0 +1,57 @@ +/* Origin: trampoline-1.c Waldek Hebisch <hebisch@math.uni.wroc.pl> */ +/* Ported to test -Wtrampolines Magnus Granberg <zorry@gentoo.org> */ + +/* { dg-do compile } */ +/* { dg-require-effective-target trampolines } */ +/* { dg-options "-O2 -Wtrampolines" } */ + +#ifndef NO_TRAMPOLINES + +/* This used to fail on various versions of Solaris 2 because the + trampoline couldn't be made executable. */ + +extern void abort(void); +extern double fabs(double); + +void foo (void) +{ + const int correct[1100] = {1, 0, -2, 0, 1, 0, 1, -1, -10, -30, -67}; + int i; + + double x1 (void) {return 1; } + double x2 (void) {return -1;} + double x3 (void) {return -1;} + double x4 (void) {return 1; } + double x5 (void) {return 0; } + + typedef double pfun(void); + + double a (int k, pfun x1, pfun x2, pfun x3, pfun x4, pfun x5) + { + double b (void) /* { dg-warning "trampoline generated for nested function 'b'" } */ + { + k = k - 1; + return a (k, b, x1, x2, x3, x4 ); + } + + if (k <= 0) + return x4 () + x5 (); + else + return b (); + } + + for (i=0; i<=10; i++) + { + if (fabs(a( i, x1, x2, x3, x4, x5 ) - correct [i]) > 0.1) + abort(); + } +} +#endif + +int main (void) +{ +#ifndef NO_TRAMPOLINES + foo (); +#endif + return 0; +} diff --git a/gcc/testsuite/gcc.dg/attr-weak-hidden-1.c b/gcc/testsuite/gcc.dg/attr-weak-hidden-1.c new file mode 100644 index 00000000000..968bab7ad34 --- /dev/null +++ b/gcc/testsuite/gcc.dg/attr-weak-hidden-1.c @@ -0,0 +1,6 @@ +/* { dg-do run } */ +/* { dg-require-weak "" } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-O2" } */ +/* { dg-additional-sources "attr-weak-hidden-1a.c" } */ +int __attribute__((weak, visibility("hidden"))) foo (void) { return 0; } diff --git a/gcc/testsuite/gcc.dg/attr-weak-hidden-1a.c b/gcc/testsuite/gcc.dg/attr-weak-hidden-1a.c new file mode 100644 index 00000000000..b04d8d251ed --- /dev/null +++ b/gcc/testsuite/gcc.dg/attr-weak-hidden-1a.c @@ -0,0 +1,9 @@ +void abort (void); +int __attribute__((weak, visibility("hidden"))) foo (void) { return 1; } +int +main (void) +{ + if (foo ()) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_main.c b/gcc/testsuite/gcc.dg/compat/pr38736_main.c index 88c3586db4b..8f221083c90 100644 --- a/gcc/testsuite/gcc.dg/compat/pr38736_main.c +++ b/gcc/testsuite/gcc.dg/compat/pr38736_main.c @@ -1,6 +1,6 @@ /* PR target/38736 */ /* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target avx } */ +/* { dg-require-effective-target avx_runtime } */ /* Test compatibility of attribute ((aligned)) with and without -mavx. */ diff --git a/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c b/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c index cfd081db896..59e68d96c7a 100644 --- a/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c +++ b/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c @@ -1,8 +1,6 @@ /* { dg-skip-if "test SSE2 support" { ! { i?86-*-* x86_64-*-* } } } */ /* { dg-options "-O" } */ -/* { dg-require-effective-target sse2 } */ - -#include "cpuid.h" +/* { dg-require-effective-target sse2_runtime } */ /* Test function argument passing. PR target/15301. */ @@ -12,14 +10,6 @@ extern void exit (int); int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE vector test only if host has SSE2 support. */ - if (edx & bit_SSE2) - union_m128_1_x (); - + union_m128_1_x (); exit (0); } diff --git a/gcc/testsuite/gcc.dg/compat/vector-1a_main.c b/gcc/testsuite/gcc.dg/compat/vector-1a_main.c index c5acc35f4d8..608f5dd9b85 100644 --- a/gcc/testsuite/gcc.dg/compat/vector-1a_main.c +++ b/gcc/testsuite/gcc.dg/compat/vector-1a_main.c @@ -1,12 +1,10 @@ /* { dg-skip-if "test SSE2 vector" { ! { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ /* Test compatibility of vector types: layout between separately-compiled modules, parameter passing, and function return. This test uses vectors of integer values. */ -#include "cpuid.h" - extern void vector_1_x (void); extern void exit (int); int fails; @@ -14,14 +12,6 @@ int fails; int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE vector test only if host has SSE2 support. */ - if (edx & bit_SSE2) - vector_1_x (); - + vector_1_x (); exit (0); } diff --git a/gcc/testsuite/gcc.dg/compat/vector-1b_main.c b/gcc/testsuite/gcc.dg/compat/vector-1b_main.c index fb5a5a93d79..427e8caf38b 100644 --- a/gcc/testsuite/gcc.dg/compat/vector-1b_main.c +++ b/gcc/testsuite/gcc.dg/compat/vector-1b_main.c @@ -1,12 +1,10 @@ /* { dg-skip-if "test AVX vector" { ! { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target avx } */ +/* { dg-require-effective-target avx_runtime } */ /* Test compatibility of vector types: layout between separately-compiled modules, parameter passing, and function return. This test uses vectors of integer values. */ -#include "cpuid.h" - extern void vector_1_x (void); extern void exit (int); int fails; @@ -14,14 +12,6 @@ int fails; int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run AVX vector test only if host has AVX support. */ - if (ecx & bit_AVX) - vector_1_x (); - + vector_1_x (); exit (0); } diff --git a/gcc/testsuite/gcc.dg/compat/vector-2a_main.c b/gcc/testsuite/gcc.dg/compat/vector-2a_main.c index 164c4b25e2e..e957faf90d2 100644 --- a/gcc/testsuite/gcc.dg/compat/vector-2a_main.c +++ b/gcc/testsuite/gcc.dg/compat/vector-2a_main.c @@ -1,12 +1,10 @@ /* { dg-skip-if "test SSE2 support" { ! { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ /* Test compatibility of vector types: layout between separately-compiled modules, parameter passing, and function return. This test uses vectors of floating points values. */ -#include "cpuid.h" - extern void vector_2_x (void); extern void exit (int); int fails; @@ -14,14 +12,6 @@ int fails; int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE vector test only if host has SSE2 support. */ - if (edx & bit_SSE2) - vector_2_x (); - + vector_2_x (); exit (0); } diff --git a/gcc/testsuite/gcc.dg/compat/vector-2b_main.c b/gcc/testsuite/gcc.dg/compat/vector-2b_main.c index c5a9300c8ac..2c195764249 100644 --- a/gcc/testsuite/gcc.dg/compat/vector-2b_main.c +++ b/gcc/testsuite/gcc.dg/compat/vector-2b_main.c @@ -1,12 +1,10 @@ /* { dg-skip-if "test AVX support" { ! { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target avx } */ +/* { dg-require-effective-target avx_runtime } */ /* Test compatibility of vector types: layout between separately-compiled modules, parameter passing, and function return. This test uses vectors of floating points values. */ -#include "cpuid.h" - extern void vector_2_x (void); extern void exit (int); int fails; @@ -14,14 +12,6 @@ int fails; int main () { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run AVX vector test only if host has AVX support. */ - if (ecx & bit_AVX) - vector_2_x (); - + vector_2_x (); exit (0); } diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c b/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c index 9d577ea7771..6cbdc85b3d5 100644 --- a/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/const-2b.c @@ -1,5 +1,6 @@ /* { dg-do compile { target i386*-*-* } } */ /* { dg-options "-O -gdwarf-2 -dA -msse" } */ +/* { dg-require-effective-target sse } */ /* { dg-final { scan-assembler "DW_AT_const_value" } } */ typedef float FloatVect __attribute__((__vector_size__(16))); diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr31230.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr31230.c new file mode 100644 index 00000000000..ce26ec639c3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr31230.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-gdwarf-2 -dA --param ggc-min-expand=0 --param ggc-min-heapsize=0" } */ +/* { dg-final { scan-assembler-times "DIE.*DW_TAG_array_type" 1 } } */ +/* { dg-final { scan-assembler-times "DIE.*DW_TAG_subrange_type" 1 } } */ + +void f1 (void) +{ + char buffer1[100]; +} + +int f2 (void) +{ + return 0; +} + +void f3 (void) +{ + char buffer2[100]; +} diff --git a/gcc/testsuite/gcc.dg/float-range-3.c b/gcc/testsuite/gcc.dg/float-range-3.c index e018a1ebc16..32bef98df9d 100644 --- a/gcc/testsuite/gcc.dg/float-range-3.c +++ b/gcc/testsuite/gcc.dg/float-range-3.c @@ -1,5 +1,5 @@ /* PR 23572 : warnings for out of range floating-point constants. */ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-options "-std=c99" } */ /* { dg-skip-if "No Inf support" { spu-*-* } } */ #include <math.h> diff --git a/gcc/testsuite/gcc.dg/float-range-4.c b/gcc/testsuite/gcc.dg/float-range-4.c index fbb820f9b21..a50a47d18c2 100644 --- a/gcc/testsuite/gcc.dg/float-range-4.c +++ b/gcc/testsuite/gcc.dg/float-range-4.c @@ -1,5 +1,5 @@ /* PR 23572 : warnings for out of range floating-point constants. */ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-options "-Wno-overflow -std=c99" } */ /* { dg-skip-if "No Inf support" { spu-*-* } } */ #include <math.h> diff --git a/gcc/testsuite/gcc.dg/float-range-5.c b/gcc/testsuite/gcc.dg/float-range-5.c index 89f00796aec..034f3605898 100644 --- a/gcc/testsuite/gcc.dg/float-range-5.c +++ b/gcc/testsuite/gcc.dg/float-range-5.c @@ -1,6 +1,6 @@ /* PR 23572 : warnings for out of range floating-point constants Test that they are NOT pedantic warnings. */ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-options "-pedantic-errors -std=c99" } */ /* { dg-skip-if "No Inf support" { spu-*-* } } */ #include <math.h> diff --git a/gcc/testsuite/gcc.dg/fold-overflow-1.c b/gcc/testsuite/gcc.dg/fold-overflow-1.c index bd4d25a73ed..8fddc9fc0ee 100644 --- a/gcc/testsuite/gcc.dg/fold-overflow-1.c +++ b/gcc/testsuite/gcc.dg/fold-overflow-1.c @@ -1,4 +1,4 @@ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-skip-if "consts are shorts, not longs" { "m32c-*-*" "avr-*-*" } { "*" } { "" } } */ /* { dg-skip-if "No Inf support" { spu-*-* } } */ /* { dg-options "-O -ftrapping-math" } */ diff --git a/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c b/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c index aa4f6cb5f3d..4b837e50675 100644 --- a/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c +++ b/gcc/testsuite/gcc.dg/format/ms_unnamed-1.c @@ -3,6 +3,7 @@ /* { dg-do compile { target { *-*-mingw* } } } */ /* { dg-options "-Wformat" } */ /* { dg-options "-Wformat -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #define USE_SYSTEM_FORMATS #include "format.h" diff --git a/gcc/testsuite/gcc.dg/format/unnamed-1.c b/gcc/testsuite/gcc.dg/format/unnamed-1.c index 2d4f77cc315..b3efdcbf68f 100644 --- a/gcc/testsuite/gcc.dg/format/unnamed-1.c +++ b/gcc/testsuite/gcc.dg/format/unnamed-1.c @@ -3,6 +3,7 @@ /* { dg-do compile } */ /* { dg-options "-Wformat" } */ /* { dg-options "-Wformat -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #include "format.h" @@ -20,5 +21,5 @@ f (TItype x) { printf("%d", x); /* { dg-warning "expects type" } */ printf("%d", 141592653589793238462643383279502884197169399375105820974944); /* { dg-warning "expects type" } */ - /* { dg-warning "unsigned only|too large" "constant" { target *-*-* } 22 } */ + /* { dg-warning "unsigned only|too large" "constant" { target *-*-* } 23 } */ } diff --git a/gcc/testsuite/gcc.dg/gomp/sections-4.c b/gcc/testsuite/gcc.dg/gomp/sections-4.c index 44e7de98c20..62a2ecddf9a 100644 --- a/gcc/testsuite/gcc.dg/gomp/sections-4.c +++ b/gcc/testsuite/gcc.dg/gomp/sections-4.c @@ -1,5 +1,5 @@ /* PR c++/24613 */ -/* { dg-compile } */ +/* { dg-do compile } */ #pragma omp section /* { dg-error "may only be used in" } */ diff --git a/gcc/testsuite/gcc.dg/graphite/pr40281.c b/gcc/testsuite/gcc.dg/graphite/pr40281.c index a09147a9fb0..437f3434e4b 100644 --- a/gcc/testsuite/gcc.dg/graphite/pr40281.c +++ b/gcc/testsuite/gcc.dg/graphite/pr40281.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O -fprefetch-loop-arrays -w" } */ /* { dg-options "-O -fprefetch-loop-arrays -march=i686 -msse -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ void foo(int); void bar(int n) diff --git a/gcc/testsuite/gcc.dg/guality/asm-1.c b/gcc/testsuite/gcc.dg/guality/asm-1.c new file mode 100644 index 00000000000..5279722c094 --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/asm-1.c @@ -0,0 +1,25 @@ +/* { dg-do run } */ +/* { dg-options "-g" } */ + +struct A { int x; unsigned short y; char z[64]; }; + +void __attribute__((noinline)) +foo (struct A *p, char *q) +{ + int f = &p->z[p->y] - q; + asm volatile ("nop"); + asm volatile ("nop" : : "g" (f)); /* { dg-final { gdb-test 12 "f" "14" } } */ + asm volatile ("" : : "g" (p), "g" (q)); +} + +int +main () +{ + struct A a; + __builtin_memset (&a, 0, sizeof a); + a.y = 26; + a.x = 12; + asm volatile ("" : : "r" (&a) : "memory"); + foo (&a, &a.z[a.x]); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/guality/guality.exp b/gcc/testsuite/gcc.dg/guality/guality.exp index d4ee6864ba4..49e2ac5a550 100644 --- a/gcc/testsuite/gcc.dg/guality/guality.exp +++ b/gcc/testsuite/gcc.dg/guality/guality.exp @@ -43,6 +43,7 @@ if {[check_guality " } "]} { gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" + gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "-Wc++-compat" } if [info exists guality_gdb_name] { diff --git a/gcc/testsuite/gcc.dg/guality/guality.h b/gcc/testsuite/gcc.dg/guality/guality.h index e744d0d72ee..f6c662ce8f6 100644 --- a/gcc/testsuite/gcc.dg/guality/guality.h +++ b/gcc/testsuite/gcc.dg/guality/guality.h @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include <stdlib.h> #include <string.h> #include <stdint.h> +#include <unistd.h> /* This is a first cut at checking that debug information matches run-time. The idea is to annotate programs with GUALCHK* macros @@ -61,6 +62,7 @@ typedef intmax_t gualchk_t; /* Convert a pointer or integral type to the widest integral type, as expected by guality_check. */ +#ifndef __cplusplus #define GUALCVT(val) \ ((gualchk_t)__builtin_choose_expr \ (__builtin_types_compatible_p (__typeof (val), gualchk_t), \ @@ -69,6 +71,30 @@ typedef intmax_t gualchk_t; (__builtin_classify_type (val) \ == __builtin_classify_type (&guality_skip), \ (uintptr_t)(val),(intptr_t)(val)))) +#else +template <typename T> +inline __attribute__((always_inline)) gualchk_t +gualcvt (T *val) +{ + return (uintptr_t) val; +} + +template <typename T> +inline __attribute__((always_inline)) gualchk_t +gualcvt (T val) +{ + return (intptr_t) val; +} + +template <> +inline __attribute__((always_inline)) gualchk_t +gualcvt<gualchk_t> (gualchk_t val) +{ + return val; +} + +#define GUALCVT(val) gualcvt (val) +#endif /* Attach a debugger to the current process and verify that the string EXPR, evaluated by the debugger, yields the gualchk_t number VAL. @@ -195,7 +221,7 @@ main (int argc, char *argv[]) else { int len = strlen (guality_gdb_command) + sizeof (GUALITY_GDB_ARGS); - char *buf = __builtin_alloca (len); + char *buf = (char *) __builtin_alloca (len); strcpy (buf, guality_gdb_command); strcat (buf, GUALITY_GDB_ARGS); guality_gdb_command = buf; diff --git a/gcc/testsuite/gcc.dg/guality/nrv-1.c b/gcc/testsuite/gcc.dg/guality/nrv-1.c new file mode 100644 index 00000000000..6e70050ec4d --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/nrv-1.c @@ -0,0 +1,29 @@ +/* { dg-do run } */ +/* { dg-options "-g -fno-tree-sra" } */ + +void abort (void); + +struct A +{ + int i[100]; +}; + +struct A a1, a3; + +__attribute__((noinline)) struct A +f () +{ + struct A a2; + a2.i[0] = 42; + if (a3.i[0] != 0) + abort (); + a2.i[4] = 7; /* { dg-final { gdb-test 20 "a2.i\[0\]" "42" } } */ + return a2; +} + +int +main () +{ + a1 = f (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-1.c b/gcc/testsuite/gcc.dg/guality/pr45003-1.c new file mode 100644 index 00000000000..7cef8f6284c --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/pr45003-1.c @@ -0,0 +1,31 @@ +/* PR debug/45003 */ +/* { dg-do run { target { x86_64-*-* && lp64 } } } */ +/* { dg-options "-g" } */ + +int __attribute__((noinline)) +foo (unsigned short *p) +{ + int a = *p; + asm volatile ("nop"); + asm volatile ("nop" : : "D" (a)); /* { dg-final { gdb-test 10 "a" "0x8078" } } */ + return 0; +} + +int __attribute__((noinline)) +bar (short *p) +{ + unsigned int a = *p; + asm volatile ("nop"); + asm volatile ("nop" : : "D" (a)); /* { dg-final { gdb-test 19 "a" "0xffff8078" } } */ + return 0; +} + +int +main () +{ + unsigned short us = 0x8078; + foo (&us); + short s = -32648; + bar (&s); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-2.c b/gcc/testsuite/gcc.dg/guality/pr45003-2.c new file mode 100644 index 00000000000..dcdba237ff4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/pr45003-2.c @@ -0,0 +1,31 @@ +/* PR debug/45003 */ +/* { dg-do run { target { x86_64-*-* && lp64 } } } */ +/* { dg-options "-g" } */ + +int __attribute__((noinline)) +foo (unsigned short *p) +{ + int a = *p; + asm volatile ("nop" : : "D" ((int) *p)); + asm volatile ("nop" : : "D" ((int) *p)); /* { dg-final { gdb-test 10 "a" "0x8078" } } */ + return 0; +} + +int __attribute__((noinline)) +bar (short *p) +{ + unsigned int a = *p; + asm volatile ("nop" : : "D" ((unsigned int) *p)); + asm volatile ("nop" : : "D" ((unsigned int) *p)); /* { dg-final { gdb-test 19 "a" "0xffff8078" } } */ + return 0; +} + +int +main () +{ + unsigned short us = 0x8078; + foo (&us); + short s = -32648; + bar (&s); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/guality/pr45003-3.c b/gcc/testsuite/gcc.dg/guality/pr45003-3.c new file mode 100644 index 00000000000..3adc4f2383e --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/pr45003-3.c @@ -0,0 +1,31 @@ +/* PR debug/45003 */ +/* { dg-do run { target { x86_64-*-* && lp64 } } } */ +/* { dg-options "-g" } */ + +int __attribute__((noinline)) +foo (unsigned short *p) +{ + int a = (short) *p; + asm volatile ("nop" : : "D" ((int) *p)); + asm volatile ("nop" : : "D" ((int) *p)); /* { dg-final { gdb-test 10 "a" "-32648" } } */ + return 0; +} + +int __attribute__((noinline)) +bar (short *p) +{ + unsigned int a = (unsigned short) *p; + asm volatile ("nop" : : "D" ((unsigned int) *p)); + asm volatile ("nop" : : "D" ((unsigned int) *p)); /* { dg-final { gdb-test 19 "a" "0x8078" } } */ + return 0; +} + +int +main () +{ + unsigned short us = 0x8078; + foo (&us); + short s = -32648; + bar (&s); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c b/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c index c9a766d9e8f..60382949175 100644 --- a/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c +++ b/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c @@ -30,3 +30,4 @@ int main (int argc, char *argv[]) } /* { dg-final { scan-tree-dump-times "foo " 1 "eipa_sra" } } */ +/* { dg-final { cleanup-tree-dump "eipa_sra" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/pure-const-2.c b/gcc/testsuite/gcc.dg/ipa/pure-const-2.c index 51d779776bc..2dcca18c09f 100644 --- a/gcc/testsuite/gcc.dg/ipa/pure-const-2.c +++ b/gcc/testsuite/gcc.dg/ipa/pure-const-2.c @@ -26,3 +26,5 @@ main(void) } /* { dg-final { scan-tree-dump "found to be pure: i_am_pure" "local-pure-const1"} } */ /* { dg-final { scan-tree-dump-not "i_am_pure" "optimized"} } */ +/* { dg-final { cleanup-tree-dump "local-pure-const1" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/lto/20090210_0.c b/gcc/testsuite/gcc.dg/lto/20090210_0.c index c588e8a2778..2c858a67d32 100644 --- a/gcc/testsuite/gcc.dg/lto/20090210_0.c +++ b/gcc/testsuite/gcc.dg/lto/20090210_0.c @@ -1,5 +1,7 @@ /* { dg-lto-do run } */ /* { dg-suppress-ld-options {-fPIC} } */ +/* { dg-require-effective-target tls } */ +/* { dg-extra-ld-options "-pthread" { target *-*-solaris2.[89] } } */ int foo (int x) { return x; diff --git a/gcc/testsuite/gcc.dg/lto/20090313_0.c b/gcc/testsuite/gcc.dg/lto/20090313_0.c index 523ae2de7c5..226e647135a 100644 --- a/gcc/testsuite/gcc.dg/lto/20090313_0.c +++ b/gcc/testsuite/gcc.dg/lto/20090313_0.c @@ -1,4 +1,5 @@ /* { dg-lto-options "-mcpu=v9" { target sparc*-*-* } } */ +/* { dg-require-effective-target sync_char_short } */ void _cairo_clip_path_reference () { int a; diff --git a/gcc/testsuite/gcc.dg/lto/20100518_0.c b/gcc/testsuite/gcc.dg/lto/20100518_0.c index 02290b5feb2..c0e9c8be2f7 100644 --- a/gcc/testsuite/gcc.dg/lto/20100518_0.c +++ b/gcc/testsuite/gcc.dg/lto/20100518_0.c @@ -1,4 +1,5 @@ /* { dg-lto-do link } */ +/* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */ /* Forgot to steam in/out the number of labels for asm goto. PR44184. */ extern int printf (__const char *__restrict __format, ...); diff --git a/gcc/testsuite/gcc.dg/lto/20100709-1_0.c b/gcc/testsuite/gcc.dg/lto/20100709-1_0.c new file mode 100644 index 00000000000..33f38f6c204 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100709-1_0.c @@ -0,0 +1,7 @@ +/* { dg-lto-do link } */ + +struct X; +struct Y { + struct X (*fnptr)(struct X); +}; +struct Y foo; diff --git a/gcc/testsuite/gcc.dg/lto/20100709-1_1.c b/gcc/testsuite/gcc.dg/lto/20100709-1_1.c new file mode 100644 index 00000000000..b970795c61d --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100709-1_1.c @@ -0,0 +1,11 @@ +struct X { int i; }; +struct Y { + struct X (*fnptr)(struct X); +}; +extern struct Y foo; +int main() +{ + struct X x; + foo.fnptr(x); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-1_0.c b/gcc/testsuite/gcc.dg/lto/20100720-1_0.c new file mode 100644 index 00000000000..ca9366f6247 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-1_0.c @@ -0,0 +1,22 @@ +/* { dg-lto-do run } */ + +struct X { + int a; +}; + +typedef struct list_node *list; + +struct list_node { + list next; + struct X *value; +}; + +list f(void) +{ + return 0; +} + +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-1_1.c b/gcc/testsuite/gcc.dg/lto/20100720-1_1.c new file mode 100644 index 00000000000..789e88e7d06 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-1_1.c @@ -0,0 +1,15 @@ +struct X { + int b; +}; + +typedef struct list_node *list; + +struct list_node { + list next; + struct X *value; +}; + +list g(void) +{ + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-2_0.c b/gcc/testsuite/gcc.dg/lto/20100720-2_0.c new file mode 100644 index 00000000000..87b13b0de92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-2_0.c @@ -0,0 +1,23 @@ +/* { dg-lto-do run } */ + +struct X { + int a; +}; + +typedef struct list_node *list; + +struct list_node { + list next; + list *ptr; + struct X *value; +}; + +list f(list lst) +{ + return lst->next; +} + +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-2_1.c b/gcc/testsuite/gcc.dg/lto/20100720-2_1.c new file mode 100644 index 00000000000..b3a2cd06e66 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-2_1.c @@ -0,0 +1,16 @@ +struct X { + int b; +}; + +typedef struct list_node *list; + +struct list_node { + list next; + list *ptr; + struct X *value; +}; + +list *g(list *ptr) +{ + return ptr; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-3_0.c b/gcc/testsuite/gcc.dg/lto/20100720-3_0.c new file mode 100644 index 00000000000..99c89ebd7fd --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-3_0.c @@ -0,0 +1,24 @@ +/* { dg-lto-do run } */ + +struct X { + int a; +}; + +struct link { + struct list_node *next; +}; + +struct list_node { + struct link lnk; + struct X *value; +}; + +void f(struct list_node *lst) +{ + lst->lnk.next = 0; +} + +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-3_1.c b/gcc/testsuite/gcc.dg/lto/20100720-3_1.c new file mode 100644 index 00000000000..3d323813edd --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-3_1.c @@ -0,0 +1,17 @@ +struct X { + int b; +}; + +struct link { + struct list_node *next; +}; + +struct list_node { + struct link lnk; + struct X *value; +}; + +void g(struct list_node *lst) +{ + lst->lnk.next = 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100720-4_0.c b/gcc/testsuite/gcc.dg/lto/20100720-4_0.c new file mode 100644 index 00000000000..e7669552fa9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100720-4_0.c @@ -0,0 +1,15 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-flto -fsigned-char} {-flto -funsigned-char}} } */ + +char *a; +int f; + +void +foo (void) +{ + f = (*a != '-'); +} +int main() +{ + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/20100722-1_0.c b/gcc/testsuite/gcc.dg/lto/20100722-1_0.c new file mode 100644 index 00000000000..275a03c25a0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100722-1_0.c @@ -0,0 +1,6 @@ +/* { dg-lto-do run } */ +/* { dg-require-linker-plugin "" } */ +/* { dg-extra-ld-options "-fuse-linker-plugin" } */ + +int main() { return 0; } + diff --git a/gcc/testsuite/gcc.dg/plugin/ggcplug.c b/gcc/testsuite/gcc.dg/plugin/ggcplug.c index 03bd563b5ad..3094b2ebb63 100644 --- a/gcc/testsuite/gcc.dg/plugin/ggcplug.c +++ b/gcc/testsuite/gcc.dg/plugin/ggcplug.c @@ -13,6 +13,7 @@ #include "intl.h" #include "gcc-plugin.h" #include "plugin-version.h" +#include "diagnostic.h" int plugin_is_GPL_compatible; diff --git a/gcc/testsuite/gcc.dg/plugin/selfassign.c b/gcc/testsuite/gcc.dg/plugin/selfassign.c index df42abd27df..84d2801d202 100644 --- a/gcc/testsuite/gcc.dg/plugin/selfassign.c +++ b/gcc/testsuite/gcc.dg/plugin/selfassign.c @@ -14,6 +14,7 @@ #include "tree-pass.h" #include "intl.h" #include "plugin-version.h" +#include "diagnostic.h" int plugin_is_GPL_compatible; @@ -52,9 +53,7 @@ get_real_ref_rhs (tree expr) /* We are only interested in an assignment with a single rhs operand because if it is not, the original assignment will not possibly be a self-assignment. */ - if (is_gimple_assign (def_stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (def_stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (def_stmt)) return get_real_ref_rhs (gimple_assign_rhs1 (def_stmt)); else return NULL_TREE; @@ -66,7 +65,7 @@ get_real_ref_rhs (tree expr) case PARM_DECL: case FIELD_DECL: case COMPONENT_REF: - case INDIRECT_REF: + case MEM_REF: case ARRAY_REF: return expr; default: @@ -116,17 +115,18 @@ get_non_ssa_expr (tree expr) else return expr; } - case INDIRECT_REF: + case MEM_REF: { tree orig_base = TREE_OPERAND (expr, 0); - tree base = get_non_ssa_expr (orig_base); - if (!base) - return NULL_TREE; - /* If BASE is converted, build a new indirect reference tree. */ - if (base != orig_base) - return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (base)), base); - else - return expr; + if (TREE_CODE (orig_base) == SSA_NAME) + { + tree base = get_non_ssa_expr (orig_base); + if (!base) + return NULL_TREE; + return fold_build2 (MEM_REF, TREE_TYPE (expr), + base, TREE_OPERAND (expr, 1)); + } + return expr; } case ARRAY_REF: { @@ -153,9 +153,7 @@ get_non_ssa_expr (tree expr) && !gimple_nop_p (SSA_NAME_DEF_STMT (expr))) { gimple def_stmt = SSA_NAME_DEF_STMT (expr); - if (is_gimple_assign (def_stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (def_stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (def_stmt)) vdecl = gimple_assign_rhs1 (def_stmt); } return get_non_ssa_expr (vdecl); @@ -201,9 +199,7 @@ warn_self_assign (gimple stmt) tree rhs, lhs; /* Check assigment statement. */ - if (is_gimple_assign (stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (stmt)) { rhs = get_real_ref_rhs (gimple_assign_rhs1 (stmt)); if (!rhs) diff --git a/gcc/testsuite/gcc.dg/pr32370.c b/gcc/testsuite/gcc.dg/pr32370.c index f039bdf98e7..fc3d724e6c4 100644 --- a/gcc/testsuite/gcc.dg/pr32370.c +++ b/gcc/testsuite/gcc.dg/pr32370.c @@ -19,7 +19,7 @@ unsigned int foo (TYPE port) { unsigned int v; - __asm__ __volatile__ ("" : C (v) : "Nd" (port)); /* { dg-error "while reloading\|has impossible" } */ + __asm__ __volatile__ ("" : C (v) : "Nd" (port)); /* { dg-error "while reloading\|has impossible\|inconsistent operand constraints" } */ return v; } diff --git a/gcc/testsuite/gcc.dg/pr34856.c b/gcc/testsuite/gcc.dg/pr34856.c index 76499f7b8f5..6bfc704774f 100644 --- a/gcc/testsuite/gcc.dg/pr34856.c +++ b/gcc/testsuite/gcc.dg/pr34856.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2" } */ /* { dg-options "-O2 -msse2" { target { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target sse2 { target { i?86-*-* x86_64-*-* } } } */ /* { dg-options "-O2 -maltivec" { target { powerpc*-*-linux* && powerpc_altivec_ok } } } */ typedef unsigned __attribute__ ((__mode__ (__pointer__))) uintptr_t; diff --git a/gcc/testsuite/gcc.dg/pr36584.c b/gcc/testsuite/gcc.dg/pr36584.c index a39eb572e1d..c0b005db7d7 100644 --- a/gcc/testsuite/gcc.dg/pr36584.c +++ b/gcc/testsuite/gcc.dg/pr36584.c @@ -1,11 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -lm" } */ /* { dg-options "-O2 -msse2 -mfpmath=sse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ -/* { dg-require-effective-target sse2 { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ - -#ifdef __i386__ -#include "cpuid.h" -#endif +/* { dg-require-effective-target sse2_runtime { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ extern double fabs (double); extern void abort (void); @@ -263,16 +259,6 @@ main () double roots[7]; int nroots; -#ifdef __i386__ - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - if (!(edx & bit_SSE2)) - return 0; -#endif - nroots = sbisect (6, sseq, 0.0, 10000000.0, 5, 1, roots); if (nroots != 4) abort (); diff --git a/gcc/testsuite/gcc.dg/pr36902.c b/gcc/testsuite/gcc.dg/pr36902.c index 8b4ba6fcdb2..43a2d14f981 100644 --- a/gcc/testsuite/gcc.dg/pr36902.c +++ b/gcc/testsuite/gcc.dg/pr36902.c @@ -44,7 +44,7 @@ foo2(unsigned char * to, const unsigned char * from, int n) *to = *from; break; case 5: - to[4] = from [4]; /* { dg-warning "20:array subscript is above array bounds" } */ + to[4] = from [4]; /* { dg-warning "array subscript is above array bounds" } */ break; } return to; diff --git a/gcc/testsuite/gcc.dg/pr36997.c b/gcc/testsuite/gcc.dg/pr36997.c index 51b06a7791c..13461b8a134 100644 --- a/gcc/testsuite/gcc.dg/pr36997.c +++ b/gcc/testsuite/gcc.dg/pr36997.c @@ -1,10 +1,9 @@ /* { dg-do compile { target x86_64-*-* i?86-*-* } } */ /* { dg-options "-std=c99 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__)); __m64 _mm_add_si64 (__m64 __m1, __m64 __m2) { return (__m64) __builtin_ia32_paddq ((long long)__m1, (long long)__m2); /* { dg-error "incompatible type" } */ - /* { dg-message "note: expected '__vector.1. long long int' but argument is of type 'long long int'" "" { target *-*-* } 8 } */ + /* { dg-message "note: expected '__vector.1. long long int' but argument is of type 'long long int'" "" { target *-*-* } 7 } */ } diff --git a/gcc/testsuite/gcc.dg/pr37544.c b/gcc/testsuite/gcc.dg/pr37544.c index efca1db6d4a..99979cef7ad 100644 --- a/gcc/testsuite/gcc.dg/pr37544.c +++ b/gcc/testsuite/gcc.dg/pr37544.c @@ -1,11 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2" } */ /* { dg-options "-O2 -msse2 -mtune=core2 -mfpmath=387" { target { i?86-*-* x86_64-*-* } } } */ -/* { dg-require-effective-target sse2 { target { i?86-*-* x86_64-*-* } } } */ - -#ifdef __i386__ -#include "cpuid.h" -#endif +/* { dg-require-effective-target sse2_runtime { target { i?86-*-* x86_64-*-* } } } */ extern void abort (void); @@ -16,17 +12,6 @@ int main(void) int i; -#ifdef __i386__ - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (!(edx & bit_SSE2)) - return 0; -#endif - for (i = 0; i < 1000; i++) arr[i] = 4294967296.0 + (double)i; diff --git a/gcc/testsuite/gcc.dg/pr40550.c b/gcc/testsuite/gcc.dg/pr40550.c index 27935ab005a..08951137dd3 100644 --- a/gcc/testsuite/gcc.dg/pr40550.c +++ b/gcc/testsuite/gcc.dg/pr40550.c @@ -1,9 +1,6 @@ /* { dg-do run } */ /* { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ - -#ifdef __i386__ -#include "cpuid.h" -#endif +/* { dg-require-effective-target sse_runtime { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ typedef float v2sf __attribute__ ((vector_size (2 * sizeof(float)))); @@ -17,18 +14,6 @@ static void test (void) int main () { - -#ifdef __i386__ - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - if (!(edx & bit_SSE)) - return 0; -#endif - test (); - return 0; } diff --git a/gcc/testsuite/gcc.dg/pr42427.c b/gcc/testsuite/gcc.dg/pr42427.c index 1961313bc5f..cb43dd2affb 100644 --- a/gcc/testsuite/gcc.dg/pr42427.c +++ b/gcc/testsuite/gcc.dg/pr42427.c @@ -1,5 +1,6 @@ -/* { dg-do assemble } */ +/* { dg-do assemble { target c99_runtime } } */ /* { dg-options "-O2 -fexceptions -fnon-call-exceptions -fpeel-loops" } */ +/* { dg-add-options c99_runtime } */ /* { dg-require-effective-target ilp32 } */ #include <complex.h> diff --git a/gcc/testsuite/gcc.dg/pr43058.c b/gcc/testsuite/gcc.dg/pr43058.c index 50d8a63bb8f..bba6f814a71 100644 --- a/gcc/testsuite/gcc.dg/pr43058.c +++ b/gcc/testsuite/gcc.dg/pr43058.c @@ -1,6 +1,7 @@ /* PR debug/43058 */ /* { dg-do compile } */ /* { dg-options "-g -O2" } */ +/* { dg-timeout-factor 4 } */ extern void *f1 (void *, void *, void *); extern void *f2 (const char *, int, int, int, void *(*) ()); diff --git a/gcc/testsuite/gcc.dg/pr44290-1.c b/gcc/testsuite/gcc.dg/pr44290-1.c new file mode 100644 index 00000000000..071a2710425 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44290-1.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target arm*-*-* avr-*-* mcore-*-* rx-*-* spu-*-* } } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +static void __attribute__((naked)) +foo(void *from, void *to) +{ + asm volatile("dummy"::"r"(from), "r"(to)); +} + +unsigned int fie[2]; + +void fum(void *to) +{ + foo(fie, to); +} + +/* { dg-final { scan-tree-dump "foo \\\(void \\\* from, void \\\* to\\\)" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/pr44290-2.c b/gcc/testsuite/gcc.dg/pr44290-2.c new file mode 100644 index 00000000000..1951a519dfc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44290-2.c @@ -0,0 +1,24 @@ +/* { dg-do compile { target arm*-*-* avr-*-* mcore-*-* rx-*-* spu-*-* } } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +static unsigned long __attribute__((naked)) +foo (unsigned long base) +{ + asm volatile ("dummy"); +} +unsigned long +bar (void) +{ + static int start, set; + + if (!set) + { + set = 1; + start = foo (0); + } + + return foo (start); +} + +/* { dg-final { scan-tree-dump "foo \\\(long unsigned int base\\\)" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/pr44838.c b/gcc/testsuite/gcc.dg/pr44838.c new file mode 100644 index 00000000000..61608ed0b71 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44838.c @@ -0,0 +1,33 @@ +/* PR rtl-optimization/44838 */ +/* { dg-do run } */ +/* { dg-options "-O2 -funroll-loops" } */ + +extern void abort (); + +void +foo (int *a, int n) +{ + int *lasta = a + n; + for (; a != lasta; a++) + { + *a *= 2; + a[1] = a[-1] + a[-2]; + } +} + +int a[16]; +int ref[16] = { 0, 1, 4, 2, 10, 12, 24, 44, + 72, 136, 232, 416, 736, 1296, 2304, 2032 }; + +int +main () +{ + int i; + for (i = 0; i < 16; i++) + a[i] = i; + foo (a + 2, 16 - 3); + for (i = 0; i < 16; i++) + if (ref[i] != a[i]) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr44971.c b/gcc/testsuite/gcc.dg/pr44971.c new file mode 100644 index 00000000000..a1faef51be1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44971.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug -w" } */ + +typedef struct +{ + int default_screen; +} *_XPrivint; +typedef int FcBool; +typedef struct +{ + struct _XftintInfo *next; +} XftintInfo; +int _XftintInfo; + +void _XftintInfoGet (int * dpy, FcBool createIfNecessary) +{ + int event_base; + &event_base + && dpy[createIfNecessary] != 0; +} + +void _XftCloseint (int dpy, XftintInfo * info,XftintInfo * *prev) +{ + _XftintInfoGet (dpy, 0); + for (prev = &_XftintInfo; info = *prev; prev = &(*prev)->next) + ; +} diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c b/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c index cbfd0bc72bb..ca3643e43de 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c @@ -26,5 +26,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c b/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c index c51648c4ef0..baff45d917d 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c @@ -39,5 +39,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c b/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c index 1a798e399d3..8953264fea1 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c @@ -34,5 +34,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c b/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c index 82f24a1a4b1..9a23f8d53a8 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c @@ -37,5 +37,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c b/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c index b2223c88b8b..b0202399104 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c @@ -28,6 +28,6 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c b/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c index 308c30e4fd7..e9de98c3b8a 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c @@ -61,6 +61,6 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c b/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c index 19de595e8ed..3c26e3be7b6 100644 --- a/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c +++ b/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c @@ -39,5 +39,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c b/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c index 12c217aad97..5d5e37b4f0e 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c @@ -23,5 +23,5 @@ int main() } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c b/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c index abf50a54fec..efb68be8bdd 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c @@ -35,5 +35,5 @@ main () return 0; } -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c b/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c index b1508eec5c7..77226b449c5 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c @@ -26,5 +26,5 @@ int main() } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c b/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c index db7f6b09cb5..58411202767 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c @@ -43,5 +43,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c index e6638b73a60..781a847f9f7 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c @@ -42,5 +42,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is passed to local function...Excluded." "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is passed to local function...Excluded." "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c index 8830c55601d..8892fa99098 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c @@ -29,5 +29,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is return type of function...Excluded" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is return type of function...Excluded" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c index 5f634fc119c..6da3420f6e8 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c @@ -28,6 +28,6 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is initialized...Excluded" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is initialized...Excluded" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c index 55a644e1971..bd03ec42f05 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c @@ -30,5 +30,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c index 4cb94afc5df..59e0e48321a 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c @@ -45,5 +45,5 @@ main (void) } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c index bade3153909..a6b32ddd688 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c @@ -42,5 +42,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c b/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c index 4ffd4b5a265..b61e26b1248 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c @@ -29,5 +29,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c b/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c index 4c00d02434a..39351e072e2 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c @@ -42,5 +42,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c b/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c index 3d92da40517..18d5a734740 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c @@ -37,5 +37,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c b/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c index a6fd7be4371..26a9dbd7314 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c @@ -40,5 +40,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c b/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c index 04b8b6621fb..6caadcf1230 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c @@ -44,5 +44,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c index 22193f2ae57..812763d53ff 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c @@ -31,5 +31,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c index e17ca56ee8b..313af1080c1 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c @@ -31,5 +31,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c b/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c index 24dae559829..92da94d2923 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c @@ -64,5 +64,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/tls/emutls-1.c b/gcc/testsuite/gcc.dg/tls/emutls-1.c index a0dea509434..3b3577c895e 100644 --- a/gcc/testsuite/gcc.dg/tls/emutls-1.c +++ b/gcc/testsuite/gcc.dg/tls/emutls-1.c @@ -1,5 +1,6 @@ /* { dg-do run { target *-wrs-vxworks } } */ /* { dg-require-effective-target tls } */ +/* { dg-add-options tls } */ /* vxworks' TLS model requires no extra padding on the tls proxy objects. */ diff --git a/gcc/testsuite/gcc.dg/tls/opt-11.c b/gcc/testsuite/gcc.dg/tls/opt-11.c index 3739645257a..0069c484a2c 100644 --- a/gcc/testsuite/gcc.dg/tls/opt-11.c +++ b/gcc/testsuite/gcc.dg/tls/opt-11.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target tls_runtime } */ +/* { dg-add-options tls } */ extern void abort (void); extern void *memset (void *, int, __SIZE_TYPE__); diff --git a/gcc/testsuite/gcc.dg/tls/opt-12.c b/gcc/testsuite/gcc.dg/tls/opt-12.c index 7c6e73430a1..7b9e498a5a8 100644 --- a/gcc/testsuite/gcc.dg/tls/opt-12.c +++ b/gcc/testsuite/gcc.dg/tls/opt-12.c @@ -2,6 +2,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -fpic" } */ /* { dg-require-effective-target tls_runtime } */ +/* { dg-add-options tls } */ /* { dg-require-effective-target fpic } */ extern void abort (void); diff --git a/gcc/testsuite/gcc.dg/tls/pr24428-2.c b/gcc/testsuite/gcc.dg/tls/pr24428-2.c index a0ceecc0624..b147f60d6a9 100644 --- a/gcc/testsuite/gcc.dg/tls/pr24428-2.c +++ b/gcc/testsuite/gcc.dg/tls/pr24428-2.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2" } */ /* { dg-require-effective-target tls_runtime } */ +/* { dg-add-options tls } */ __thread double thrtest[81]; int main () diff --git a/gcc/testsuite/gcc.dg/tls/pr24428.c b/gcc/testsuite/gcc.dg/tls/pr24428.c index ecb747ede6d..6439698775a 100644 --- a/gcc/testsuite/gcc.dg/tls/pr24428.c +++ b/gcc/testsuite/gcc.dg/tls/pr24428.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2" } */ /* { dg-require-effective-target tls_runtime } */ +/* { dg-add-options tls } */ __thread double thrtest[81]; int main () diff --git a/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c b/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c index 31cd5874ffb..031a2fca0a9 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-cproj-1.c @@ -6,6 +6,7 @@ Origin: Kaveh R. Ghazi, April 9, 2010. */ /* { dg-do link } */ +/* { dg-add-options ieee } */ /* All references to link_error should go away at compile-time. The argument is the __LINE__ number. It appears in the tree dump file diff --git a/gcc/testsuite/gcc.dg/torture/pr16104-1.c b/gcc/testsuite/gcc.dg/torture/pr16104-1.c index 3eb405906a2..ad5eda65fca 100644 --- a/gcc/testsuite/gcc.dg/torture/pr16104-1.c +++ b/gcc/testsuite/gcc.dg/torture/pr16104-1.c @@ -1,9 +1,7 @@ /* PR rtl-optimization/16104 */ /* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ - -#include "cpuid.h" +/* { dg-require-effective-target sse2_runtime } */ extern void abort (void); @@ -76,14 +74,6 @@ do_test (void) int main (void) { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - do_test (); - + do_test (); return 0; } diff --git a/gcc/testsuite/gcc.dg/torture/pr35771-1.c b/gcc/testsuite/gcc.dg/torture/pr35771-1.c index 8def464aa6d..b3fd554da22 100644 --- a/gcc/testsuite/gcc.dg/torture/pr35771-1.c +++ b/gcc/testsuite/gcc.dg/torture/pr35771-1.c @@ -1,6 +1,6 @@ /* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); diff --git a/gcc/testsuite/gcc.dg/torture/pr35771-2.c b/gcc/testsuite/gcc.dg/torture/pr35771-2.c index 3d6add10de9..a033caefd5c 100644 --- a/gcc/testsuite/gcc.dg/torture/pr35771-2.c +++ b/gcc/testsuite/gcc.dg/torture/pr35771-2.c @@ -1,6 +1,6 @@ /* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__)); diff --git a/gcc/testsuite/gcc.dg/torture/pr35771-3.c b/gcc/testsuite/gcc.dg/torture/pr35771-3.c index 9a69b21a511..fcbe86cb1ba 100644 --- a/gcc/testsuite/gcc.dg/torture/pr35771-3.c +++ b/gcc/testsuite/gcc.dg/torture/pr35771-3.c @@ -1,6 +1,6 @@ /* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); diff --git a/gcc/testsuite/gcc.dg/torture/pr35771.h b/gcc/testsuite/gcc.dg/torture/pr35771.h index 01c248751c1..7b921c41ba9 100644 --- a/gcc/testsuite/gcc.dg/torture/pr35771.h +++ b/gcc/testsuite/gcc.dg/torture/pr35771.h @@ -1,7 +1,5 @@ typedef TYPE __attribute__((aligned(1))) unaligned; -#include "cpuid.h" - extern void abort (void); @@ -27,14 +25,6 @@ do_test (void) int main (void) { - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - do_test (); - + do_test (); return 0; } diff --git a/gcc/testsuite/gcc.dg/torture/pr36891.c b/gcc/testsuite/gcc.dg/torture/pr36891.c index 31f7e173142..53e6163de14 100644 --- a/gcc/testsuite/gcc.dg/torture/pr36891.c +++ b/gcc/testsuite/gcc.dg/torture/pr36891.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-ffast-math" } */ /* { dg-options "-ffast-math -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +/* { dg-require-effective-target sse { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ #define __vector __attribute__((vector_size(16) )) __vector float f(void); diff --git a/gcc/testsuite/gcc.dg/torture/pr44695.c b/gcc/testsuite/gcc.dg/torture/pr44695.c new file mode 100644 index 00000000000..85bb4c7b927 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr44695.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +typedef unsigned char uint8_t; + +static uint8_t +safe_div_func_uint8_t_u_u (uint8_t ui1, uint8_t ui2) +{ + return ui2 ? ui2 : (ui1 / ui2); +} + +int +int81 (int x) +{ + return safe_div_func_uint8_t_u_u (1, 8 & x); +} diff --git a/gcc/testsuite/gcc.dg/torture/pr44806.c b/gcc/testsuite/gcc.dg/torture/pr44806.c new file mode 100644 index 00000000000..d0002d308d0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr44806.c @@ -0,0 +1,90 @@ +/* { dg-do run } */ + +#include <stdint.h> + +extern void abort (void); + +#define N_DEV_BITS_4 5 +#define N_INO_BITS_4 (32 - N_DEV_BITS_4 - 2 - 1) + +#define N_DEV_BITS_8 8 +#define N_INO_BITS_8 (64 - N_DEV_BITS_8 - 2 - 1) + +struct dev_ino_4 +{ + uint32_t mode:2; + uint32_t short_ino:N_INO_BITS_4; + uint32_t mapped_dev:N_DEV_BITS_4; + uint32_t always_set:1; +}; + +struct dev_ino_8 +{ + uint32_t mode:2; + uint64_t short_ino:N_INO_BITS_8; + uint32_t mapped_dev:N_DEV_BITS_8; + uint32_t always_set:1; +}; + +struct dev_ino_full +{ + uint32_t mode:2; + uint32_t dev; + uint32_t ino; +}; + +enum di_mode +{ + DI_MODE_4 = 1, + DI_MODE_8 = 2, + DI_MODE_FULL = 3 +}; + +struct di_ent +{ + union + { + struct dev_ino_4 di4; + struct dev_ino_8 di8; + struct dev_ino_full full; + uint32_t u32; + uint64_t u64; + void *ptr; + } u; +}; + +static struct di_ent +decode_ptr (struct di_ent const *v) +{ + struct di_ent di; + di.u.ptr = (void *) v; + return di; +} + +static int +di_ent_equal (void const *x, void const *y) +{ + struct di_ent a = decode_ptr (x); + struct di_ent b = decode_ptr (y); + if (a.u.di4.mode != b.u.di4.mode) + return 0; + + if (a.u.di4.mode == DI_MODE_4) + return (a.u.di4.short_ino == b.u.di4.short_ino + && a.u.di4.mapped_dev == b.u.di4.mapped_dev); + + if (a.u.di8.mode == DI_MODE_8) + return (a.u.di8.short_ino == b.u.di8.short_ino + && a.u.di8.mapped_dev == b.u.di8.mapped_dev); + + return (a.u.full.ino == b.u.full.ino + && a.u.full.dev == b.u.full.dev); +} + +int +main () +{ + if (di_ent_equal ((void *) 0x80143c4d, (void *) 0x80173851) != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr44977.c b/gcc/testsuite/gcc.dg/torture/pr44977.c new file mode 100644 index 00000000000..66fd7d1bfae --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr44977.c @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +static unsigned short +foo (unsigned short ui1, unsigned short ui2) +{ + return ui1 - ui2; +} + +static unsigned short +bar (unsigned ui1, unsigned short ui2) +{ + return ui1 + ui2; +} + +struct S1 +{ + const short f3; +}; +int g_31; +short g_67; +struct S1 g_68[2][5][9][1][1] = { +}; + +int func_90 (int); + +int int329 (int * const *const int32p_81, short ** p_82) +{ + short l_169[8]; + for (g_31 = 0; g_31 <= 0; g_31 = foo (g_31, 1)) + { + short l_85; +lbl_89:g_67 ^= l_85; + for (l_85 = 0; l_85 >= 0; l_85 = bar) + if (g_31) + goto lbl_89; + func_90 (1), g_68[0][2][2][0][0].f3, 0; + } + return l_169[6]; +} + diff --git a/gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c b/gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c index cbbb9d03a4c..139b74ed9c6 100644 --- a/gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c +++ b/gcc/testsuite/gcc.dg/torture/stackalign/alloca-2.c @@ -1,10 +1,9 @@ /* PR middle-end/37009 */ /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ #include <emmintrin.h> -#include "cpuid.h" #include "check.h" #ifndef ALIGNMENT @@ -44,14 +43,7 @@ int main (void) { __m128 x = { 1.0 }; - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - foo (x, x, x, 5); + foo (x, x, x, 5); return 0; } diff --git a/gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c b/gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c index ffe52f2a3e0..31cb0c472b5 100644 --- a/gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c +++ b/gcc/testsuite/gcc.dg/torture/stackalign/alloca-3.c @@ -1,10 +1,9 @@ /* PR middle-end/37009 */ /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ #include <emmintrin.h> -#include "cpuid.h" #include "check.h" #ifndef ALIGNMENT @@ -44,14 +43,7 @@ int main (void) { __m128 x = { 1.0 }; - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - foo (x, x, x, x, 5); + foo (x, x, x, x, 5); return 0; } diff --git a/gcc/testsuite/gcc.dg/torture/stackalign/push-1.c b/gcc/testsuite/gcc.dg/torture/stackalign/push-1.c index c020d731293..dd5dffc1581 100644 --- a/gcc/testsuite/gcc.dg/torture/stackalign/push-1.c +++ b/gcc/testsuite/gcc.dg/torture/stackalign/push-1.c @@ -1,10 +1,9 @@ /* PR middle-end/37010 */ /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ /* { dg-options "-msse2 -mpreferred-stack-boundary=2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ #include <emmintrin.h> -#include "cpuid.h" typedef __PTRDIFF_TYPE__ ptrdiff_t; typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); @@ -42,19 +41,11 @@ int main (void) { __m128 x = { 1.0 }; - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - { - foo (x, x, x, x, 5); + foo (x, x, x, x, 5); - if (__builtin_memcmp (&r, &x, sizeof (r))) - abort (); - } + if (__builtin_memcmp (&r, &x, sizeof (r))) + abort (); return 0; } diff --git a/gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c b/gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c index 3e34cf148b7..5b49685fa82 100644 --- a/gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c +++ b/gcc/testsuite/gcc.dg/torture/stackalign/vararg-3.c @@ -1,11 +1,10 @@ /* PR middle-end/37009 */ /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ /* { dg-options "-msse2" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ #include <stdarg.h> #include <emmintrin.h> -#include "cpuid.h" #include "check.h" #ifndef ALIGNMENT @@ -72,14 +71,8 @@ int main (void) { __m128 x = { 1.0 }; - unsigned int eax, ebx, ecx, edx; - - if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) - return 0; - - /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) - foo ("foo", 5, 5.0, x); + + foo ("foo", 5, 5.0, x); return 0; } diff --git a/gcc/testsuite/gcc.dg/transparent-union-1.c b/gcc/testsuite/gcc.dg/transparent-union-1.c index 2360912e3c5..3f0c260c906 100644 --- a/gcc/testsuite/gcc.dg/transparent-union-1.c +++ b/gcc/testsuite/gcc.dg/transparent-union-1.c @@ -1,5 +1,5 @@ /* PR c/20043 */ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-options "-std=gnu99" } */ extern void f0 (int *); diff --git a/gcc/testsuite/gcc.dg/transparent-union-2.c b/gcc/testsuite/gcc.dg/transparent-union-2.c index 09fbb4d9722..adc20761796 100644 --- a/gcc/testsuite/gcc.dg/transparent-union-2.c +++ b/gcc/testsuite/gcc.dg/transparent-union-2.c @@ -1,5 +1,5 @@ /* PR c/20043 */ -/* { dg-compile } */ +/* { dg-do compile } */ /* { dg-options "-std=gnu99" } */ typedef union { int *i; long *l; } U diff --git a/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c b/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c index d32a6cedc7a..0f477b2376c 100644 --- a/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c +++ b/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c @@ -16,7 +16,7 @@ main() /* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */ /* Really this ought to simplify into assignment, but we are not there yet. */ /* a[0] = b[0] is what we fold the resulting memcpy into. */ -/* { dg-final-use { scan-tree-dump "a.0. = " "optimized"} } */ -/* { dg-final-use { scan-tree-dump "= b.0." "optimized"} } */ +/* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */ +/* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c b/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c index f9f5fb798ef..ed6f7c0d5d5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c @@ -33,5 +33,5 @@ simplify_condition (cond_p) } /* There should be exactly one IF conditional. */ -/* { dg-final { scan-tree-dump-times "if " 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "if " 1 "vrp1" { xfail *-*-* } } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c deleted file mode 100644 index dc764c3d79e..00000000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c +++ /dev/null @@ -1,13 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-optimized" } */ -struct a{ - int a; - int b; -} a; -int * -t() -{ - return (int *)&a; -} -/* { dg-final { scan-tree-dump "a.a" "optimized"} } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-3.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-3.c deleted file mode 100644 index b764187a029..00000000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-3.c +++ /dev/null @@ -1,28 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-optimized" } */ -union a -{ - struct s1 - { - long long a; - long long b; - } s1; - struct s2 - { - int c; - int d; - } s2; - struct s3 - { - unsigned long long e; - unsigned long long f; - } s3; -} a; -int * -t () -{ - return (int *) &a; -} - -/* { dg-final { scan-tree-dump "a.s2.c" "optimized"} } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c index ee3cb0ebfe5..7b07d7f488f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c @@ -15,5 +15,5 @@ void f(struct a * b, __SIZE_TYPE__ i) c[i] = 1; } -/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\] =.* 1;" 1 "forwprop1" } } */ +/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\].* = 1;" 1 "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c index 0b865245a96..b46b8ece816 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-forwprop1" } */ +/* { dg-options "-O -fdump-tree-fre-details" } */ int b; unsigned a; @@ -15,9 +15,8 @@ void test2(void) } /* The indirect load should be replaced by a load from a and a - conversion to int. */ + conversion to int. FRE should then be able to replace + the rhs of the store to b by 1. */ -/* { dg-final { scan-tree-dump "= a;" "forwprop1" } } */ -/* { dg-final { scan-tree-dump "= \\\(int\\\) " "forwprop1" } } */ -/* { dg-final { scan-tree-dump-not "= \\\*" "forwprop1" } } */ -/* { dg-final { cleanup-tree-dump "forwprop1" } } */ +/* { dg-final { scan-tree-dump "Replaced\[^\\n\]*with 1" "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c index fe04e66fa1a..2aefb9ace63 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c @@ -17,5 +17,5 @@ void f(__SIZE_TYPE__ i) c[i] = 1; } -/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\] =.* 1;" 1 "forwprop1" } } */ +/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\].* = 1;" 1 "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop?" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c index 710bc5dd114..1b68d5a35f0 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-forwprop1 -w" } */ +/* { dg-options "-O1 -fdump-tree-esra -w" } */ #define vector __attribute__((vector_size(16) )) struct VecClass @@ -15,7 +15,8 @@ vector float foo( vector float v ) return y.v; } -/* We should be able to convert the cast to a VCE in forwprop1. */ -/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1"} } */ -/* { dg-final { cleanup-tree-dump "forwprop1" } } */ - +/* We should be able to remove the intermediate struct and directly + return x. As we do not fold VIEW_CONVERT_EXPR<struct VecClass>(x).v + that doesn't happen right now. */ +/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "esra"} } */ +/* { dg-final { cleanup-tree-dump "esra" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c index 4e0751f8119..fc74297242c 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c @@ -12,5 +12,5 @@ int foo(struct X *q) /* We should have propragated &q->a into (*pointer). */ /* { dg-final { scan-tree-dump-times "pointer" 0 "forwprop1"} } */ -/* { dg-final { scan-tree-dump "->a\\\[0\\\]" "forwprop1" } } */ +/* { dg-final { scan-tree-dump "\\\[0\\\]" "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c new file mode 100644 index 00000000000..a9c5db3873f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-c -O2 -ftree-vectorize" { target *-*-* } } */ + +static int x; +foo (int n, int *A) +{ + int i; + for (i = 0; i < n; i++) + { + if (A[i]) + x = 2; + if (A[i + 1]) + x = 1; + } +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr44710.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr44710.c new file mode 100644 index 00000000000..d4a1be8f03e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr44710.c @@ -0,0 +1,44 @@ +/* { dg-do compile } */ +/* { dg-options "-c -O2 -ftree-vectorize" { target *-*-* } } */ + +#include <stdio.h> +#include <stdlib.h> + +#define N 64 +float arr[N]; + +__attribute__ ((noinline)) +int foo (unsigned int n, float *min) +{ + unsigned int pos = 1; + unsigned int i; + float limit = N+N; + + for (i = 0; i < N; i++) + if (arr[i] < limit) + { + pos = i + 1; + limit = arr[i]; + } + + *min = limit; + return pos; +} + +int main (void) +{ + int i, pos; + float min; + + for (i = 0; i < N; i++) + arr[i] = (float)(i); + + arr[2] = -5.8; + + pos = foo (N, &min); + if (pos != 3 || min != arr[2]) + abort (); + + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c new file mode 100644 index 00000000000..bf0714902a6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fnsplit -fdump-tree-optimized" } */ + +struct a {int a,b;}; +struct a make_me_big (int a); +struct a split_me (int a) +{ + struct a retval; + if (__builtin_expect (a!=0,1)) + { + retval.a = 0; + retval.b = 0; + return retval; + } + else + { + struct a retval = make_me_big (a); + retval = make_me_big (a); + retval = make_me_big (a); + retval = make_me_big (a); + retval = make_me_big (a); + retval = make_me_big (a); + return retval; + } +} +int val; +test() +{ + split_me (val); + split_me (val); + split_me (val); + split_me (val); +} +/* { dg-final { scan-tree-dump-times "Splitting function" 1 "fnsplit"} } */ +/* { dg-final { cleanup-tree-dump "fnsplit" } } */ +/* { dg-final { scan-tree-dump "part" "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c b/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c index 9733d8f99d8..e6130bbe7bd 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ +/* { dg-options "-O2 -fdump-tree-pre-stats -fdump-tree-fre" } */ #include <stddef.h> union tree_node; @@ -72,7 +72,9 @@ main (void) remove_useless_vars (&unexpanded_var_list, 0); return 0; } + +/* { dg-final { scan-tree-dump-not "= unexpanded_var_list;" "fre" } } */ /* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" } } */ /* { dg-final { scan-tree-dump-times "Insertions: 2" 1 "pre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ /* { dg-final { cleanup-tree-dump "pre" } } */ - diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c index af867515002..853fe70c623 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-forwprop1" } */ +/* { dg-options "-O -fdump-tree-forwprop1" } */ struct A { int i; }; int @@ -11,5 +11,7 @@ foo(struct A *locp, int str) return locp->i; } -/* { dg-final { scan-tree-dump "locp.*->i =" "forwprop1" } } */ +/* We should have propagated &locp->i into its dereference. */ + +/* { dg-final { scan-tree-dump "locp_\[^\\n\]* =" "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21463.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21463.c index f490bf61e5a..3f63cdd8e8c 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21463.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21463.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-phiprop" } */ +/* { dg-options "-O -fdump-tree-phiprop-details" } */ struct f { @@ -16,5 +16,5 @@ int g(int i, int c, struct f *ff, int g) return *t; } -/* { dg-final { scan-tree-dump-not "\\*t" "phiprop" } } */ +/* { dg-final { scan-tree-dump-times "Inserting PHI for result of load" 1 "phiprop" } } */ /* { dg-final { cleanup-tree-dump "phiprop" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c index b61674dff3a..6db9ba0d871 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-alias" } */ +/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */ extern void abort (void); struct X { @@ -22,5 +22,5 @@ foo(int i, int j, int k, int off) return *q; } -/* { dg-final { scan-tree-dump "q_., points-to vars: { k }" "alias" } } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ +/* { dg-final { scan-tree-dump "q_., points-to vars: { k }" "ealias" } } */ +/* { dg-final { cleanup-tree-dump "ealias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c index adb01b23165..85b96b190e2 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-alias" } */ +/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */ extern void abort (void); struct X { @@ -22,5 +22,5 @@ foo(int i, int j, int k, int off) return *q; } -/* { dg-final { scan-tree-dump "q_., points-to vars: { i }" "alias" } } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ +/* { dg-final { scan-tree-dump "q_., points-to vars: { i }" "ealias" } } */ +/* { dg-final { cleanup-tree-dump "ealias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c index 3b23c36238e..3f4adf43483 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c @@ -21,5 +21,9 @@ int bar (void) return q->i; } -/* { dg-final { scan-tree-dump-times "a.b.i" 2 "ccp1" } } */ +/* The first access is through struct A, so a.b.i is fine, + the second access needs to preserve the original access type struct B. */ + +/* { dg-final { scan-tree-dump-times "a.b.i" 1 "ccp1" } } */ +/* { dg-final { scan-tree-dump-times "MEM\\\[\\\(struct B \\\*\\\)&a\\\].i" 1 "ccp1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c index ac7f068cfd1..fb4af2d484d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c @@ -15,5 +15,5 @@ int foo (void) return *x; } -/* { dg-final { scan-tree-dump "a.i\\\[1\\\]" "ccp1" } } */ +/* { dg-final { scan-tree-dump "MEM\\\[\\\(int \\\*\\\)&a \\\+ 4B\\\]" "ccp1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c index f29c4942ace..7912a57f09e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c @@ -9,6 +9,6 @@ int foo(int i) } /* { dg-final { scan-tree-dump "&a\\\[\[iD\]\\\." "ccp1" } } */ -/* { dg-final { scan-tree-dump "= a\\\[\[iD\]\\\." "forwprop1" } } */ +/* { dg-final { scan-tree-dump "= .*&a\\\]\\\[\[iD\]\\\." "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c index 542c4293960..c0a548155cb 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c @@ -7,5 +7,5 @@ int foo(int i) return (a + 1)[i]; } -/* { dg-final { scan-tree-dump "= a\\\[D\\\." "forwprop1" } } */ +/* { dg-final { scan-tree-dump "=.*&a\\\]\\\[D\\\." "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-29.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-29.c new file mode 100644 index 00000000000..44d2945a311 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-29.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-ccp2" } */ + +static double num; +int foo (void) +{ + return *(unsigned *)# +} + +/* { dg-final { scan-tree-dump "return 0;" "ccp2" } } */ +/* { dg-final { cleanup-tree-dump "ccp2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c index 0cb63242c0e..b9ec6bc720f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c @@ -11,6 +11,5 @@ int f(int *a) return *c + t; } -/* { dg-final { scan-tree-dump "Replaced \\\(int \\\*\\\) b_.*with a_" "fre" } } */ -/* { dg-final { scan-tree-dump "Replaced \\\*c_.*with t_" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced \\\*a_\[^\n\].*with t_" "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c index ae9eb5a2002..972e6c69ef9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c @@ -23,6 +23,5 @@ void foo(double (*q)[4], struct Foo *tmp1) } } -/* { dg-final { scan-tree-dump "Inserted .* &a" "fre" } } */ -/* { dg-final { scan-tree-dump "Replaced tmp1_.\\\(D\\\)->data" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced tmp1_.\\\(D\\\)->data with &a" "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c index 81b82fe4880..9d1b3f2ba92 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c @@ -27,6 +27,5 @@ void foo(double (*q)[4]) bar(a); } -/* { dg-final { scan-tree-dump "Inserted .* &a" "fre" } } */ -/* { dg-final { scan-tree-dump "Replaced tmp1.data" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced tmp1.data with &a" "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c index 978b7abab3a..b986bdd92a9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Os -fdump-tree-pre-details" } */ +/* { dg-options "-O -fdump-tree-fre-details" } */ typedef union { @@ -23,5 +23,5 @@ void foo(SA* pResult, SB* method, SC* self) pResult->data = pResult->data; } -/* { dg-final { scan-tree-dump "Deleted redundant store" "pre" } } */ -/* { dg-final { cleanup-tree-dump "pre" } } */ +/* { dg-final { scan-tree-dump "Deleted redundant store" "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c index c87f62e69c6..f87476a3a9f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c @@ -7,6 +7,6 @@ foo (int *array) return array[1]; return 0; } -/* We should eliminate one address calculation, and one load. */ -/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "fre"} } */ +/* We should eliminate one load. */ +/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "fre"} } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c index fe41966a6d4..7caf4eec6f8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c @@ -23,5 +23,5 @@ int vnum_test8(int *data) } /* We should eliminate m - n, n + k, set data[5] = 0, eliminate the address arithmetic for data[5], and set p = 0. -/* { dg-final { scan-tree-dump-times "Eliminated: 7" 1 "fre"} } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 5" 1 "fre"} } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c index 78e92d769e4..7dc7833647b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c @@ -1,5 +1,5 @@ /* { dg-do "compile" } */ -/* { dg-options "-O2 -fdump-tree-fre" } */ +/* { dg-options "-O2 -fdump-tree-fre-details" } */ struct S { float f; }; int __attribute__((noinline)) @@ -11,5 +11,5 @@ foo (float *r, struct S *p) return i + *q; } -/* { dg-final { scan-tree-dump-times "\\\*q" 1 "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced\[^\n\]*with i_." "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c index aa9e142bba0..812dac928da 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c @@ -12,7 +12,8 @@ foo ( struct S *p) } -/* There should only be one load of p->f because fwprop can change *(int *)&p->f into just (int)p->f. */ -/* { dg-final { scan-tree-dump-times "p_.\\\(D\\\)->f" 1 "fre" } } */ +/* There should only be one load of p->f because fwprop can change + *(int *)&p->f into just (int)p->f. */ +/* { dg-final { scan-tree-dump-times "= \[^\n\]*p_.\\\(D\\\)" 1 "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp50.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp50.c new file mode 100644 index 00000000000..bf21672c61a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp50.c @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int +foo (unsigned int i, unsigned int j) +{ + i &= 15; + j &= 15; + i += 1024; + j += 2048; + i &= j; + return i < 16; +} + +int +bar (int i) +{ + int c = 2; + c &= i > 6; + return c == 0; +} + +int baz (int x, int y) +{ + x &= 15; + y &= 15; + x += 4; + y += 16; + x &= y; + return x < 20; +} + +/* { dg-final { scan-tree-dump "Folding predicate i_\[^\n\r\]* to 1" "vrp1" } } */ +/* { dg-final { scan-tree-dump "Folding predicate c_\[^\n\r\]* to 1" "vrp1" } } */ +/* { dg-final { scan-tree-dump "Folding predicate x_\[^\n\r\]* to 1" "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp51.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp51.c new file mode 100644 index 00000000000..66aa5ed6d6b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp51.c @@ -0,0 +1,58 @@ +/* PR tree-optimization/28632 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-vrp" } */ + +void +v4 (unsigned a, unsigned b) +{ + if (a < 0x1000) return; + if (a > 0x1000) return; + if (b < 0x0110) return; + /* constant true. */ + if (!__builtin_constant_p ((a|b) >= 0x01000)) + __asm__("bug.always.true"); + /* VRP must not think that this is constant. */ + if (__builtin_constant_p ((a|b) >= 0x10000)) + __asm__("bug.not.always.true"); +} + +void +u4 (unsigned n) +{ + if (n > 0x10111) return; + if (n < 0x10101) return; + /* always true. */ + if (!__builtin_constant_p (n & 0x00100)) + __asm__("bug.always.true"); + /* VRP must not think that this is constant true. */ + if (__builtin_constant_p (n & 0x00001)) + __asm__("bug.not.always.true"); + /* Out of range, always evaluates to constant false. */ + if (!__builtin_constant_p (n & 0x01000)) + __asm__("bug.always.false"); +} + +void +u5 (unsigned n) +{ + struct s {unsigned exp:8;} x; + x.exp = n; + if (__builtin_constant_p(((n + 1) & 255) > 1)) + __asm__("bug.not.always.true"); +} + +void +v5 (int a, int b) +{ + if (a < 0x1000) return; + if (a > 0x1000) return; + if (b < 0x0110) return; + /* constant true. */ + if (!__builtin_constant_p ((a|b) >= 0x01000)) + __asm__("bug.always.true"); + /* VRP must not think that this is always true. */ + if (__builtin_constant_p ((a|b) >= 0x10000)) + __asm__("bug.not.always.true"); +} + +/* { dg-final { scan-assembler-not "bug\." } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp52.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp52.c new file mode 100644 index 00000000000..7d530e24688 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp52.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int +foo (unsigned int i, unsigned int j) +{ + i &= 15; + j &= 15; + i += 1024; + j += 2048; + i |= j; + return i >= 1024 + 2048; +} + +/* { dg-final { scan-tree-dump "Folding predicate i_\[^\n\r\]* to 1" "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp53.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp53.c new file mode 100644 index 00000000000..66bbfb67b90 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp53.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int +f1 (int x) +{ + x &= 0xff; + x += 0x400; + x &= 0x7ff; + return x; +} + +int +f2 (int x) +{ + x &= 0xff; + x += 0x5400; + x |= 0x4400; + return x; +} + +/* { dg-final { scan-tree-dump-not "\& (2047|0x7ff)" "vrp1" } } */ +/* { dg-final { scan-tree-dump-not "\\| (17408|0x4400)" "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-fast-math-vect-pr29925.c b/gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-fast-math-vect-pr29925.c index 5627c265523..d5c0a1a1331 100644 --- a/gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-fast-math-vect-pr29925.c +++ b/gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-fast-math-vect-pr29925.c @@ -13,7 +13,7 @@ interp_pitch(float *exc, float *interp, int pitch, int len) for (i=0;i<len;i++) { float tmp = 0; - for (k=0;k<7;k++) + for (k=0;k<12;k++) { tmp += exc[i-pitch+k+maxj-6]; } @@ -23,7 +23,7 @@ interp_pitch(float *exc, float *interp, int pitch, int len) int main() { - float *exc = calloc(126,sizeof(float)); + float *exc = calloc(136,sizeof(float)); float *interp = calloc(80,sizeof(float)); int pitch = -35; diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-31d.c b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-31d.c deleted file mode 100644 index d9ea5d12638..00000000000 --- a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-31d.c +++ /dev/null @@ -1,51 +0,0 @@ -/* { dg-require-effective-target vect_int } */ - -#include <stdarg.h> -#include "../../tree-vect.h" - -#define N 5 - -struct t{ - int k[N]; - int l; -}; - -struct s{ - char a; /* aligned */ - char b[N-1]; /* unaligned (offset 1B) */ - char c[N]; /* aligned (offset NB) */ - struct t d; /* aligned (offset 2NB) */ - struct t e; /* unaligned (offset 2N+4N+4 B) */ -}; - -int main1 () -{ - int i; - struct s tmp; - - /* unaligned */ - for (i = 0; i < N; i++) - { - tmp.e.k[i] = 8; - } - - /* check results: */ - for (i = 0; i < N; i++) - { - if (tmp.e.k[i] != 8) - abort (); - } - - return 0; -} - -int main (void) -{ - check_vect (); - - return main1 (); -} - -/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */ -/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-68d.c b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-68d.c deleted file mode 100644 index 7fc25946587..00000000000 --- a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-68d.c +++ /dev/null @@ -1,50 +0,0 @@ -/* { dg-require-effective-target vect_int } */ - -#include <stdarg.h> -#include "../../tree-vect.h" - -#define N 11 - -struct s{ - int m; - int n[N][N][N]; -}; - -struct test1{ - struct s a; /* array a.n is unaligned */ - int b; - int c; - struct s e; /* array e.n is aligned */ -}; - -int main1 () -{ - int i,j; - struct test1 tmp1; - - /* 4. unaligned */ - for (i = 3; i < N-3; i++) - { - tmp1.e.n[1][2][i] = 8; - } - - /* check results: */ - for (i = 3; i <N-3; i++) - { - if (tmp1.e.n[1][2][i] != 8) - abort (); - } - - return 0; -} - -int main (void) -{ - check_vect (); - - return main1 (); -} - -/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */ -/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76a.c b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76a.c index 41fe3aebf90..d11a9a2d781 100644 --- a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76a.c +++ b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76a.c @@ -3,7 +3,7 @@ #include <stdarg.h> #include "../../tree-vect.h" -#define N 8 +#define N 16 #define OFF 4 /* Check handling of accesses for which the "initial condition" - diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76b.c b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76b.c index 8723d266f9d..d716b613946 100644 --- a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76b.c +++ b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76b.c @@ -3,7 +3,7 @@ #include <stdarg.h> #include "../../tree-vect.h" -#define N 8 +#define N 16 #define OFF 4 /* Check handling of accesses for which the "initial condition" - diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-fast-math-vect-pr29925.c b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-fast-math-vect-pr29925.c index 5627c265523..d5c0a1a1331 100644 --- a/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-fast-math-vect-pr29925.c +++ b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-fast-math-vect-pr29925.c @@ -13,7 +13,7 @@ interp_pitch(float *exc, float *interp, int pitch, int len) for (i=0;i<len;i++) { float tmp = 0; - for (k=0;k<7;k++) + for (k=0;k<12;k++) { tmp += exc[i-pitch+k+maxj-6]; } @@ -23,7 +23,7 @@ interp_pitch(float *exc, float *interp, int pitch, int len) int main() { - float *exc = calloc(126,sizeof(float)); + float *exc = calloc(136,sizeof(float)); float *interp = calloc(80,sizeof(float)); int pitch = -35; diff --git a/gcc/testsuite/gcc.dg/vect/pr35821-altivec.c b/gcc/testsuite/gcc.dg/vect/pr35821-altivec.c deleted file mode 100644 index 79fa926ec67..00000000000 --- a/gcc/testsuite/gcc.dg/vect/pr35821-altivec.c +++ /dev/null @@ -1,24 +0,0 @@ -/* { dg-do compile { target { powerpc_altivec_ok } } } */ - -#include "altivec.h" - -void -foo (float f_gain1, int n_tail, float * __restrict__ f_in_hptr, - float * __restrict__ f_out_hptr) -{ - int i; - vector float *v_f_in_hptr, *v_f_out_hptr; - - f_in_hptr = ( float* )v_f_in_hptr; - f_out_hptr = ( float* )v_f_out_hptr; - - for( i = 0 ; i < n_tail ; i++ ) { - f_out_hptr[0] = f_in_hptr[0] * f_gain1; - f_in_hptr++; - f_out_hptr++; - } -} - -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ -/* { dg-final { cleanup-tree-dump "vect" } } */ - diff --git a/gcc/testsuite/gcc.dg/vect/pr35821-spu.c b/gcc/testsuite/gcc.dg/vect/pr35821-spu.c deleted file mode 100644 index 4cc255f07ee..00000000000 --- a/gcc/testsuite/gcc.dg/vect/pr35821-spu.c +++ /dev/null @@ -1,22 +0,0 @@ -/* { dg-do compile { target { spu-*-* } } } */ - -void -foo (float f_gain1, int n_tail, float * __restrict__ f_in_hptr, - float * __restrict__ f_out_hptr) -{ - int i; - __attribute__((__spu_vector__)) float *v_f_in_hptr, *v_f_out_hptr; - - f_in_hptr = ( float* )v_f_in_hptr; - f_out_hptr = ( float* )v_f_out_hptr; - - for( i = 0 ; i < n_tail ; i++ ) { - f_out_hptr[0] = f_in_hptr[0] * f_gain1; - f_in_hptr++; - f_out_hptr++; - } -} - -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ -/* { dg-final { cleanup-tree-dump "vect" } } */ - diff --git a/gcc/testsuite/gcc.dg/vect/slp-perm-1.c b/gcc/testsuite/gcc.dg/vect/slp-perm-1.c index afd66b63461..fcaef1e3966 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-perm-1.c +++ b/gcc/testsuite/gcc.dg/vect/slp-perm-1.c @@ -42,16 +42,18 @@ int main (int argc, const char* argv[]) for (i = 0; i < N; i++) { input[i] = i%256; - if (input[i] > 200) - abort(); output[i] = 0; + __asm__ volatile (""); } foo (input, output); for (i = 0; i < N; i++) - if (output[i] != check_results[i]) - abort (); + { + if (output[i] != check_results[i]) + abort (); + __asm__ volatile (""); + } return 0; } diff --git a/gcc/testsuite/gcc.dg/vect/slp-perm-2.c b/gcc/testsuite/gcc.dg/vect/slp-perm-2.c index a033498d5b6..e6851911413 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-perm-2.c +++ b/gcc/testsuite/gcc.dg/vect/slp-perm-2.c @@ -37,16 +37,18 @@ int main (int argc, const char* argv[]) for (i = 0; i < N; i++) { input[i] = i%256; - if (input[i] > 200) - abort(); output[i] = 0; + __asm__ volatile (""); } foo (input, output); for (i = 0; i < N; i++) - if (output[i] != check_results[i]) - abort (); + { + if (output[i] != check_results[i]) + abort (); + __asm__ volatile (""); + } return 0; } diff --git a/gcc/testsuite/gcc.dg/vect/slp-perm-3.c b/gcc/testsuite/gcc.dg/vect/slp-perm-3.c index 33c09a6d449..e83124f34cb 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-perm-3.c +++ b/gcc/testsuite/gcc.dg/vect/slp-perm-3.c @@ -51,16 +51,18 @@ int main (int argc, const char* argv[]) for (i = 0; i < N; i++) { input[i] = i%256; - if (input[i] > 200) - abort(); output[i] = 0; + __asm__ volatile (""); } foo (input, output); - for (i = 0; i < N - N; i++) - if (output[i] != check_results[i]) - abort (); + for (i = 0; i < N; i++) + { + if (output[i] != check_results[i]) + abort (); + __asm__ volatile (""); + } return 0; } diff --git a/gcc/testsuite/gcc.dg/vect/slp-perm-4.c b/gcc/testsuite/gcc.dg/vect/slp-perm-4.c index 867dfd4aa90..91a423249f8 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-perm-4.c +++ b/gcc/testsuite/gcc.dg/vect/slp-perm-4.c @@ -69,11 +69,12 @@ int main (int argc, const char* argv[]) if (input[i] > 200) abort(); output[i] = 0; + __asm__ volatile (""); } foo (input, output); - for (i = 0; i < N - N; i++) + for (i = 0; i < N; i++) if (output[i] != check_results[i]) abort (); diff --git a/gcc/testsuite/gcc.dg/vect/tree-vect.h b/gcc/testsuite/gcc.dg/vect/tree-vect.h index 2f21c2b1673..ed59d7976b9 100644 --- a/gcc/testsuite/gcc.dg/vect/tree-vect.h +++ b/gcc/testsuite/gcc.dg/vect/tree-vect.h @@ -41,6 +41,11 @@ check_vect (void) want_level = 1, want_c = bit_SSSE3, want_d = 0; # else want_level = 1, want_c = 0, want_d = bit_SSE2; +# if defined(__sun__) && defined(__svr4__) + /* Before Solaris 9 4/04, trying to execute an SSE2 instruction gives + SIGILL even if the CPU can handle them. */ + asm volatile ("unpcklpd %xmm0,%xmm2"); +# endif # endif if (!__get_cpuid (want_level, &a, &b, &c, &d) diff --git a/gcc/testsuite/gcc.dg/vect/vect-109.c b/gcc/testsuite/gcc.dg/vect/vect-109.c index 393909312bd..ddba2635bff 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-109.c +++ b/gcc/testsuite/gcc.dg/vect/vect-109.c @@ -72,8 +72,8 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { target vect_hw_misalign } } } */ /* { dg-final { scan-tree-dump-times "not vectorized: unsupported unaligned store" 2 "vect" { xfail vect_hw_misalign } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 10 "vect" { target vect_hw_misalign } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" { target vect_hw_misalign } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-42.c b/gcc/testsuite/gcc.dg/vect/vect-42.c index 3ba1c6f7fde..fa832008698 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-42.c +++ b/gcc/testsuite/gcc.dg/vect/vect-42.c @@ -65,6 +65,7 @@ int main (void) /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 3 "vect" { target vect_no_align } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { { ! vector_alignment_reachable } && { ! vect_hw_misalign } } } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail { vect_no_align || { ! vector_alignment_reachable } } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || { ! vector_alignment_reachable } } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail { vect_no_align || { { ! vector_alignment_reachable } || vect_hw_misalign } } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" { target vect_hw_misalign } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || { { ! vector_alignment_reachable } || vect_hw_misalign } } } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-56.c b/gcc/testsuite/gcc.dg/vect/vect-56.c index 7b7da123591..1555d41df6f 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-56.c +++ b/gcc/testsuite/gcc.dg/vect/vect-56.c @@ -68,6 +68,8 @@ int main (void) } /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { target { vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { xfail { vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { vect_hw_misalign } } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-60.c b/gcc/testsuite/gcc.dg/vect/vect-60.c index cbdf63db123..ba8ffe65400 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-60.c +++ b/gcc/testsuite/gcc.dg/vect/vect-60.c @@ -69,6 +69,8 @@ int main (void) } /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { target { vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { xfail { vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { vect_hw_misalign } } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-93.c b/gcc/testsuite/gcc.dg/vect/vect-93.c index 85666d9e699..dfb98cfd541 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-93.c +++ b/gcc/testsuite/gcc.dg/vect/vect-93.c @@ -72,7 +72,7 @@ int main (void) /* main && main1 together: */ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { target { vect_no_align && {! vector_alignment_reachable} } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" { xfail { { vect_no_align } || {! vector_alignment_reachable} } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" { xfail { { vect_no_align } || { { ! vector_alignment_reachable} || vect_hw_misalign } } } } } */ /* in main1: */ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target !powerpc*-*-* !i?86-*-* !x86_64-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-96.c b/gcc/testsuite/gcc.dg/vect/vect-96.c index f392169f770..c7dea6123a8 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-96.c +++ b/gcc/testsuite/gcc.dg/vect/vect-96.c @@ -44,6 +44,6 @@ int main (void) /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { target { {! vect_no_align} && vector_alignment_reachable } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { { vect_no_align } || {! vector_alignment_reachable} } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { { vect_no_align } || { { ! vector_alignment_reachable} || vect_hw_misalign } } } } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 1 "vect" { target { vect_no_align || { {! vector_alignment_reachable} && {! vect_hw_misalign} } } } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c b/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c index e8fe027f5f3..7981c4a475f 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c +++ b/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c @@ -27,13 +27,13 @@ __attribute__ ((noinline)) int main1 (int n) for (i = 0; i < n; i++) { sa[i+7] = sb[i]; - ia[i+3] = ib[i]; + ia[i+3] = ib[i+1]; } /* check results: */ for (i = 0; i < n; i++) { - if (sa[i+7] != sb[i] || ia[i+3] != ib[i]) + if (sa[i+7] != sb[i] || ia[i+3] != ib[i+1]) abort (); } @@ -44,7 +44,9 @@ __attribute__ ((noinline)) int main1 (int n) access for peeling, and therefore will examine the option of using a peeling factor = (V-3)%V = 1 for V=2,4. This will not align the access 'sa[i+3]' (for which we need to - peel 5 iterations), so the loop can not be vectorized. */ + peel 5 iterations). However, 'ia[i+3]' also gets aligned if we peel 5 + iterations, so the loop is vectorizable on all targets that support + unaligned loads. */ __attribute__ ((noinline)) int main2 (int n) { @@ -55,13 +57,13 @@ __attribute__ ((noinline)) int main2 (int n) for (i = 0; i < n; i++) { ia[i+3] = ib[i]; - sa[i+3] = sb[i]; + sa[i+3] = sb[i+1]; } /* check results: */ for (i = 0; i < n; i++) { - if (sa[i+3] != sb[i] || ia[i+3] != ib[i]) + if (sa[i+3] != sb[i+1] || ia[i+3] != ib[i]) abort (); } @@ -78,11 +80,8 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail {! vect_hw_misalign} } } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail {! vect_hw_misalign} } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { vect_no_align } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail { vect_no_align } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail { vect_no_align } } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c b/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c index 274fb025319..3a83491065f 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c +++ b/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c @@ -20,7 +20,9 @@ unsigned int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45, access for peeling, and therefore will examine the option of using a peeling factor = VF-7%VF. This will result in a peeling factor 1, which will also align the access to 'ia[i+3]', and the loop could be - vectorized on all targets that support unaligned loads. */ + vectorized on all targets that support unaligned loads. + Without cost model on targets that support misaligned stores, no peeling + will be applied since we want to keep the four loads aligned. */ __attribute__ ((noinline)) int main1 (int n) @@ -50,7 +52,11 @@ int main1 (int n) using a peeling factor = VF-3%VF. This will result in a peeling factor 1 if VF=4,2. This will not align the access to 'sa[i+3]', for which we need to peel 5,1 iterations for VF=4,2 respectively, so the loop can not - be vectorized. */ + be vectorized. However, 'ia[i+3]' also gets aligned if we peel 5 + iterations, so the loop is vectorizable on all targets that support + unaligned loads. + Without cost model on targets that support misaligned stores, no peeling + will be applied since we want to keep the four loads aligned. */ __attribute__ ((noinline)) int main2 (int n) @@ -85,11 +91,10 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail {! vect_hw_misalign} } } } */ -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail {! vect_hw_misalign} } } } */ -/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 8 "vect" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { vect_no_align } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { vect_hw_misalign} } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 8 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { target { vect_hw_misalign } } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-peel-1.c b/gcc/testsuite/gcc.dg/vect/vect-peel-1.c new file mode 100644 index 00000000000..ae7746389d3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-peel-1.c @@ -0,0 +1,51 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdarg.h> +#include "tree-vect.h" + +#define N 128 + +int ib[N+5]; + +__attribute__ ((noinline)) +int main1 () +{ + int i; + int ia[N+1]; + + /* All the accesses are misaligned. With cost model disabled, we count the + the number of aligned accesses for each peeling option, and in this case + we align the two loads if possible (i.e., if misaligned stores are + supported). */ + for (i = 1; i <= N; i++) + { + ia[i] = ib[i+2] + ib[i+6]; + } + + /* check results: */ + for (i = 1; i <= N; i++) + { + if (ia[i] != ib[i+2] + ib[i+6]) + abort (); + } + + return 0; +} + +int main (void) +{ + int i; + + check_vect (); + + for (i = 0; i < N+5; i++) + ib[i] = i; + + return main1 (); +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail vect_no_align } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { target vect_hw_misalign } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-peel-2.c b/gcc/testsuite/gcc.dg/vect/vect-peel-2.c new file mode 100644 index 00000000000..ee7b8dbe62e --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-peel-2.c @@ -0,0 +1,52 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdarg.h> +#include "tree-vect.h" + +#define N 128 + +/* unaligned store. */ + +int ib[N+5]; + +__attribute__ ((noinline)) +int main1 () +{ + int i; + int ia[N+1]; + + /* The store is aligned and the loads are misaligned with the same + misalignment. Cost model is disabled. If misaligned stores are supported, + we peel according to the loads to align them. */ + for (i = 0; i <= N; i++) + { + ia[i] = ib[i+2] + ib[i+6]; + } + + /* check results: */ + for (i = 1; i <= N; i++) + { + if (ia[i] != ib[i+2] + ib[i+6]) + abort (); + } + + return 0; +} + +int main (void) +{ + int i; + + check_vect (); + + for (i = 0; i < N+5; i++) + ib[i] = i; + + return main1 (); +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail vect_no_align } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { target vect_hw_misalign } } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_hw_misalign } } } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target vect_hw_misalign } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-peel-3.c b/gcc/testsuite/gcc.dg/vect/vect-peel-3.c new file mode 100644 index 00000000000..80f03c8d8af --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-peel-3.c @@ -0,0 +1,55 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdarg.h> +#include <stdio.h> +#include "tree-vect.h" + +#define N 128 +#define RES 21888 + +/* unaligned store. */ + +int ib[N+10]; +int ia[N+10]; +int ic[N+10]; + +__attribute__ ((noinline)) +int main1 () +{ + int i, suma = 0, sumb = 0, sumc = 0; + + /* ib and ic have same misalignment, we peel to align them. */ + for (i = 1; i <= N; i++) + { + suma += ia[i]; + sumb += ib[i+6]; + sumc += ic[i+2]; + } + + /* check results: */ + if (suma + sumb + sumc != RES) + abort (); + + return 0; +} + +int main (void) +{ + int i; + + check_vect (); + + for (i = 0; i < N+10; i++) + { + ib[i] = i; + ic[i] = i+2; + ia[i] = i/2; + } + + return main1 (); +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-peel-4.c b/gcc/testsuite/gcc.dg/vect/vect-peel-4.c new file mode 100644 index 00000000000..971d02334ac --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-peel-4.c @@ -0,0 +1,47 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdarg.h> +#include "tree-vect.h" + +#define N 128 + +int ib[N+5]; + +__attribute__ ((noinline)) +int main1 () +{ + int i; + int ia[N+1]; + + /* Don't peel keeping one load and the store aligned. */ + for (i = 0; i <= N; i++) + { + ia[i] = ib[i] + ib[i+6]; + } + + /* check results: */ + for (i = 1; i <= N; i++) + { + if (ia[i] != ib[i] + ib[i+6]) + abort (); + } + + return 0; +} + +int main (void) +{ + int i; + + check_vect (); + + for (i = 0; i < N+5; i++) + ib[i] = i; + + return main1 (); +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */ +/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" } } */ +/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-6.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-6.c index 4b27be8c694..3f8e2ec69a0 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-reduc-6.c +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-6.c @@ -49,5 +49,6 @@ int main (void) } /* need -ffast-math to vectorizer these loops. */ -/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */ +/* ARM NEON passes -ffast-math to these tests, so expect this to fail. */ +/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" { xfail arm_neon_ok } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect.exp b/gcc/testsuite/gcc.dg/vect/vect.exp index 24717c844cc..a68d8c65f6e 100644 --- a/gcc/testsuite/gcc.dg/vect/vect.exp +++ b/gcc/testsuite/gcc.dg/vect/vect.exp @@ -67,11 +67,8 @@ if [istarget "powerpc-*paired*"] { } elseif { [istarget "spu-*-*"] } { set dg-do-what-default run } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { - if { ![check_effective_target_sse2] } then { - return - } lappend DEFAULT_VECTCFLAGS "-msse2" - if [check_sse2_hw_available] { + if { [check_effective_target_sse2_runtime] } { set dg-do-what-default run } else { set dg-do-what-default compile @@ -105,6 +102,10 @@ if [istarget "powerpc-*paired*"] { set dg-do-what-default run } elseif [is-effective-target arm_neon_ok] { eval lappend DEFAULT_VECTCFLAGS [add_options_for_arm_neon ""] + # NEON does not support denormals, so is not used for vectorization by + # default to avoid loss of precision. We must pass -ffast-math to test + # vectorization of float operations. + lappend DEFAULT_VECTCFLAGS "-ffast-math" if [is-effective-target arm_neon_hw] { set dg-do-what-default run } else { diff --git a/gcc/testsuite/gcc.dg/volatile2.c b/gcc/testsuite/gcc.dg/volatile2.c index 4bfc441c862..d663123c83d 100644 --- a/gcc/testsuite/gcc.dg/volatile2.c +++ b/gcc/testsuite/gcc.dg/volatile2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-gimple -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ struct GTeth_desc { @@ -12,14 +12,11 @@ struct GTeth_softc void foo(struct GTeth_softc *sc) { - /* Verify that we retain the cast to (volatile struct GTeth_desc *) - after gimplification and that we keep the volatileness on the + /* Verify that we retain the volatileness on the store until after optimization. */ volatile struct GTeth_desc *p = &sc->txq_desc[0]; p->ed_cmdsts = 0; } -/* { dg-final { scan-tree-dump "\\(volatile struct GTeth_desc \\*\\) D" "gimple" } } */ /* { dg-final { scan-tree-dump "{v}" "optimized" } } */ -/* { dg-final { cleanup-tree-dump "gimple" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/arm/interrupt-1.c b/gcc/testsuite/gcc.target/arm/interrupt-1.c new file mode 100644 index 00000000000..18379de33d0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/interrupt-1.c @@ -0,0 +1,23 @@ +/* Verify that prologue and epilogue are correct for functions with + __attribute__ ((interrupt)). */ +/* { dg-do compile } */ +/* { dg-options "-O0" } */ + +/* This test is not valid when -mthumb. We just cheat. */ +#ifndef __thumb__ +extern void bar (int); +extern void foo (void) __attribute__ ((interrupt("IRQ"))); + +void foo () +{ + bar (0); +} +#else +void foo () +{ + asm ("stmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, lr}"); + asm ("ldmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, pc}^"); +} +#endif +/* { dg-final { scan-assembler "stmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, lr}" } } */ +/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, pc}\\^" } } */ diff --git a/gcc/testsuite/gcc.target/arm/interrupt-2.c b/gcc/testsuite/gcc.target/arm/interrupt-2.c new file mode 100644 index 00000000000..b979bf17e8a --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/interrupt-2.c @@ -0,0 +1,26 @@ +/* Verify that prologue and epilogue are correct for functions with + __attribute__ ((interrupt)). */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +/* This test is not valid when -mthum. We just cheat. */ +#ifndef __thumb__ +extern void bar (int); +extern void test (void) __attribute__((__interrupt__)); + +int foo; +void test() +{ + funcptrs(foo); + foo = 0; +} +#else +void test () +{ + asm ("stmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, lr}"); + asm ("ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, pc}^"); +} +#endif + +/* { dg-final { scan-assembler "stmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, lr}" } } */ +/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, pc}\\^" } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon-vadds64.c b/gcc/testsuite/gcc.target/arm/neon-vadds64.c new file mode 100644 index 00000000000..284a1d8adc9 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vadds64.c @@ -0,0 +1,21 @@ +/* Test the `vadd_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeef00000000LL; + int64x1_t arg1_int64x1_t = (int64x1_t)0x00000000deadbeefLL; + + out_int64x1_t = vadd_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0xdeadbeefdeadbeefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vaddu64.c b/gcc/testsuite/gcc.target/arm/neon-vaddu64.c new file mode 100644 index 00000000000..05bda8b046e --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vaddu64.c @@ -0,0 +1,21 @@ +/* Test the `vadd_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeef00000000LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)0x00000000deadbeefLL; + + out_uint64x1_t = vadd_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0xdeadbeefdeadbeefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vands64.c b/gcc/testsuite/gcc.target/arm/neon-vands64.c new file mode 100644 index 00000000000..8b6975db6e0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vands64.c @@ -0,0 +1,21 @@ +/* Test the `vand_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeef00000000LL; + int64x1_t arg1_int64x1_t = (int64x1_t)0xdead00000000beefLL; + + out_int64x1_t = vand_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0xdead000000000000LL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vandu64.c b/gcc/testsuite/gcc.target/arm/neon-vandu64.c new file mode 100644 index 00000000000..a8ec3a28b4d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vandu64.c @@ -0,0 +1,21 @@ +/* Test the `vand_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeef00000000LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)0xdead00000000beefLL; + + out_uint64x1_t = vand_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0xdead000000000000LL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vbics64.c b/gcc/testsuite/gcc.target/arm/neon-vbics64.c new file mode 100644 index 00000000000..ec3438baef8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vbics64.c @@ -0,0 +1,21 @@ +/* Test the `vbic_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeef00000000LL; + int64x1_t arg1_int64x1_t = (int64x1_t)(~0xdead00000000beefLL); + + out_int64x1_t = vbic_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0xdead000000000000LL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vbicu64.c b/gcc/testsuite/gcc.target/arm/neon-vbicu64.c new file mode 100644 index 00000000000..a0c1b85b405 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vbicu64.c @@ -0,0 +1,21 @@ +/* Test the `vbic_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeef00000000LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)(~0xdead00000000beefLL); + + out_uint64x1_t = vbic_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0xdead000000000000LL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vdupQ_lanes64.c b/gcc/testsuite/gcc.target/arm/neon-vdupQ_lanes64.c new file mode 100644 index 00000000000..da24eaca69f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vdupQ_lanes64.c @@ -0,0 +1,22 @@ +/* Test the `vdupq_lanes64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x2_t out_int64x2_t = {0, 0}; + int64_t arg0_int64_t = (int64_t) 0xdeadbeef; + + out_int64x2_t = vdupq_lane_s64 ((int64x1_t)arg0_int64_t, 0); + if (vgetq_lane_s64 (out_int64x2_t, 0) != arg0_int64_t) + abort(); + if (vgetq_lane_s64 (out_int64x2_t, 1) != arg0_int64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vdupQ_laneu64.c b/gcc/testsuite/gcc.target/arm/neon-vdupQ_laneu64.c new file mode 100644 index 00000000000..cc19ea51252 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vdupQ_laneu64.c @@ -0,0 +1,22 @@ +/* Test the `vdupq_laneu64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x2_t out_uint64x2_t = {0, 0}; + uint64_t arg0_uint64_t = (uint64_t) 0xdeadbeef; + + out_uint64x2_t = vdupq_lane_u64 ((uint64x1_t)arg0_uint64_t, 0); + if (vgetq_lane_u64 (out_uint64x2_t, 0) != arg0_uint64_t) + abort(); + if (vgetq_lane_u64 (out_uint64x2_t, 1) != arg0_uint64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vdupQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon-vdupQ_ns64.c new file mode 100644 index 00000000000..79b4d4eb60d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vdupQ_ns64.c @@ -0,0 +1,22 @@ +/* Test the `vdupq_ns64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x2_t out_int64x2_t = {0, 0}; + int64_t arg0_int64_t = (int64_t) 0xdeadbeef; + + out_int64x2_t = vdupq_n_s64 (arg0_int64_t); + if (vgetq_lane_s64 (out_int64x2_t, 0) != arg0_int64_t) + abort(); + if (vgetq_lane_s64 (out_int64x2_t, 1) != arg0_int64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vdupQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon-vdupQ_nu64.c new file mode 100644 index 00000000000..ef6f47fd3aa --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vdupQ_nu64.c @@ -0,0 +1,22 @@ +/* Test the `vdupq_nu64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x2_t out_uint64x2_t = {0, 0}; + uint64_t arg0_uint64_t = (uint64_t) 0xdeadbeef; + + out_uint64x2_t = vdupq_n_u64 (arg0_uint64_t); + if (vgetq_lane_u64 (out_uint64x2_t, 0) != arg0_uint64_t) + abort(); + if (vgetq_lane_u64 (out_uint64x2_t, 1) != arg0_uint64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vdup_ns64.c b/gcc/testsuite/gcc.target/arm/neon-vdup_ns64.c new file mode 100644 index 00000000000..589ea22930d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vdup_ns64.c @@ -0,0 +1,20 @@ +/* Test the `vdup_ns64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64_t arg0_int64_t = (int64_t) 0xdeadbeef; + + out_int64x1_t = vdup_n_s64 (arg0_int64_t); + if ((int64_t)out_int64x1_t != arg0_int64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vdup_nu64.c b/gcc/testsuite/gcc.target/arm/neon-vdup_nu64.c new file mode 100644 index 00000000000..8bed5a0c7d7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vdup_nu64.c @@ -0,0 +1,20 @@ +/* Test the `vdup_nu64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64_t arg0_uint64_t = (uint64_t) 0xdeadbeef; + + out_uint64x1_t = vdup_n_u64 (arg0_uint64_t); + if ((uint64_t)out_uint64x1_t != arg0_uint64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-veors64.c b/gcc/testsuite/gcc.target/arm/neon-veors64.c new file mode 100644 index 00000000000..59d5baa3579 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-veors64.c @@ -0,0 +1,21 @@ +/* Test the `veor_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeef00000000LL; + int64x1_t arg1_int64x1_t = (int64x1_t)0xdead00000000beefLL; + + out_int64x1_t = veor_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0x0000beef0000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-veoru64.c b/gcc/testsuite/gcc.target/arm/neon-veoru64.c new file mode 100644 index 00000000000..b7ff77af0d5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-veoru64.c @@ -0,0 +1,21 @@ +/* Test the `veor_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeef00000000LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)0xdead00000000beefLL; + + out_uint64x1_t = veor_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0x0000beef0000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vget_lanes64.c b/gcc/testsuite/gcc.target/arm/neon-vget_lanes64.c new file mode 100644 index 00000000000..5891e66193a --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vget_lanes64.c @@ -0,0 +1,20 @@ +/* Test the `vget_lane_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64_t out_int64_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t) 0xdeadbeefbadf00dLL; + + out_int64_t = vget_lane_s64 (arg0_int64x1_t, 0); + if (out_int64_t != (int64_t)arg0_int64x1_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vget_laneu64.c b/gcc/testsuite/gcc.target/arm/neon-vget_laneu64.c new file mode 100644 index 00000000000..b0ce070d3b9 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vget_laneu64.c @@ -0,0 +1,20 @@ +/* Test the `vget_lane_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64_t out_uint64_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t) 0xdeadbeefbadf00dLL; + + out_uint64_t = vget_lane_u64 (arg0_uint64x1_t, 0); + if (out_uint64_t != (uint64_t)arg0_uint64x1_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c index 336a53bb481..9d239ed47d0 100644 --- a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c +++ b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c @@ -1,5 +1,5 @@ /* { dg-require-effective-target arm_neon_hw } */ -/* { dg-options "-O2 -ftree-vectorize" } */ +/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */ /* { dg-add-options arm_neon } */ /* { dg-final { scan-assembler "vmla\\.f32" } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c index 5e5e0c757ac..2beaebe17cf 100644 --- a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c +++ b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c @@ -1,5 +1,5 @@ /* { dg-require-effective-target arm_neon_hw } */ -/* { dg-options "-O2 -ftree-vectorize" } */ +/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */ /* { dg-add-options arm_neon } */ /* { dg-final { scan-assembler "vmls\\.f32" } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon-vmovQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon-vmovQ_ns64.c new file mode 100644 index 00000000000..5a8abdce038 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vmovQ_ns64.c @@ -0,0 +1,22 @@ +/* Test the `vmovq_ns64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x2_t out_int64x2_t = {0, 0}; + int64_t arg0_int64_t = (int64_t) 0xdeadbeef; + + out_int64x2_t = vmovq_n_s64 (arg0_int64_t); + if (vgetq_lane_s64 (out_int64x2_t, 0) != arg0_int64_t) + abort(); + if (vgetq_lane_s64 (out_int64x2_t, 1) != arg0_int64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vmovQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon-vmovQ_nu64.c new file mode 100644 index 00000000000..8012fc1753d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vmovQ_nu64.c @@ -0,0 +1,23 @@ +/* Test the `vmovq_nu64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x2_t out_uint64x2_t = {0, 0}; + uint64_t arg0_uint64_t = (uint64_t) 0xdeadbeef; + + out_uint64x2_t = vmovq_n_u64 (arg0_uint64_t); + if (vgetq_lane_u64 (out_uint64x2_t, 0) != arg0_uint64_t) + abort(); + if (vgetq_lane_u64 (out_uint64x2_t, 1) != arg0_uint64_t) + abort(); + return 0; +} + diff --git a/gcc/testsuite/gcc.target/arm/neon-vmov_ns64.c b/gcc/testsuite/gcc.target/arm/neon-vmov_ns64.c new file mode 100644 index 00000000000..c125f4a247d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vmov_ns64.c @@ -0,0 +1,20 @@ +/* Test the `vmov_ns64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64_t arg0_int64_t = (int64_t) 0xdeadbeef; + + out_int64x1_t = vmov_n_s64 (arg0_int64_t); + if ((int64_t)out_int64x1_t != arg0_int64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vmov_nu64.c b/gcc/testsuite/gcc.target/arm/neon-vmov_nu64.c new file mode 100644 index 00000000000..71ecaed134e --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vmov_nu64.c @@ -0,0 +1,20 @@ +/* Test the `vmov_nu64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64_t arg0_uint64_t = (uint64_t) 0xdeadbeef; + + out_uint64x1_t = vmov_n_u64 (arg0_uint64_t); + if ((uint64_t)out_uint64x1_t != arg0_uint64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vorns64.c b/gcc/testsuite/gcc.target/arm/neon-vorns64.c new file mode 100644 index 00000000000..364dbd1904c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vorns64.c @@ -0,0 +1,21 @@ +/* Test the `vorn_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeef00000000LL; + int64x1_t arg1_int64x1_t = (int64x1_t)(~0xdead00000000beefLL); + + out_int64x1_t = vorn_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0xdeadbeef0000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vornu64.c b/gcc/testsuite/gcc.target/arm/neon-vornu64.c new file mode 100644 index 00000000000..b352868469f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vornu64.c @@ -0,0 +1,21 @@ +/* Test the `vorn_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeef00000000LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)(~0xdead00000000beefLL); + + out_uint64x1_t = vorn_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0xdeadbeef0000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vorrs64.c b/gcc/testsuite/gcc.target/arm/neon-vorrs64.c new file mode 100644 index 00000000000..90ced9e9c86 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vorrs64.c @@ -0,0 +1,21 @@ +/* Test the `vorr_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeef00000000LL; + int64x1_t arg1_int64x1_t = (int64x1_t)0xdead00000000beefLL; + + out_int64x1_t = vorr_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0xdeadbeef0000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vorru64.c b/gcc/testsuite/gcc.target/arm/neon-vorru64.c new file mode 100644 index 00000000000..5b44afb07ab --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vorru64.c @@ -0,0 +1,21 @@ +/* Test the `vorr_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeef00000000LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)0xdead00000000beefLL; + + out_uint64x1_t = vorr_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0xdeadbeef0000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vset_lanes64.c b/gcc/testsuite/gcc.target/arm/neon-vset_lanes64.c new file mode 100644 index 00000000000..10113932711 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vset_lanes64.c @@ -0,0 +1,21 @@ +/* Test the `vset_lane_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64_t arg0_int64_t = 0xf00f00f00LL; + int64x1_t arg1_int64x1_t = (int64x1_t) 0xdeadbeefbadf00dLL; + + out_int64x1_t = vset_lane_s64 (arg0_int64_t, arg1_int64x1_t, 0); + if ((int64_t)out_int64x1_t != arg0_int64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vset_laneu64.c b/gcc/testsuite/gcc.target/arm/neon-vset_laneu64.c new file mode 100644 index 00000000000..cafc2607687 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vset_laneu64.c @@ -0,0 +1,21 @@ +/* Test the `vset_lane_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64_t arg0_uint64_t = 0xf00f00f00LL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t) 0xdeadbeefbadf00dLL; + + out_uint64x1_t = vset_lane_u64 (arg0_uint64_t, arg1_uint64x1_t, 0); + if ((uint64_t)out_uint64x1_t != arg0_uint64_t) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vsubs64.c b/gcc/testsuite/gcc.target/arm/neon-vsubs64.c new file mode 100644 index 00000000000..23947004127 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vsubs64.c @@ -0,0 +1,21 @@ +/* Test the `vsub_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + int64x1_t out_int64x1_t = 0; + int64x1_t arg0_int64x1_t = (int64x1_t)0xdeadbeefdeadbeefLL; + int64x1_t arg1_int64x1_t = (int64x1_t)0x0000beefdead0000LL; + + out_int64x1_t = vsub_s64 (arg0_int64x1_t, arg1_int64x1_t); + if (out_int64x1_t != (int64x1_t)0xdead00000000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon-vsubu64.c b/gcc/testsuite/gcc.target/arm/neon-vsubu64.c new file mode 100644 index 00000000000..0162e206ef6 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vsubu64.c @@ -0,0 +1,21 @@ +/* Test the `vsub_u64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> + +int main (void) +{ + uint64x1_t out_uint64x1_t = 0; + uint64x1_t arg0_uint64x1_t = (uint64x1_t)0xdeadbeefdeadbeefLL; + uint64x1_t arg1_uint64x1_t = (uint64x1_t)0x0000beefdead0000LL; + + out_uint64x1_t = vsub_u64 (arg0_uint64x1_t, arg1_uint64x1_t); + if (out_uint64x1_t != (uint64x1_t)0xdead00000000beefLL) + abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/neon/vadds64.c b/gcc/testsuite/gcc.target/arm/neon/vadds64.c index d3923775237..fb17e0ea3b6 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vadds64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vadds64.c @@ -17,5 +17,4 @@ void test_vadds64 (void) out_int64x1_t = vadd_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "vadd\.i64\[ \]+\[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/vaddu64.c b/gcc/testsuite/gcc.target/arm/neon/vaddu64.c index 1114725b44d..18fc500b9f2 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vaddu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vaddu64.c @@ -17,5 +17,4 @@ void test_vaddu64 (void) out_uint64x1_t = vadd_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "vadd\.i64\[ \]+\[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/vands64.c b/gcc/testsuite/gcc.target/arm/neon/vands64.c index b34abab6651..13e18fb0cbf 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vands64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vands64.c @@ -17,5 +17,4 @@ void test_vands64 (void) out_int64x1_t = vand_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "vand\[ \]+\[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/vandu64.c b/gcc/testsuite/gcc.target/arm/neon/vandu64.c index 4660272cc20..d9ddf847af3 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vandu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vandu64.c @@ -17,5 +17,4 @@ void test_vandu64 (void) out_uint64x1_t = vand_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "vand\[ \]+\[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/vbics64.c b/gcc/testsuite/gcc.target/arm/neon/vbics64.c index 41db18e2744..379db45f4db 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vbics64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vbics64.c @@ -17,5 +17,4 @@ void test_vbics64 (void) out_int64x1_t = vbic_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "vbic\[ \]+\[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/vbicu64.c b/gcc/testsuite/gcc.target/arm/neon/vbicu64.c index 9f0a047fc92..c276d65ebe3 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vbicu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vbicu64.c @@ -17,5 +17,4 @@ void test_vbicu64 (void) out_uint64x1_t = vbic_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "vbic\[ \]+\[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/vdupQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c index 987a4d3f63f..ab749a7bbad 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c @@ -16,6 +16,4 @@ void test_vdupQ_ns64 (void) out_int64x2_t = vdupq_n_s64 (arg0_int64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c index c2e5d481a3d..0ddb72decc8 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c @@ -16,6 +16,4 @@ void test_vdupQ_nu64 (void) out_uint64x2_t = vdupq_n_u64 (arg0_uint64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c index 720cc0452d2..033f1b4744c 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c @@ -16,5 +16,4 @@ void test_vdup_ns64 (void) out_int64x1_t = vdup_n_s64 (arg0_int64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c index 4033e4757dc..6888125c638 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c @@ -16,5 +16,4 @@ void test_vdup_nu64 (void) out_uint64x1_t = vdup_n_u64 (arg0_uint64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/veors64.c b/gcc/testsuite/gcc.target/arm/neon/veors64.c index 0543b22e2e1..2781be1b2cc 100644 --- a/gcc/testsuite/gcc.target/arm/neon/veors64.c +++ b/gcc/testsuite/gcc.target/arm/neon/veors64.c @@ -17,5 +17,4 @@ void test_veors64 (void) out_int64x1_t = veor_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "veor\[ \]+\[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/veoru64.c b/gcc/testsuite/gcc.target/arm/neon/veoru64.c index 1098285dc6f..19d081489ed 100644 --- a/gcc/testsuite/gcc.target/arm/neon/veoru64.c +++ b/gcc/testsuite/gcc.target/arm/neon/veoru64.c @@ -17,5 +17,4 @@ void test_veoru64 (void) out_uint64x1_t = veor_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "veor\[ \]+\[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/vget_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c index 136242900a7..5dc99424fa5 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c @@ -16,5 +16,4 @@ void test_vget_lanes64 (void) out_int64_t = vget_lane_s64 (arg0_int64x1_t, 0); } -/* { dg-final { scan-assembler "vmov\[ \]+\[rR\]\[0-9\]+, \[rR\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c index 4b44a1e8c37..496a057fc73 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c @@ -16,5 +16,4 @@ void test_vget_laneu64 (void) out_uint64_t = vget_lane_u64 (arg0_uint64x1_t, 0); } -/* { dg-final { scan-assembler "vmov\[ \]+\[rR\]\[0-9\]+, \[rR\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c index 89fe2c150fd..35936cbd43a 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c @@ -16,6 +16,4 @@ void test_vmovQ_ns64 (void) out_int64x2_t = vmovq_n_s64 (arg0_int64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c index d7d3e365ecd..e373a121865 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c @@ -16,6 +16,4 @@ void test_vmovQ_nu64 (void) out_uint64x2_t = vmovq_n_u64 (arg0_uint64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c index 6d2d61678b9..7b011282832 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c @@ -16,5 +16,4 @@ void test_vmov_ns64 (void) out_int64x1_t = vmov_n_s64 (arg0_int64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c index 9434377d2ff..b9613e06ff1 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c @@ -16,5 +16,4 @@ void test_vmov_nu64 (void) out_uint64x1_t = vmov_n_u64 (arg0_uint64_t); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vorns64.c b/gcc/testsuite/gcc.target/arm/neon/vorns64.c index eb3253743a2..d7b8e60d208 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vorns64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vorns64.c @@ -17,5 +17,4 @@ void test_vorns64 (void) out_int64x1_t = vorn_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "vorn\[ \]+\[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/vornu64.c b/gcc/testsuite/gcc.target/arm/neon/vornu64.c index a92a7d7124c..6fb3a9502a6 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vornu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vornu64.c @@ -17,5 +17,4 @@ void test_vornu64 (void) out_uint64x1_t = vorn_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "vorn\[ \]+\[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/vorrs64.c b/gcc/testsuite/gcc.target/arm/neon/vorrs64.c index eaa107cb649..a1c7e5ee222 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vorrs64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vorrs64.c @@ -17,5 +17,4 @@ void test_vorrs64 (void) out_int64x1_t = vorr_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "vorr\[ \]+\[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/vorru64.c b/gcc/testsuite/gcc.target/arm/neon/vorru64.c index 2dc4898a779..1991b02152f 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vorru64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vorru64.c @@ -17,5 +17,4 @@ void test_vorru64 (void) out_uint64x1_t = vorr_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "vorr\[ \]+\[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/vset_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c index 2c4bede7796..5c5454f9807 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c @@ -17,5 +17,4 @@ void test_vset_lanes64 (void) out_int64x1_t = vset_lane_s64 (arg0_int64_t, arg1_int64x1_t, 0); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c index 22ba53c20a9..3bff5d232c7 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c @@ -17,5 +17,4 @@ void test_vset_laneu64 (void) out_uint64x1_t = vset_lane_u64 (arg0_uint64_t, arg1_uint64x1_t, 0); } -/* { dg-final { scan-assembler "vmov\[ \]+\[dD\]\[0-9\]+, \[rR\]\[0-9\]+, \[rR\]\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */ /* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arm/neon/vsubs64.c b/gcc/testsuite/gcc.target/arm/neon/vsubs64.c index 656039989a0..57bcd33d42c 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vsubs64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vsubs64.c @@ -17,5 +17,4 @@ void test_vsubs64 (void) out_int64x1_t = vsub_s64 (arg0_int64x1_t, arg1_int64x1_t); } -/* { dg-final { scan-assembler "vsub\.i64\[ \]+\[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/vsubu64.c b/gcc/testsuite/gcc.target/arm/neon/vsubu64.c index 5e4a2a871e9..3a8ae462e81 100644 --- a/gcc/testsuite/gcc.target/arm/neon/vsubu64.c +++ b/gcc/testsuite/gcc.target/arm/neon/vsubu64.c @@ -17,5 +17,4 @@ void test_vsubu64 (void) out_uint64x1_t = vsub_u64 (arg0_uint64x1_t, arg1_uint64x1_t); } -/* { dg-final { scan-assembler "vsub\.i64\[ \]+\[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/pr39839.c b/gcc/testsuite/gcc.target/arm/pr39839.c new file mode 100644 index 00000000000..31e865af2f5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr39839.c @@ -0,0 +1,24 @@ +/* { dg-options "-mthumb -Os -march=armv5te -mthumb-interwork -fpic" } */ +/* { dg-require-effective-target arm_thumb1_ok } */ +/* { dg-final { scan-assembler-not "str\[\\t \]*r.,\[\\t \]*.sp," } } */ + +struct S +{ + int count; + char *addr; +}; + +void func(const char*, const char*, int, const char*); + +/* This function should not need to spill to the stack. */ +void test(struct S *p) +{ + int off = p->count; + while (p->count >= 0) + { + const char *s = "xyz"; + if (*p->addr) s = "pqr"; + func("abcde", p->addr + off, off, s); + p->count--; + } +} diff --git a/gcc/testsuite/gcc.target/arm/pr40657-1.c b/gcc/testsuite/gcc.target/arm/pr40657-1.c new file mode 100644 index 00000000000..a6ac6c78a1c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr40657-1.c @@ -0,0 +1,13 @@ +/* { dg-options "-Os -march=armv5te -mthumb" } */ +/* { dg-require-effective-target arm_thumb1_ok } */ +/* { dg-final { scan-assembler "pop.*r1.*pc" } } */ +/* { dg-final { scan-assembler-not "sub\[\\t \]*sp,\[\\t \]*sp" } } */ +/* { dg-final { scan-assembler-not "add\[\\t \]*sp,\[\\t \]*sp" } } */ + +extern void bar(int*); +int foo() +{ + int x; + bar(&x); + return x; +} diff --git a/gcc/testsuite/gcc.target/arm/pr40657-2.c b/gcc/testsuite/gcc.target/arm/pr40657-2.c new file mode 100644 index 00000000000..31d48376730 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr40657-2.c @@ -0,0 +1,20 @@ +/* { dg-options "-Os -march=armv4t -mthumb" } */ +/* { dg-require-effective-target arm_thumb1_ok } */ +/* { dg-final { scan-assembler-not "sub\[\\t \]*sp,\[\\t \]*sp" } } */ +/* { dg-final { scan-assembler-not "add\[\\t \]*sp,\[\\t \]*sp" } } */ + +/* Here, we test that if there's a pop of r[4567] in the epilogue, + add sp,sp,#12 is removed and replaced by three additional pops + of lower-numbered regs. */ + +extern void bar(int*); + +int t1, t2, t3, t4, t5; +int foo() +{ + int i,j,k,x = 0; + for (i = 0; i < t1; i++) + for (j = 0; j < t2; j++) + bar(&x); + return x; +} diff --git a/gcc/testsuite/gcc.target/arm/pr42172-1.c b/gcc/testsuite/gcc.target/arm/pr42172-1.c new file mode 100644 index 00000000000..207f6001fb7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr42172-1.c @@ -0,0 +1,19 @@ +/* { dg-options "-O2" } */ + +struct A { + unsigned int f1 : 3; + unsigned int f2 : 3; + unsigned int f3 : 1; + unsigned int f4 : 1; + +}; + +void init_A (struct A *this) +{ + this->f1 = 0; + this->f2 = 1; + this->f3 = 0; + this->f4 = 0; +} + +/* { dg-final { scan-assembler-times "ldr" 1 } } */ diff --git a/gcc/testsuite/gcc.target/arm/pr42235.c b/gcc/testsuite/gcc.target/arm/pr42235.c new file mode 100644 index 00000000000..478abcc0765 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr42235.c @@ -0,0 +1,11 @@ +/* { dg-options "-mthumb -O2 -march=armv5te" } */ +/* { dg-require-effective-target arm_thumb1_ok } */ +/* { dg-final { scan-assembler-not "add\[\\t \]*r.,\[\\t \]*r.,\[\\t \]*\#1" } } */ +/* { dg-final { scan-assembler-not "add\[\\t \]*r.,\[\\t \]*\#1" } } */ + +#include <string.h> + +int foo (char *x) +{ + memset (x, 0, 6); +} diff --git a/gcc/testsuite/gcc.target/arm/pr42505.c b/gcc/testsuite/gcc.target/arm/pr42505.c new file mode 100644 index 00000000000..60902c35d27 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr42505.c @@ -0,0 +1,23 @@ +/* { dg-options "-mthumb -Os -march=armv5te" } */ +/* { dg-require-effective-target arm_thumb1_ok } */ +/* { dg-final { scan-assembler-not "str\[\\t \]*r.,\[\\t \]*.sp," } } */ + +struct A { + int f1; + int f2; +}; + +int func(int c); + +/* This function should not need to spill anything to the stack. */ +int test(struct A* src, struct A* dst, int count) +{ + while (count--) { + if (!func(src->f2)) { + return 0; + } + *dst++ = *src++; + } + + return 1; +} diff --git a/gcc/testsuite/gcc.target/arm/pr42835.c b/gcc/testsuite/gcc.target/arm/pr42835.c new file mode 100644 index 00000000000..71c51ebe31c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr42835.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-mthumb -Os" } */ +/* { dg-require-effective-target arm_thumb2_ok } */ + +int foo(int *p, int i) +{ + return( (i < 0 && *p == 1) + || (i > 0 && *p == 2) ); +} + +/* { dg-final { scan-assembler-times "movne\[\\t \]*r.,\[\\t \]*#" 1 } } */ +/* { dg-final { scan-assembler-times "moveq\[\\t \]*r.,\[\\t \]*#" 1 } } */ diff --git a/gcc/testsuite/gcc.target/arm/pr43698.c b/gcc/testsuite/gcc.target/arm/pr43698.c new file mode 100644 index 00000000000..407cf7eac2c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr43698.c @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-Os -march=armv7-a" } */ +#include <stdint.h> +#include <stdlib.h> + + +char do_reverse_endian = 0; + +# define bswap_32(x) \ + ((((x) & 0xff000000) >> 24) | \ + (((x) & 0x00ff0000) >> 8) | \ + (((x) & 0x0000ff00) << 8) | \ + (((x) & 0x000000ff) << 24)) + +#define EGET(X) \ + (__extension__ ({ \ + uint64_t __res; \ + if (!do_reverse_endian) { __res = (X); \ + } else if (sizeof(X) == 4) { __res = bswap_32((X)); \ + } \ + __res; \ + })) + +void __attribute__((noinline)) X(char **phdr, char **data, int *phoff) +{ + *phdr = *data + EGET(*phoff); +} + +int main() +{ + char *phdr; + char *data = (char *)0x40164000; + int phoff = 0x34; + X(&phdr, &data, &phoff); + if (phdr != (char *)0x40164034) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.target/arm/pr44788.c b/gcc/testsuite/gcc.target/arm/pr44788.c new file mode 100644 index 00000000000..eb4bc11af9f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr44788.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_thumb2_ok } */ +/* { dg-options "-Os -fno-strict-aliasing -fPIC -mthumb -march=armv7-a -mfpu=vfp3 -mfloat-abi=softfp" } */ + +void joint_decode(float* mlt_buffer1, int t) { + int i; + float decode_buffer[1060]; + foo(decode_buffer); + for (i=0; i<10 ; i++) { + mlt_buffer1[i] = i * decode_buffer[t]; + } +} diff --git a/gcc/testsuite/gcc.target/i386/20020523.c b/gcc/testsuite/gcc.target/i386/20020523.c index 7c3490f780b..0684d5feb42 100644 --- a/gcc/testsuite/gcc.target/i386/20020523.c +++ b/gcc/testsuite/gcc.target/i386/20020523.c @@ -4,6 +4,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse -mfpmath=sse -ffast-math" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/aes-avx-check.h b/gcc/testsuite/gcc.target/i386/aes-avx-check.h index e91e88173cf..36a038ea341 100644 --- a/gcc/testsuite/gcc.target/i386/aes-avx-check.h +++ b/gcc/testsuite/gcc.target/i386/aes-avx-check.h @@ -22,7 +22,8 @@ main () return 0; /* Run AES + AVX test only if host has AES + AVX support. */ - if ((ecx & (bit_AVX | bit_AES)) == (bit_AVX | bit_AES)) + if ((ecx & (bit_AVX | bit_OSXSAVE | bit_AES)) + == (bit_AVX | bit_OSXSAVE | bit_AES)) { do_test (); #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/all_one_m128i.c b/gcc/testsuite/gcc.target/i386/all_one_m128i.c index 24d870fa37f..fa973e420ab 100644 --- a/gcc/testsuite/gcc.target/i386/all_one_m128i.c +++ b/gcc/testsuite/gcc.target/i386/all_one_m128i.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef long long __m128i __attribute__ ((__vector_size__ (16))); typedef int __v4si __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/avx-check.h b/gcc/testsuite/gcc.target/i386/avx-check.h index 7736fc9f40b..b15584ad274 100644 --- a/gcc/testsuite/gcc.target/i386/avx-check.h +++ b/gcc/testsuite/gcc.target/i386/avx-check.h @@ -20,7 +20,7 @@ main () return 0; /* Run AVX test only if host has AVX support. */ - if (ecx & bit_AVX) + if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE)) { do_test (); #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/avx-cmpsd-1.c b/gcc/testsuite/gcc.target/i386/avx-cmpsd-1.c index 65cda0b2cbf..7898606b0bc 100644 --- a/gcc/testsuite/gcc.target/i386/avx-cmpsd-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-cmpsd-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #define CHECK_H "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-cmpss-1.c b/gcc/testsuite/gcc.target/i386/avx-cmpss-1.c index b2603aad4c5..e0ee934dad5 100644 --- a/gcc/testsuite/gcc.target/i386/avx-cmpss-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-cmpss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #define CHECK_H "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-vcmppd-1.c b/gcc/testsuite/gcc.target/i386/avx-vcmppd-1.c index be69d47e822..f9646a10d12 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vcmppd-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-vcmppd-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #include "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-vcmppd-256-1.c b/gcc/testsuite/gcc.target/i386/avx-vcmppd-256-1.c index 7000bb07feb..1c169f5ac5c 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vcmppd-256-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-vcmppd-256-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #include "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-vcmpps-1.c b/gcc/testsuite/gcc.target/i386/avx-vcmpps-1.c index 753f2ce64d0..888f9eb2878 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vcmpps-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-vcmpps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #include "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-vcmpps-256-1.c b/gcc/testsuite/gcc.target/i386/avx-vcmpps-256-1.c index c1292a25555..b82abb6dcea 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vcmpps-256-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-vcmpps-256-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #include "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-vcmpsd-1.c b/gcc/testsuite/gcc.target/i386/avx-vcmpsd-1.c index 97ca6e6c50f..9b6d580289c 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vcmpsd-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-vcmpsd-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #include "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/avx-vcmpss-1.c b/gcc/testsuite/gcc.target/i386/avx-vcmpss-1.c index 627333a860c..0dd1b09228e 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vcmpss-1.c +++ b/gcc/testsuite/gcc.target/i386/avx-vcmpss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target avx } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-options "-O2 -mavx -std=c99" } */ #include "avx-check.h" diff --git a/gcc/testsuite/gcc.target/i386/brokensqrt.c b/gcc/testsuite/gcc.target/i386/brokensqrt.c index 19a59d822e6..836d3b37d4c 100644 --- a/gcc/testsuite/gcc.target/i386/brokensqrt.c +++ b/gcc/testsuite/gcc.target/i386/brokensqrt.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" extern float sqrtf (float); diff --git a/gcc/testsuite/gcc.target/i386/f16c-check.h b/gcc/testsuite/gcc.target/i386/f16c-check.h new file mode 100644 index 00000000000..af7f32c5f4f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/f16c-check.h @@ -0,0 +1,30 @@ +#include <stdlib.h> +#include <stdio.h> +#include "cpuid.h" +#include "m256-check.h" + +static void f16c_test (void); + +int +main () +{ + unsigned int eax, ebx, ecx, edx; + + if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) + return 0; + + /* Run F16C test only if host has F16C support. */ + if (ecx & bit_F16C) + { + f16c_test (); +#ifdef DEBUG + printf ("PASSED\n"); +#endif + } +#ifdef DEBUG + else + printf ("SKIPPED\n"); +#endif + + return 0; +} diff --git a/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c b/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c index bdfae5b3b7b..1a55a3d60eb 100644 --- a/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c +++ b/gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-mpreferred-stack-boundary=4 -msse" } */ /* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/fpcvt-1.c b/gcc/testsuite/gcc.target/i386/fpcvt-1.c index 5f09aedc53e..1c3b9b83453 100644 --- a/gcc/testsuite/gcc.target/i386/fpcvt-1.c +++ b/gcc/testsuite/gcc.target/i386/fpcvt-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler-not "cvtss2sd" } } */ float a,b; main() diff --git a/gcc/testsuite/gcc.target/i386/fpcvt-2.c b/gcc/testsuite/gcc.target/i386/fpcvt-2.c index 317aa13b887..066d84365ed 100644 --- a/gcc/testsuite/gcc.target/i386/fpcvt-2.c +++ b/gcc/testsuite/gcc.target/i386/fpcvt-2.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler-not "cvtss2sd" } } */ float a,b; main() diff --git a/gcc/testsuite/gcc.target/i386/fpcvt-3.c b/gcc/testsuite/gcc.target/i386/fpcvt-3.c index 70377c3d627..569d21a5aa7 100644 --- a/gcc/testsuite/gcc.target/i386/fpcvt-3.c +++ b/gcc/testsuite/gcc.target/i386/fpcvt-3.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler-not "cvtss2sd" } } */ extern double fabs (double); float a,b; diff --git a/gcc/testsuite/gcc.target/i386/funcspec-9.c b/gcc/testsuite/gcc.target/i386/funcspec-9.c index 1c05f134ab5..78714e12417 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-9.c +++ b/gcc/testsuite/gcc.target/i386/funcspec-9.c @@ -1,7 +1,6 @@ /* Test whether using target specific options, we can generate FMA4 code. */ /* { dg-do compile } */ /* { dg-options "-O2 -march=k8 -mfpmath=sse -msse2" } */ -/* { dg-require-effective-target sse2 } */ extern void exit (int); diff --git a/gcc/testsuite/gcc.target/i386/i386.exp b/gcc/testsuite/gcc.target/i386/i386.exp index 8b31231b61c..65abf58db81 100644 --- a/gcc/testsuite/gcc.target/i386/i386.exp +++ b/gcc/testsuite/gcc.target/i386/i386.exp @@ -27,8 +27,7 @@ load_lib gcc-dg.exp # Return 1 if attribute ms_hook_prologue is supported. proc check_effective_target_ms_hook_prologue { } { - if { [check_effective_target_ilp32] - && [check_no_compiler_messages ms_hook_prologue object { + if { [check_no_compiler_messages ms_hook_prologue object { void __attribute__ ((__ms_hook_prologue__)) foo (); } ""] } { return 1 diff --git a/gcc/testsuite/gcc.target/i386/incoming-1.c b/gcc/testsuite/gcc.target/i386/incoming-1.c index 9129ad00e17..86e98a79b47 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-1.c +++ b/gcc/testsuite/gcc.target/i386/incoming-1.c @@ -1,7 +1,6 @@ /* PR middle-end/37009 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -msse2 -mpreferred-stack-boundary=2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/incoming-12.c b/gcc/testsuite/gcc.target/i386/incoming-12.c index b6bfa418d90..d7ef1038bb5 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-12.c +++ b/gcc/testsuite/gcc.target/i386/incoming-12.c @@ -1,7 +1,6 @@ /* PR target/40838 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -mstackrealign -O2 -msse2 -mpreferred-stack-boundary=4" } */ -/* { dg-require-effective-target sse2 } */ typedef int v4si __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/i386/incoming-2.c b/gcc/testsuite/gcc.target/i386/incoming-2.c index 18451669612..2947d3347cd 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-2.c +++ b/gcc/testsuite/gcc.target/i386/incoming-2.c @@ -1,7 +1,6 @@ /* PR middle-end/37009 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -msse2 -mpreferred-stack-boundary=2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/incoming-3.c b/gcc/testsuite/gcc.target/i386/incoming-3.c index bb9653a4067..1edbfda0b39 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-3.c +++ b/gcc/testsuite/gcc.target/i386/incoming-3.c @@ -1,7 +1,6 @@ /* PR middle-end/37009 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -msse2 -mpreferred-stack-boundary=2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/incoming-4.c b/gcc/testsuite/gcc.target/i386/incoming-4.c index e1d1b751e7b..80c169c2469 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-4.c +++ b/gcc/testsuite/gcc.target/i386/incoming-4.c @@ -1,7 +1,6 @@ /* PR middle-end/37009 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -msse2 -mpreferred-stack-boundary=2" } */ -/* { dg-require-effective-target sse2 } */ #include <stdarg.h> #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/incoming-6.c b/gcc/testsuite/gcc.target/i386/incoming-6.c index f6b64b7abd2..5cc4ab3f766 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-6.c +++ b/gcc/testsuite/gcc.target/i386/incoming-6.c @@ -1,7 +1,6 @@ /* PR target/40838 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -mstackrealign -O2 -msse2 -mpreferred-stack-boundary=4" } */ -/* { dg-require-effective-target sse2 } */ typedef int v4si __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/i386/incoming-7.c b/gcc/testsuite/gcc.target/i386/incoming-7.c index fb5380490d6..cdd60379683 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-7.c +++ b/gcc/testsuite/gcc.target/i386/incoming-7.c @@ -1,7 +1,6 @@ /* PR target/40838 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -mstackrealign -O2 -msse2 -mpreferred-stack-boundary=4" } */ -/* { dg-require-effective-target sse2 } */ typedef int v4si __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/i386/incoming-8.c b/gcc/testsuite/gcc.target/i386/incoming-8.c index 0f27af72078..2dd8800fd6c 100644 --- a/gcc/testsuite/gcc.target/i386/incoming-8.c +++ b/gcc/testsuite/gcc.target/i386/incoming-8.c @@ -1,7 +1,6 @@ /* PR target/40838 */ /* { dg-do compile { target { { ! *-*-darwin* } && ilp32 } } } */ /* { dg-options "-w -mstackrealign -O3 -msse2 -mpreferred-stack-boundary=4" } */ -/* { dg-require-effective-target sse2 } */ float foo (float f) diff --git a/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp b/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp index a0e7b8d1eaa..2b1d63de17a 100644 --- a/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp +++ b/gcc/testsuite/gcc.target/i386/math-torture/math-torture.exp @@ -28,19 +28,23 @@ if { ![istarget i?86*-*-*] && ![istarget x86_64-*-*] } then { set MATH_TORTURE_OPTIONS [list \ { -O0 } \ { -O0 -mfpmath=387 } \ + { -O0 -mfpmath=387 -ffast-math } \ + { -O2 } \ + { -O2 -mfpmath=387 } \ + { -O2 -mfpmath=387 -ffast-math } \ +] + +if { [check_effective_target_sse] } { + lappend MATH_TORTURE_OPTIONS \ { -O0 -msse -mno-sse2 -mfpmath=sse } \ { -O0 -msse -mno-sse2 -mfpmath=sse,387 } \ - { -O0 -mfpmath=387 -ffast-math } \ { -O0 -msse -mno-sse2 -mfpmath=sse -ffast-math } \ { -O0 -msse -mno-sse2 -mfpmath=sse,387 -ffast-math } \ - { -O2 } \ - { -O2 -mfpmath=387 } \ { -O2 -msse -mno-sse2 -mfpmath=sse } \ { -O2 -msse -mno-sse2 -mfpmath=sse,387 } \ - { -O2 -mfpmath=387 -ffast-math } \ { -O2 -msse -mno-sse2 -mfpmath=sse -ffast-math } \ { -O2 -msse -mno-sse2 -mfpmath=sse,387 -ffast-math } \ -] +} if { [check_effective_target_sse2] } { lappend MATH_TORTURE_OPTIONS \ diff --git a/gcc/testsuite/gcc.target/i386/ms_hook_prologue.c b/gcc/testsuite/gcc.target/i386/ms_hook_prologue.c index f945492dfde..e11bcc049cb 100644 --- a/gcc/testsuite/gcc.target/i386/ms_hook_prologue.c +++ b/gcc/testsuite/gcc.target/i386/ms_hook_prologue.c @@ -11,7 +11,7 @@ int __attribute__ ((__ms_hook_prologue__)) foo () /* The NOP mov must not be optimized away by optimizations. The push %ebp, mov %esp, %ebp must not be removed by -fomit-frame-pointer */ - +#ifndef __x86_64__ /* movl.s %edi, %edi */ if(*ptr++ != 0x8b) return 1; if(*ptr++ != 0xff) return 1; @@ -20,6 +20,15 @@ int __attribute__ ((__ms_hook_prologue__)) foo () /* movl.s %esp, %ebp */ if(*ptr++ != 0x8b) return 1; if(*ptr++ != 0xec) return 1; +#else + /* leaq 0(%rsp), %rsp */ + if (*ptr++ != 0x48) return 1; + if (*ptr++ != 0x8d) return 1; + if (*ptr++ != 0xa4) return 1; + if (*ptr++ != 0x24) return 1; + if (ptr[0] != 0 || ptr[1] != 0 || ptr[2] != 0 || ptr[3] != 0) + return 1; +#endif return 0; } diff --git a/gcc/testsuite/gcc.target/i386/opt-1.c b/gcc/testsuite/gcc.target/i386/opt-1.c index 74d3e8d1046..28e2ef38c34 100644 --- a/gcc/testsuite/gcc.target/i386/opt-1.c +++ b/gcc/testsuite/gcc.target/i386/opt-1.c @@ -2,7 +2,6 @@ whether we vectorize a simple loop. */ /* { dg-do compile } */ /* { dg-options "-O1 -msse2 -mfpmath=sse -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "prefetcht0" } } */ /* { dg-final { scan-assembler "addps" } } */ /* { dg-final { scan-assembler "subss" } } */ diff --git a/gcc/testsuite/gcc.target/i386/opt-2.c b/gcc/testsuite/gcc.target/i386/opt-2.c index d247d71fc23..d2791e071c3 100644 --- a/gcc/testsuite/gcc.target/i386/opt-2.c +++ b/gcc/testsuite/gcc.target/i386/opt-2.c @@ -2,7 +2,6 @@ whether we vectorize a simple loop. */ /* { dg-do compile } */ /* { dg-options "-O1 -msse2 -mfpmath=sse -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "prefetcht0" } } */ /* { dg-final { scan-assembler "addps" } } */ /* { dg-final { scan-assembler "subss" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ordcmp-1.c b/gcc/testsuite/gcc.target/i386/ordcmp-1.c index 9be97e52b91..a136182aca9 100644 --- a/gcc/testsuite/gcc.target/i386/ordcmp-1.c +++ b/gcc/testsuite/gcc.target/i386/ordcmp-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "cmpordss" } } */ /* { dg-final { scan-assembler "cmpordps" } } */ /* { dg-final { scan-assembler "cmpordsd" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h b/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h index 550e49904d9..750e25c5069 100644 --- a/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h +++ b/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h @@ -22,7 +22,8 @@ main () return 0; /* Run PCLMUL + AVX test only if host has PCLMUL + AVX support. */ - if ((ecx & (bit_AVX | bit_PCLMUL)) == (bit_AVX | bit_PCLMUL)) + if ((ecx & (bit_AVX | bit_OSXSAVE | bit_PCLMUL)) + == (bit_AVX | bit_OSXSAVE | bit_PCLMUL)) { do_test (); #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/pr13685.c b/gcc/testsuite/gcc.target/i386/pr13685.c index 159112d1666..a50681bea26 100644 --- a/gcc/testsuite/gcc.target/i386/pr13685.c +++ b/gcc/testsuite/gcc.target/i386/pr13685.c @@ -1,6 +1,7 @@ /* PR target/13685 */ /* { dg-do run } */ /* { dg-options "-Os -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/pr17692.c b/gcc/testsuite/gcc.target/i386/pr17692.c index f8aed82750f..476d8e3de3f 100644 --- a/gcc/testsuite/gcc.target/i386/pr17692.c +++ b/gcc/testsuite/gcc.target/i386/pr17692.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O -mfpmath=sse -msse2" } */ -/* { dg-require-effective-target sse2 } */ + /* The fact that t1 and t2 are uninitialized is critical. With them uninitialized, the register allocator is free to put them in the same hard register, which results in diff --git a/gcc/testsuite/gcc.target/i386/pr18614-1.c b/gcc/testsuite/gcc.target/i386/pr18614-1.c index 6e16616cae6..1a499753760 100644 --- a/gcc/testsuite/gcc.target/i386/pr18614-1.c +++ b/gcc/testsuite/gcc.target/i386/pr18614-1.c @@ -1,7 +1,6 @@ /* PR rtl-optimization/18614 */ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef double v2df __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr22152.c b/gcc/testsuite/gcc.target/i386/pr22152.c index 4dce76cc947..d12597703ea 100644 --- a/gcc/testsuite/gcc.target/i386/pr22152.c +++ b/gcc/testsuite/gcc.target/i386/pr22152.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <mmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/pr23570.c b/gcc/testsuite/gcc.target/i386/pr23570.c index f220a8cb80d..1542663fa22 100644 --- a/gcc/testsuite/gcc.target/i386/pr23570.c +++ b/gcc/testsuite/gcc.target/i386/pr23570.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef float __v4sf __attribute__ ((__vector_size__ (16))); typedef float __m128 __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr23575.c b/gcc/testsuite/gcc.target/i386/pr23575.c index 1b0ec7f88c3..522226ef7a2 100644 --- a/gcc/testsuite/gcc.target/i386/pr23575.c +++ b/gcc/testsuite/gcc.target/i386/pr23575.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-msse2 -O2" } */ -/* { dg-require-effective-target sse2 } */ /* We used to ICE because of a bogous pattern. */ diff --git a/gcc/testsuite/gcc.target/i386/pr24306.c b/gcc/testsuite/gcc.target/i386/pr24306.c index c578475bbea..1319918c350 100644 --- a/gcc/testsuite/gcc.target/i386/pr24306.c +++ b/gcc/testsuite/gcc.target/i386/pr24306.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/pr26449-1.c b/gcc/testsuite/gcc.target/i386/pr26449-1.c index e83375d6d0f..b4ef7804887 100644 --- a/gcc/testsuite/gcc.target/i386/pr26449-1.c +++ b/gcc/testsuite/gcc.target/i386/pr26449-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -mtune=k8" } */ -/* { dg-require-effective-target sse2 } */ typedef short __v8hi __attribute__ ((__vector_size__ (16))); typedef long long __m128i __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr26600.c b/gcc/testsuite/gcc.target/i386/pr26600.c index 61941de70e4..bbe0663da7e 100644 --- a/gcc/testsuite/gcc.target/i386/pr26600.c +++ b/gcc/testsuite/gcc.target/i386/pr26600.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O -ftree-vectorize -msse2" } */ -/* { dg-require-effective-target sse2 } */ void foo(int *p, int N) { diff --git a/gcc/testsuite/gcc.target/i386/pr27790.c b/gcc/testsuite/gcc.target/i386/pr27790.c index 4c5cdb6dc74..e8986c4158a 100644 --- a/gcc/testsuite/gcc.target/i386/pr27790.c +++ b/gcc/testsuite/gcc.target/i386/pr27790.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O -ftree-vectorize -msse2" } */ -/* { dg-require-effective-target sse2 } */ void binarize (int npixels, unsigned char *b) { diff --git a/gcc/testsuite/gcc.target/i386/pr28839.c b/gcc/testsuite/gcc.target/i386/pr28839.c index ccb715d7478..6a215164c58 100644 --- a/gcc/testsuite/gcc.target/i386/pr28839.c +++ b/gcc/testsuite/gcc.target/i386/pr28839.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -ftree-vectorize -funswitch-loops" } */ -/* { dg-require-effective-target sse2 } */ static int ready[10]; void abort (void); diff --git a/gcc/testsuite/gcc.target/i386/pr30970.c b/gcc/testsuite/gcc.target/i386/pr30970.c index 25f773915f8..96d64e5a962 100644 --- a/gcc/testsuite/gcc.target/i386/pr30970.c +++ b/gcc/testsuite/gcc.target/i386/pr30970.c @@ -1,6 +1,5 @@ /* { dg-do compile } /* { dg-options "-msse2 -O2 -ftree-vectorize" } */ -/* { dg-require-effective-target sse2 } */ #define N 256 int b[N]; diff --git a/gcc/testsuite/gcc.target/i386/pr32065-2.c b/gcc/testsuite/gcc.target/i386/pr32065-2.c index e1a88592d3c..5f055b59c3a 100644 --- a/gcc/testsuite/gcc.target/i386/pr32065-2.c +++ b/gcc/testsuite/gcc.target/i386/pr32065-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target dfp } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-Os -msse -std=gnu99" } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/pr32280.c b/gcc/testsuite/gcc.target/i386/pr32280.c index 49865ea4ba6..d48a635a4b8 100644 --- a/gcc/testsuite/gcc.target/i386/pr32280.c +++ b/gcc/testsuite/gcc.target/i386/pr32280.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef long long __m128i __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr32661.c b/gcc/testsuite/gcc.target/i386/pr32661.c index 2eb1544e336..247ae131923 100644 --- a/gcc/testsuite/gcc.target/i386/pr32661.c +++ b/gcc/testsuite/gcc.target/i386/pr32661.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef int __v4si __attribute__ ((__vector_size__ (16))); typedef float __v4sf __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr32708-1.c b/gcc/testsuite/gcc.target/i386/pr32708-1.c index 5200f3f6547..c5308937bb0 100644 --- a/gcc/testsuite/gcc.target/i386/pr32708-1.c +++ b/gcc/testsuite/gcc.target/i386/pr32708-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef long long __v2di __attribute__ ((__vector_size__ (16))); typedef long long __m128i __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr32961.c b/gcc/testsuite/gcc.target/i386/pr32961.c index 8b513623111..a2326289af9 100644 --- a/gcc/testsuite/gcc.target/i386/pr32961.c +++ b/gcc/testsuite/gcc.target/i386/pr32961.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O0 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <xmmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/pr33329.c b/gcc/testsuite/gcc.target/i386/pr33329.c index e8036082cf1..bb589ee2780 100644 --- a/gcc/testsuite/gcc.target/i386/pr33329.c +++ b/gcc/testsuite/gcc.target/i386/pr33329.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-vectorize -msse2" } */ -/* { dg-require-effective-target sse2 } */ extern void g (int *); diff --git a/gcc/testsuite/gcc.target/i386/pr35714.c b/gcc/testsuite/gcc.target/i386/pr35714.c index d5d2755ed07..13ca47c23a3 100644 --- a/gcc/testsuite/gcc.target/i386/pr35714.c +++ b/gcc/testsuite/gcc.target/i386/pr35714.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/pr35767-5.c b/gcc/testsuite/gcc.target/i386/pr35767-5.c index 9f533033b71..4372d2e5746 100644 --- a/gcc/testsuite/gcc.target/i386/pr35767-5.c +++ b/gcc/testsuite/gcc.target/i386/pr35767-5.c @@ -1,7 +1,6 @@ /* Test that we generate aligned load when memory is aligned. */ /* { dg-do compile } */ /* { dg-options "-O -msse2 -mtune=generic" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler-not "movups" } } */ /* { dg-final { scan-assembler "movaps" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr36222-1.c b/gcc/testsuite/gcc.target/i386/pr36222-1.c index 647e1039619..2d4c5b9b76c 100644 --- a/gcc/testsuite/gcc.target/i386/pr36222-1.c +++ b/gcc/testsuite/gcc.target/i386/pr36222-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); typedef int __v4si __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr36992-1.c b/gcc/testsuite/gcc.target/i386/pr36992-1.c index 017616bcc5b..7cd24cccf3e 100644 --- a/gcc/testsuite/gcc.target/i386/pr36992-1.c +++ b/gcc/testsuite/gcc.target/i386/pr36992-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/pr37101.c b/gcc/testsuite/gcc.target/i386/pr37101.c index 69b913c4103..8fd3bfc5f85 100644 --- a/gcc/testsuite/gcc.target/i386/pr37101.c +++ b/gcc/testsuite/gcc.target/i386/pr37101.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -ftree-vectorize -march=nocona" } */ -/* { dg-require-effective-target sse2 } */ typedef __SIZE_TYPE__ size_t; extern void *malloc (size_t); diff --git a/gcc/testsuite/gcc.target/i386/pr37275.c b/gcc/testsuite/gcc.target/i386/pr37275.c index ca9612bba30..070dab554c7 100644 --- a/gcc/testsuite/gcc.target/i386/pr37275.c +++ b/gcc/testsuite/gcc.target/i386/pr37275.c @@ -1,6 +1,7 @@ /* PR middle-end/37275 */ /* { dg-do compile { target ilp32 } } */ /* { dg-options "-g -dA -O2 -march=i686 -fstack-protector" } */ +/* { dg-require-visibility "" } */ typedef __SIZE_TYPE__ size_t; extern void *memcpy (void *, const void *, size_t); diff --git a/gcc/testsuite/gcc.target/i386/pr37434-1.c b/gcc/testsuite/gcc.target/i386/pr37434-1.c index 00ed55e3234..b556bf0848e 100644 --- a/gcc/testsuite/gcc.target/i386/pr37434-1.c +++ b/gcc/testsuite/gcc.target/i386/pr37434-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef short __v8hi __attribute__ ((__vector_size__ (16))); typedef long long __m128i __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr37434-2.c b/gcc/testsuite/gcc.target/i386/pr37434-2.c index b92d52100da..00ff9fd2e6c 100644 --- a/gcc/testsuite/gcc.target/i386/pr37434-2.c +++ b/gcc/testsuite/gcc.target/i386/pr37434-2.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -mtune=core2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef short __v8hi __attribute__ ((__vector_size__ (16))); typedef long long __m128i __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr37434-3.c b/gcc/testsuite/gcc.target/i386/pr37434-3.c index 916c99fe02f..2cc597b04f5 100644 --- a/gcc/testsuite/gcc.target/i386/pr37434-3.c +++ b/gcc/testsuite/gcc.target/i386/pr37434-3.c @@ -1,5 +1,4 @@ /* { dg-do compile } */ -/* { dg-require-effective-target sse4 } */ /* { dg-options "-O2 -msse4.1" } */ typedef char __v16qi __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr37434-4.c b/gcc/testsuite/gcc.target/i386/pr37434-4.c index 15f8292b029..6848c63505e 100644 --- a/gcc/testsuite/gcc.target/i386/pr37434-4.c +++ b/gcc/testsuite/gcc.target/i386/pr37434-4.c @@ -1,5 +1,4 @@ /* { dg-do compile } */ -/* { dg-require-effective-target sse4 } */ /* { dg-options "-O2 -mtune=core2 -msse4.1" } */ typedef char __v16qi __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr39162.c b/gcc/testsuite/gcc.target/i386/pr39162.c index 1a5e3e7aab0..2d114b8fd00 100644 --- a/gcc/testsuite/gcc.target/i386/pr39162.c +++ b/gcc/testsuite/gcc.target/i386/pr39162.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -mno-avx" } */ -/* { dg-require-effective-target sse2 } */ typedef long long __m256i __attribute__ ((__vector_size__ (32), __may_alias__)); diff --git a/gcc/testsuite/gcc.target/i386/pr39315-1.c b/gcc/testsuite/gcc.target/i386/pr39315-1.c index 9f4d484639f..16ba5d59fe4 100644 --- a/gcc/testsuite/gcc.target/i386/pr39315-1.c +++ b/gcc/testsuite/gcc.target/i386/pr39315-1.c @@ -1,7 +1,6 @@ /* PR middle-end/39315 */ /* { dg-do compile } */ /* { dg-options "-O -msse2 -mtune=generic" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler-not "movups" } } */ /* { dg-final { scan-assembler-not "movlps" } } */ /* { dg-final { scan-assembler-not "movhps" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr39315-2.c b/gcc/testsuite/gcc.target/i386/pr39315-2.c index 5363e97509b..c1a3da75a36 100644 --- a/gcc/testsuite/gcc.target/i386/pr39315-2.c +++ b/gcc/testsuite/gcc.target/i386/pr39315-2.c @@ -1,7 +1,7 @@ /* PR middle-end/39315 */ /* { dg-do run } */ /* { dg-options "-O -msse2 -mtune=generic" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ /* { dg-additional-sources pr39315-check.c } */ typedef float __m128 __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr39315-3.c b/gcc/testsuite/gcc.target/i386/pr39315-3.c index 38ea7aed745..07862db603a 100644 --- a/gcc/testsuite/gcc.target/i386/pr39315-3.c +++ b/gcc/testsuite/gcc.target/i386/pr39315-3.c @@ -1,7 +1,6 @@ /* PR middle-end/39315 */ /* { dg-do compile } */ /* { dg-options "-O -msse2 -mtune=generic" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler-not "movups" } } */ /* { dg-final { scan-assembler-not "movlps" } } */ /* { dg-final { scan-assembler-not "movhps" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr39315-4.c b/gcc/testsuite/gcc.target/i386/pr39315-4.c index 4a62a1d51b9..77258a7c76c 100644 --- a/gcc/testsuite/gcc.target/i386/pr39315-4.c +++ b/gcc/testsuite/gcc.target/i386/pr39315-4.c @@ -1,7 +1,7 @@ /* PR middle-end/39315 */ /* { dg-do run } */ /* { dg-options "-O -msse2 -mtune=generic" } */ -/* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target sse2_runtime } */ /* { dg-additional-sources pr39315-check.c } */ typedef float __m128 __attribute__ ((__vector_size__ (16))); diff --git a/gcc/testsuite/gcc.target/i386/pr39315-check.c b/gcc/testsuite/gcc.target/i386/pr39315-check.c index 8f7376015d0..cb09d3f2be5 100644 --- a/gcc/testsuite/gcc.target/i386/pr39315-check.c +++ b/gcc/testsuite/gcc.target/i386/pr39315-check.c @@ -1,4 +1,5 @@ -/* { dg-compile } */ +/* { dg-do compile } */ + typedef float __m128 __attribute__ ((__vector_size__ (16))); __extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t; diff --git a/gcc/testsuite/gcc.target/i386/pr39496.c b/gcc/testsuite/gcc.target/i386/pr39496.c index bdaca2e55a8..e4132a1165b 100644 --- a/gcc/testsuite/gcc.target/i386/pr39496.c +++ b/gcc/testsuite/gcc.target/i386/pr39496.c @@ -1,7 +1,6 @@ /* PR target/39496 */ /* { dg-do compile { target { { i?86-*-linux* x86_64-*-linux* } && ilp32 } } } */ /* { dg-options "-O0 -fverbose-asm -fno-omit-frame-pointer -mtune=i686 -msse2 -mfpmath=sse" } */ -/* { dg-require-effective-target sse2 } */ /* Verify that {foo,bar}{,2}param are all passed on the stack, using normal calling conventions, when not optimizing. */ /* { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*fooparam," } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr40957.c b/gcc/testsuite/gcc.target/i386/pr40957.c index 56762d7e810..b7ee26dffcd 100644 --- a/gcc/testsuite/gcc.target/i386/pr40957.c +++ b/gcc/testsuite/gcc.target/i386/pr40957.c @@ -1,5 +1,4 @@ /* { dg-do compile } */ -/* { dg-require-effective-target avx } */ /* { dg-options "-O2 -mavx" } */ typedef int __v8si __attribute__((__vector_size__(32))); diff --git a/gcc/testsuite/gcc.target/i386/pr42542-3a.c b/gcc/testsuite/gcc.target/i386/pr42542-3a.c index 89c9ed4945b..754e59e8487 100644 --- a/gcc/testsuite/gcc.target/i386/pr42542-3a.c +++ b/gcc/testsuite/gcc.target/i386/pr42542-3a.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O1 -msse2 -ftree-vectorize" } */ -/* { dg-require-effective-target sse2 } */ #include "pr42542-3.c" diff --git a/gcc/testsuite/gcc.target/i386/pr44942.c b/gcc/testsuite/gcc.target/i386/pr44942.c new file mode 100644 index 00000000000..4664f7e0d53 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr44942.c @@ -0,0 +1,44 @@ +/* PR target/44942 */ +/* { dg-do run { target lp64 } } */ + +#include <stdarg.h> +#include <emmintrin.h> + +void +test1 (double a, double b, double c, double d, double e, double f, + double g, __m128d h, ...) +{ + double i; + va_list ap; + + va_start (ap, h); + i = va_arg (ap, double); + if (i != 1234.0) + __builtin_abort (); + va_end (ap); +} + +void +test2 (double a, double b, double c, double d, double e, double f, double g, + __m128d h, double i, __m128d j, double k, __m128d l, + double m, __m128d n, ...) +{ + double o; + va_list ap; + + va_start (ap, n); + o = va_arg (ap, double); + if (o != 1234.0) + __builtin_abort (); + va_end (ap); +} + +int +main () +{ + __m128d m = _mm_set1_pd (7.0); + test1 (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, m, 1234.0); + test2 (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, m, 0.0, m, + 0.0, m, 0.0, m, 1234.0); + return 0; +} diff --git a/gcc/testsuite/gcc.target/i386/push-1.c b/gcc/testsuite/gcc.target/i386/push-1.c index 797ad575dd1..09464bf9229 100644 --- a/gcc/testsuite/gcc.target/i386/push-1.c +++ b/gcc/testsuite/gcc.target/i386/push-1.c @@ -1,6 +1,5 @@ /* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ /* { dg-options "-w -msse2 -Os" } */ -/* { dg-require-effective-target sse2 } */ typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); diff --git a/gcc/testsuite/gcc.target/i386/quad-sse.c b/gcc/testsuite/gcc.target/i386/quad-sse.c index 8c594452618..4b6fe792575 100644 --- a/gcc/testsuite/gcc.target/i386/quad-sse.c +++ b/gcc/testsuite/gcc.target/i386/quad-sse.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ __float128 x, y; diff --git a/gcc/testsuite/gcc.target/i386/rdfsbase-1.c b/gcc/testsuite/gcc.target/i386/rdfsbase-1.c new file mode 100644 index 00000000000..c4808e9683b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdfsbase-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "rdfsbase\[ \t]+(%|)eax" } } */ + +#include <immintrin.h> + +unsigned int +read_fs_base32 (void) +{ + return _readfsbase_u32 (); +} diff --git a/gcc/testsuite/gcc.target/i386/rdfsbase-2.c b/gcc/testsuite/gcc.target/i386/rdfsbase-2.c new file mode 100644 index 00000000000..40b8f4a999f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdfsbase-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "rdfsbase\[ \t]+(%|)rax" } } */ + +#include <immintrin.h> + +unsigned long long +read_fs_base64 (void) +{ + return _readfsbase_u64 (); +} diff --git a/gcc/testsuite/gcc.target/i386/rdgsbase-1.c b/gcc/testsuite/gcc.target/i386/rdgsbase-1.c new file mode 100644 index 00000000000..1e5a302085e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdgsbase-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "rdgsbase\[ \t]+(%|)eax" } } */ + +#include <immintrin.h> + +unsigned int +read_gs_base32 (void) +{ + return _readgsbase_u32 (); +} diff --git a/gcc/testsuite/gcc.target/i386/rdgsbase-2.c b/gcc/testsuite/gcc.target/i386/rdgsbase-2.c new file mode 100644 index 00000000000..13215825069 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdgsbase-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "rdgsbase\[ \t]+(%|)rax" } } */ + +#include <immintrin.h> + +unsigned long long +read_gs_base64 (void) +{ + return _readgsbase_u64 (); +} diff --git a/gcc/testsuite/gcc.target/i386/rdrand-1.c b/gcc/testsuite/gcc.target/i386/rdrand-1.c new file mode 100644 index 00000000000..4f6b9e177e0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdrand-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mrdrnd " } */ +/* { dg-final { scan-assembler "rdrand\[ \t]+(%|)ax" } } */ +/* { dg-final { scan-assembler "jnc\[ \t]+" } } */ + +#include <immintrin.h> + +unsigned short +read_rdrand16 (void) +{ + return _rdrand_u16 (); +} diff --git a/gcc/testsuite/gcc.target/i386/rdrand-2.c b/gcc/testsuite/gcc.target/i386/rdrand-2.c new file mode 100644 index 00000000000..22973834dca --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdrand-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mrdrnd " } */ +/* { dg-final { scan-assembler "rdrand\[ \t]+(%|)eax" } } */ +/* { dg-final { scan-assembler "jnc\[ \t]+" } } */ + +#include <immintrin.h> + +unsigned int +read_rdrand32 (void) +{ + return _rdrand_u32 (); +} diff --git a/gcc/testsuite/gcc.target/i386/rdrand-3.c b/gcc/testsuite/gcc.target/i386/rdrand-3.c new file mode 100644 index 00000000000..17c7c6fff24 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/rdrand-3.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mrdrnd " } */ +/* { dg-final { scan-assembler "rdrand\[ \t]+(%|)rax" } } */ +/* { dg-final { scan-assembler "jnc\[ \t]+" } } */ + +#include <immintrin.h> + +unsigned long long +read_rdrand64 (void) +{ + return _rdrand_u64 (); +} diff --git a/gcc/testsuite/gcc.target/i386/reload-1.c b/gcc/testsuite/gcc.target/i386/reload-1.c index 299871585e2..f8075acaed4 100644 --- a/gcc/testsuite/gcc.target/i386/reload-1.c +++ b/gcc/testsuite/gcc.target/i386/reload-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O3 -msse2 -fdump-rtl-csa" } */ /* { dg-skip-if "no stdint" { vxworks_kernel } } */ diff --git a/gcc/testsuite/gcc.target/i386/sse-12.c b/gcc/testsuite/gcc.target/i386/sse-12.c index 77baff0f4b9..2d50f41d540 100644 --- a/gcc/testsuite/gcc.target/i386/sse-12.c +++ b/gcc/testsuite/gcc.target/i386/sse-12.c @@ -2,7 +2,7 @@ abmintrin.h, lwpintrin.h, popcntintrin.h and mm_malloc.h are usable with -O -std=c89 -pedantic-errors. */ /* { dg-do compile } */ -/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -m3dnow -mavx -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ +/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -m3dnow -mavx -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ #include <x86intrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-13.c b/gcc/testsuite/gcc.target/i386/sse-13.c index 96214e02280..01809d0cffa 100644 --- a/gcc/testsuite/gcc.target/i386/sse-13.c +++ b/gcc/testsuite/gcc.target/i386/sse-13.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ +/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ #include <mm_malloc.h> @@ -50,6 +50,8 @@ #define __builtin_ia32_vinsertf128_si256(X, Y, C) __builtin_ia32_vinsertf128_si256(X, Y, 1) #define __builtin_ia32_roundpd256(V, M) __builtin_ia32_roundpd256(V, 1) #define __builtin_ia32_roundps256(V, M) __builtin_ia32_roundps256(V, 1) +#define __builtin_ia32_vcvtps2ph(A, I) __builtin_ia32_vcvtps2ph(A, 1) +#define __builtin_ia32_vcvtps2ph256(A, I) __builtin_ia32_vcvtps2ph256(A, 1) /* wmmintrin.h */ #define __builtin_ia32_aeskeygenassist128(X, C) __builtin_ia32_aeskeygenassist128(X, 1) diff --git a/gcc/testsuite/gcc.target/i386/sse-14.c b/gcc/testsuite/gcc.target/i386/sse-14.c index 96a3f210eb0..d256e68c4be 100644 --- a/gcc/testsuite/gcc.target/i386/sse-14.c +++ b/gcc/testsuite/gcc.target/i386/sse-14.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -msse4a -maes -mpclmul -mpopcnt -mabm -mlwp" } */ +/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -msse4a -maes -mpclmul -mpopcnt -mabm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ #include <mm_malloc.h> @@ -89,6 +89,9 @@ test_2 (_mm256_insert_epi64, __m256i, __m256i, long long, 1) #endif test_1 (_mm256_round_pd, __m256d, __m256d, 1) test_1 (_mm256_round_ps, __m256, __m256, 1) +test_1 (_cvtss_sh, unsigned short, float, 1) +test_1 (_mm_cvtps_ph, __m128i, __m128, 1) +test_1 (_mm256_cvtps_ph, __m128i, __m256, 1) /* wmmintrin.h */ test_1 (_mm_aeskeygenassist_si128, __m128i, __m128i, 1) diff --git a/gcc/testsuite/gcc.target/i386/sse-15.c b/gcc/testsuite/gcc.target/i386/sse-15.c index ed91ee65d38..5a1da7a755f 100644 --- a/gcc/testsuite/gcc.target/i386/sse-15.c +++ b/gcc/testsuite/gcc.target/i386/sse-15.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse -msse2" } */ -/* { dg-require-effective-target sse2 } */ /* Test that the intrinsics compile with optimization. These were not tested in i386-sse-[12].c because these builtins require immediate diff --git a/gcc/testsuite/gcc.target/i386/sse-19.c b/gcc/testsuite/gcc.target/i386/sse-19.c index 112c3e1cfad..43c090bd4e1 100644 --- a/gcc/testsuite/gcc.target/i386/sse-19.c +++ b/gcc/testsuite/gcc.target/i386/sse-19.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O3 -msse2" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "punpcklbw" } } */ extern void abort(); #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-2.c b/gcc/testsuite/gcc.target/i386/sse-2.c index cbaa5e6a30d..c2f3e0b17cd 100644 --- a/gcc/testsuite/gcc.target/i386/sse-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-2.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O3 -msse" } */ + #include <xmmintrin.h> static const __m128 v_sign = {-.0f, -.0f, -.0f, -.0f}; static const __m128 v_half = {0.5f, 0.5f, 0.5f, 0.5f}; diff --git a/gcc/testsuite/gcc.target/i386/sse-20.c b/gcc/testsuite/gcc.target/i386/sse-20.c index 5aa8f7a2812..fc0744f2554 100644 --- a/gcc/testsuite/gcc.target/i386/sse-20.c +++ b/gcc/testsuite/gcc.target/i386/sse-20.c @@ -1,5 +1,6 @@ /* PR target/13685 */ /* { dg-options "-Os -msse" } */ +/* { dg-require-effective-target sse } */ typedef float __m128 __attribute__ ((vector_size (16))); typedef int __m64 __attribute__ ((vector_size (8))); diff --git a/gcc/testsuite/gcc.target/i386/sse-22.c b/gcc/testsuite/gcc.target/i386/sse-22.c index 6d976972d28..bb0472d471c 100644 --- a/gcc/testsuite/gcc.target/i386/sse-22.c +++ b/gcc/testsuite/gcc.target/i386/sse-22.c @@ -39,7 +39,7 @@ #ifndef DIFFERENT_PRAGMAS -#pragma GCC target ("mmx,3dnow,sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,aes,pclmul,xop,popcnt,abm,lwp") +#pragma GCC target ("mmx,3dnow,sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,aes,pclmul,xop,popcnt,abm,lwp,fsgsbase,rdrnd,f16c") #endif /* Following intrinsics require immediate arguments. They @@ -179,3 +179,12 @@ test_2 ( __lwpins32, unsigned char, unsigned int, unsigned int, 1) test_2 ( __lwpval64, void, unsigned long long, unsigned int, 1) test_2 ( __lwpins64, unsigned char, unsigned long long, unsigned int, 1) #endif + +/* immintrin.h (F16C). */ +#ifdef DIFFERENT_PRAGMAS +#pragma GCC target ("f16c") +#endif +#include <x86intrin.h> +test_1 (_cvtss_sh, unsigned short, float, 1) +test_1 (_mm_cvtps_ph, __m128i, __m128, 1) +test_1 (_mm256_cvtps_ph, __m128i, __m256, 1) diff --git a/gcc/testsuite/gcc.target/i386/sse-23.c b/gcc/testsuite/gcc.target/i386/sse-23.c index f74d3a71f6e..0e15bb25418 100644 --- a/gcc/testsuite/gcc.target/i386/sse-23.c +++ b/gcc/testsuite/gcc.target/i386/sse-23.c @@ -126,6 +126,8 @@ #define __builtin_ia32_vinsertf128_si256(X, Y, C) __builtin_ia32_vinsertf128_si256(X, Y, 1) #define __builtin_ia32_roundpd256(V, M) __builtin_ia32_roundpd256(V, 1) #define __builtin_ia32_roundps256(V, M) __builtin_ia32_roundps256(V, 1) +#define __builtin_ia32_vcvtps2ph(A, I) __builtin_ia32_vcvtps2ph(A, 1) +#define __builtin_ia32_vcvtps2ph256(A, I) __builtin_ia32_vcvtps2ph256(A, 1) /* xopintrin.h */ #define __builtin_ia32_vprotbi(A, B) __builtin_ia32_vprotbi(A,1) @@ -139,7 +141,7 @@ #define __builtin_ia32_lwpins32(D2, D1, F) __builtin_ia32_lwpins32 (D2, D1, 1) #define __builtin_ia32_lwpins64(D2, D1, F) __builtin_ia32_lwpins64 (D2, D1, 1) -#pragma GCC target ("3dnow,sse4,sse4a,aes,pclmul,xop,abm,popcnt,lwp") +#pragma GCC target ("3dnow,sse4,sse4a,aes,pclmul,xop,abm,popcnt,lwp,fsgsbase,rdrnd,f16c") #include <wmmintrin.h> #include <smmintrin.h> #include <mm3dnow.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-3.c b/gcc/testsuite/gcc.target/i386/sse-3.c index 338b7c60ba7..1be1d1aa223 100644 --- a/gcc/testsuite/gcc.target/i386/sse-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-3.c @@ -1,6 +1,7 @@ /* PR target/21149 */ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-4.c b/gcc/testsuite/gcc.target/i386/sse-4.c index 5d49884ab85..394ad9d7ec4 100644 --- a/gcc/testsuite/gcc.target/i386/sse-4.c +++ b/gcc/testsuite/gcc.target/i386/sse-4.c @@ -1,7 +1,6 @@ /* This testcase caused a buffer overflow in simplify_immed_subreg. */ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-7.c b/gcc/testsuite/gcc.target/i386/sse-7.c index 12b88ca53f3..30e2c13ba04 100644 --- a/gcc/testsuite/gcc.target/i386/sse-7.c +++ b/gcc/testsuite/gcc.target/i386/sse-7.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-9.c b/gcc/testsuite/gcc.target/i386/sse-9.c index 0106cb52f63..e1a0a2270cb 100644 --- a/gcc/testsuite/gcc.target/i386/sse-9.c +++ b/gcc/testsuite/gcc.target/i386/sse-9.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-addps-1.c b/gcc/testsuite/gcc.target/i386/sse-addps-1.c index 2aa1cfa411a..b280667b5d0 100644 --- a/gcc/testsuite/gcc.target/i386/sse-addps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-addps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-addss-1.c b/gcc/testsuite/gcc.target/i386/sse-addss-1.c index 911a6cd9192..43aa2d53efd 100644 --- a/gcc/testsuite/gcc.target/i386/sse-addss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-addss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-andnps-1.c b/gcc/testsuite/gcc.target/i386/sse-andnps-1.c index 06d1e07dd40..eeeec020a7d 100644 --- a/gcc/testsuite/gcc.target/i386/sse-andnps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-andnps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-andps-1.c b/gcc/testsuite/gcc.target/i386/sse-andps-1.c index aa46b8a28b7..6094dba7d34 100644 --- a/gcc/testsuite/gcc.target/i386/sse-andps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-andps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-check.h b/gcc/testsuite/gcc.target/i386/sse-check.h index 85629cc71b9..11b71bc3e97 100644 --- a/gcc/testsuite/gcc.target/i386/sse-check.h +++ b/gcc/testsuite/gcc.target/i386/sse-check.h @@ -1,8 +1,7 @@ -#include <stdio.h> #include <stdlib.h> #include "m128-check.h" - #include "cpuid.h" +#include "sse-os-support.h" static void sse_test (void); @@ -22,7 +21,7 @@ main () return 0; /* Run SSE test only if host has SSE support. */ - if (edx & bit_SSE) + if ((edx & bit_SSE) && sse_os_support ()) do_test (); return 0; diff --git a/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c b/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c index e4be7318e06..45438bcd1b7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cmpss-1.c @@ -1,5 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse -std=c99" } */ +/* { dg-require-effective-target sse } */ +/* { dg-require-effective-target c99_runtime } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-1.c b/gcc/testsuite/gcc.target/i386/sse-comiss-1.c index 2892a70a67b..ff623aa8bed 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-2.c b/gcc/testsuite/gcc.target/i386/sse-comiss-2.c index 63b6d6d113f..d674bed002b 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-3.c b/gcc/testsuite/gcc.target/i386/sse-comiss-3.c index 75ac4e4faaf..d2301ad8e51 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-3.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-4.c b/gcc/testsuite/gcc.target/i386/sse-comiss-4.c index ceeeca79472..7f372e249b9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-4.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-4.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-5.c b/gcc/testsuite/gcc.target/i386/sse-comiss-5.c index 8f503512ffa..104fdd701f7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-5.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-5.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-comiss-6.c b/gcc/testsuite/gcc.target/i386/sse-comiss-6.c index 38df9b8e47b..8229b7d55d7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-comiss-6.c +++ b/gcc/testsuite/gcc.target/i386/sse-comiss-6.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c b/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c index 9342e2c7187..bd85889503d 100644 --- a/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c +++ b/gcc/testsuite/gcc.target/i386/sse-copysignf-vec.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ftree-vectorize -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c index e5435b6b733..740227feef4 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c index aa74e11ec55..6abc4d5afed 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtsi2ss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ #ifndef CHECK_H diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c index 5740626659a..3f8c549c962 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c index e136b7198a0..44a5fafc31b 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvtss2si-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ #ifndef CHECK_H diff --git a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c index 8edc197eafd..667806d970f 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c index 94e831e782f..eb85223450d 100644 --- a/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-cvttss2si-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target lp64 } */ +/* { dg-require-effective-target sse } */ /* { dg-options "-O2 -msse" } */ #ifndef CHECK_H diff --git a/gcc/testsuite/gcc.target/i386/sse-divps-1.c b/gcc/testsuite/gcc.target/i386/sse-divps-1.c index d4d441aeb1f..321bb5ac7c6 100644 --- a/gcc/testsuite/gcc.target/i386/sse-divps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-divps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-divss-1.c b/gcc/testsuite/gcc.target/i386/sse-divss-1.c index e7449496e0a..1427e4f1a44 100644 --- a/gcc/testsuite/gcc.target/i386/sse-divss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-divss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c index 5c254772709..f2513154788 100644 --- a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c index 4cb1f337e2a..eea03ecadea 100644 --- a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-maxps-1.c b/gcc/testsuite/gcc.target/i386/sse-maxps-1.c index 5e6fcd654ef..9a82f665a4b 100644 --- a/gcc/testsuite/gcc.target/i386/sse-maxps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-maxps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-maxss-1.c b/gcc/testsuite/gcc.target/i386/sse-maxss-1.c index 5b5215a5772..7b88dfce710 100644 --- a/gcc/testsuite/gcc.target/i386/sse-maxss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-maxss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-minps-1.c b/gcc/testsuite/gcc.target/i386/sse-minps-1.c index a41139f8b96..452df8318ab 100644 --- a/gcc/testsuite/gcc.target/i386/sse-minps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-minps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-minss-1.c b/gcc/testsuite/gcc.target/i386/sse-minss-1.c index 9280b07052d..b7288f85915 100644 --- a/gcc/testsuite/gcc.target/i386/sse-minss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-minss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movaps-1.c b/gcc/testsuite/gcc.target/i386/sse-movaps-1.c index 3677ac44288..ed3562ba53a 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movaps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movaps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movaps-2.c b/gcc/testsuite/gcc.target/i386/sse-movaps-2.c index 46b971a9d9c..fcfa80bebbc 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movaps-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movaps-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c b/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c index 7023bf95d1e..4d7b3edc2ac 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movhlps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movhps-1.c b/gcc/testsuite/gcc.target/i386/sse-movhps-1.c index 9f28927a881..44b88592701 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movhps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movhps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movhps-2.c b/gcc/testsuite/gcc.target/i386/sse-movhps-2.c index 023937b6633..11ab383977c 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movhps-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movhps-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c b/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c index aba9a9aa413..4ce3edf59e7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movlhps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c b/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c index f1f0d7ed5a4..8557a30214b 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movmskps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movntps-1.c b/gcc/testsuite/gcc.target/i386/sse-movntps-1.c index 8c45da31dde..067f29616e1 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movntps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movntps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movss-1.c b/gcc/testsuite/gcc.target/i386/sse-movss-1.c index eccdf5af907..ee53d5faf11 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movss-2.c b/gcc/testsuite/gcc.target/i386/sse-movss-2.c index f64fa4db698..638666594c9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movss-3.c b/gcc/testsuite/gcc.target/i386/sse-movss-3.c index 1212622b7ea..a090aada7f5 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movss-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-movss-3.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movups-1.c b/gcc/testsuite/gcc.target/i386/sse-movups-1.c index 222da79d940..7ea9122897a 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movups-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-movups-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-movups-2.c b/gcc/testsuite/gcc.target/i386/sse-movups-2.c index 41657239c32..188967a2a37 100644 --- a/gcc/testsuite/gcc.target/i386/sse-movups-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-movups-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-mulps-1.c b/gcc/testsuite/gcc.target/i386/sse-mulps-1.c index a07b5abf610..de66a28e142 100644 --- a/gcc/testsuite/gcc.target/i386/sse-mulps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-mulps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-mulss-1.c b/gcc/testsuite/gcc.target/i386/sse-mulss-1.c index 7b45063508d..99161a811a1 100644 --- a/gcc/testsuite/gcc.target/i386/sse-mulss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-mulss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-orps-1.c b/gcc/testsuite/gcc.target/i386/sse-orps-1.c index 6c8dac5cc5c..605603726c0 100644 --- a/gcc/testsuite/gcc.target/i386/sse-orps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-orps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-os-support.h b/gcc/testsuite/gcc.target/i386/sse-os-support.h new file mode 100644 index 00000000000..a2b4e2d3c7e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse-os-support.h @@ -0,0 +1,55 @@ +#if defined(__sun__) && defined(__svr4__) +/* Make sure sigaction() is declared even with -std=c99. */ +#define __EXTENSIONS__ +#include <signal.h> +#include <ucontext.h> + +static volatile sig_atomic_t sigill_caught; + +static void +sigill_hdlr (int sig __attribute((unused)), + siginfo_t *sip __attribute__((unused)), + ucontext_t *ucp) +{ + sigill_caught = 1; + /* Set PC to the instruction after the faulting one to skip over it, + otherwise we enter an infinite loop. */ + ucp->uc_mcontext.gregs[EIP] += 4; + setcontext (ucp); +} +#endif + +/* Check if the OS supports executing SSE instructions. This function is + only used in sse-check.h, sse2-check.h, and sse3-check.h so far since + Solaris 8 and 9 won't run on newer CPUs anyway. */ + +static int +sse_os_support (void) +{ +#if defined(__sun__) && defined(__svr4__) + /* Solaris 2 before Solaris 9 4/04 cannot execute SSE instructions + even if the CPU supports them. Programs receive SIGILL instead, so + check for that at runtime. */ + + struct sigaction act, oact; + + act.sa_handler = sigill_hdlr; + sigemptyset (&act.sa_mask); + /* Need to set SA_SIGINFO so a ucontext_t * is passed to the handler. */ + act.sa_flags = SA_SIGINFO; + sigaction (SIGILL, &act, &oact); + + /* We need a single SSE instruction here so the handler can safely skip + over it. */ + __asm__ volatile ("movss %xmm2,%xmm1"); + + sigaction (SIGILL, &oact, NULL); + + if (sigill_caught) + exit (0); + else + return 1; +#else + return 1; +#endif /* __sun__ && __svr4__ */ +} diff --git a/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c b/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c index 7a1a8fa7370..4d0783515e6 100644 --- a/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-rcpps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-recip-vec.c b/gcc/testsuite/gcc.target/i386/sse-recip-vec.c index 202351dc987..bb1e458f92d 100644 --- a/gcc/testsuite/gcc.target/i386/sse-recip-vec.c +++ b/gcc/testsuite/gcc.target/i386/sse-recip-vec.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-recip.c b/gcc/testsuite/gcc.target/i386/sse-recip.c index d88eb7f007b..4f7d3bf3d54 100644 --- a/gcc/testsuite/gcc.target/i386/sse-recip.c +++ b/gcc/testsuite/gcc.target/i386/sse-recip.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ffast-math -msse -mfpmath=sse -mrecip" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c b/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c index 4052c21f010..c2db7254957 100644 --- a/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-rsqrtps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c index 8232c7229c5..5a0c9b95d66 100644 --- a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c b/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c index 9f0658d0e27..1dbd260e515 100644 --- a/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-sqrtps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-subps-1.c b/gcc/testsuite/gcc.target/i386/sse-subps-1.c index 2e7e8d50231..e63e4784a11 100644 --- a/gcc/testsuite/gcc.target/i386/sse-subps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-subps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-subss-1.c b/gcc/testsuite/gcc.target/i386/sse-subss-1.c index 5b3ef26bd9f..5d9a5f504f9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-subss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-subss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c index b38b1fd424a..4d72b01873e 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c index e0212a4e3df..dc4ba8045b3 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-2.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c index dc728fb503b..042898bf6d2 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-3.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c index 3251c0b8fb0..a3f32bb3576 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-4.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c index ad34f01d979..821dd772640 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-5.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c b/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c index b9b2f4b2892..602a923a0a5 100644 --- a/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c +++ b/gcc/testsuite/gcc.target/i386/sse-ucomiss-6.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c b/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c index be4ab3659cb..005924b5b6c 100644 --- a/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-unpckhps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c b/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c index 5a5da2064a1..456ef201bca 100644 --- a/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-unpcklps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse-vect-types.c b/gcc/testsuite/gcc.target/i386/sse-vect-types.c index 2658f020eff..9cb6f3e07cd 100644 --- a/gcc/testsuite/gcc.target/i386/sse-vect-types.c +++ b/gcc/testsuite/gcc.target/i386/sse-vect-types.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O0 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <xmmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-xorps-1.c b/gcc/testsuite/gcc.target/i386/sse-xorps-1.c index 6f96e691064..8ec500838ae 100644 --- a/gcc/testsuite/gcc.target/i386/sse-xorps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-xorps-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse2-check.h b/gcc/testsuite/gcc.target/i386/sse2-check.h index e9f17f04079..fd4a6ce1dbf 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-check.h +++ b/gcc/testsuite/gcc.target/i386/sse2-check.h @@ -1,6 +1,7 @@ #include <stdlib.h> #include "cpuid.h" #include "m128-check.h" +#include "sse-os-support.h" static void sse2_test (void); @@ -20,7 +21,7 @@ main () return 0; /* Run SSE2 test only if host has SSE2 support. */ - if (edx & bit_SSE2) + if ((edx & bit_SSE2) && sse_os_support ()) do_test (); return 0; diff --git a/gcc/testsuite/gcc.target/i386/sse2-cmpsd-1.c b/gcc/testsuite/gcc.target/i386/sse2-cmpsd-1.c index 953f220d1b1..153fd2bf045 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-cmpsd-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-cmpsd-1.c @@ -1,6 +1,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse2 -std=c99" } */ /* { dg-require-effective-target sse2 } */ +/* { dg-require-effective-target c99_runtime } */ #ifndef CHECK_H #define CHECK_H "sse2-check.h" diff --git a/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c b/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c index ed067082594..a2676396cd3 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ #include <emmintrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse3-check.h b/gcc/testsuite/gcc.target/i386/sse3-check.h index df0e63a4575..5a0a0b1a02e 100644 --- a/gcc/testsuite/gcc.target/i386/sse3-check.h +++ b/gcc/testsuite/gcc.target/i386/sse3-check.h @@ -1,7 +1,7 @@ #include <stdio.h> #include <stdlib.h> - #include "cpuid.h" +#include "sse-os-support.h" static void sse3_test (void); @@ -21,7 +21,7 @@ main () return 0; /* Run SSE3 test only if host has SSE3 support. */ - if (ecx & bit_SSE3) + if ((ecx & bit_SSE3) && sse_os_support ()) do_test (); return 0; diff --git a/gcc/testsuite/gcc.target/i386/ssefn-2.c b/gcc/testsuite/gcc.target/i386/ssefn-2.c index dfaacf6bdca..09b920ea7ca 100644 --- a/gcc/testsuite/gcc.target/i386/ssefn-2.c +++ b/gcc/testsuite/gcc.target/i386/ssefn-2.c @@ -3,7 +3,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "movss" } } */ /* { dg-final { scan-assembler "mulss" } } */ /* { dg-final { scan-assembler "movsd" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssefn-3.c b/gcc/testsuite/gcc.target/i386/ssefn-3.c index adf72cce18a..b96b21179dc 100644 --- a/gcc/testsuite/gcc.target/i386/ssefn-3.c +++ b/gcc/testsuite/gcc.target/i386/ssefn-3.c @@ -3,6 +3,7 @@ /* { dg-do run } */ /* { dg-options "-O2 -msse -mfpmath=sse" } */ +/* { dg-require-effective-target sse } */ #include "sse-check.h" diff --git a/gcc/testsuite/gcc.target/i386/ssefp-1.c b/gcc/testsuite/gcc.target/i386/ssefp-1.c index fdce233173b..621e362f490 100644 --- a/gcc/testsuite/gcc.target/i386/ssefp-1.c +++ b/gcc/testsuite/gcc.target/i386/ssefp-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8 -mfpmath=sse" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "maxsd" } } */ /* { dg-final { scan-assembler "minsd" } } */ double x; diff --git a/gcc/testsuite/gcc.target/i386/ssefp-2.c b/gcc/testsuite/gcc.target/i386/ssefp-2.c index 0b8b72262b5..a6caee398b2 100644 --- a/gcc/testsuite/gcc.target/i386/ssefp-2.c +++ b/gcc/testsuite/gcc.target/i386/ssefp-2.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8 -mfpmath=sse" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "maxsd" } } */ /* { dg-final { scan-assembler "minsd" } } */ double x; diff --git a/gcc/testsuite/gcc.target/i386/sseregparm-3.c b/gcc/testsuite/gcc.target/i386/sseregparm-3.c index 7475e4f827f..9ee82af44ae 100644 --- a/gcc/testsuite/gcc.target/i386/sseregparm-3.c +++ b/gcc/testsuite/gcc.target/i386/sseregparm-3.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-msse2 -O2" } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* Make sure we know that mysinfp returns in %xmm0. */ diff --git a/gcc/testsuite/gcc.target/i386/sseregparm-4.c b/gcc/testsuite/gcc.target/i386/sseregparm-4.c index b8fc521264e..a29cf06bf5c 100644 --- a/gcc/testsuite/gcc.target/i386/sseregparm-4.c +++ b/gcc/testsuite/gcc.target/i386/sseregparm-4.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-msse2 -O2" } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* Make sure we know that mysinfp returns in %xmm0. */ diff --git a/gcc/testsuite/gcc.target/i386/sseregparm-5.c b/gcc/testsuite/gcc.target/i386/sseregparm-5.c index fa41a2c87b9..7423722d694 100644 --- a/gcc/testsuite/gcc.target/i386/sseregparm-5.c +++ b/gcc/testsuite/gcc.target/i386/sseregparm-5.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-msse2 -O2" } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* Make sure we know that mysinfp returns in %xmm0. */ diff --git a/gcc/testsuite/gcc.target/i386/sseregparm-6.c b/gcc/testsuite/gcc.target/i386/sseregparm-6.c index d0358c5e693..6203b6b5971 100644 --- a/gcc/testsuite/gcc.target/i386/sseregparm-6.c +++ b/gcc/testsuite/gcc.target/i386/sseregparm-6.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-msse2 -O2" } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* Make sure we know that mysinfp returns in %xmm0. */ diff --git a/gcc/testsuite/gcc.target/i386/sseregparm-7.c b/gcc/testsuite/gcc.target/i386/sseregparm-7.c index 99953b5aa9c..61267df9853 100644 --- a/gcc/testsuite/gcc.target/i386/sseregparm-7.c +++ b/gcc/testsuite/gcc.target/i386/sseregparm-7.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-msse2 -O2" } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* Make sure we know that mysinfp returns in %xmm0. */ diff --git a/gcc/testsuite/gcc.target/i386/ssetype-1.c b/gcc/testsuite/gcc.target/i386/ssetype-1.c index 00ea2857484..ef89059b8d8 100644 --- a/gcc/testsuite/gcc.target/i386/ssetype-1.c +++ b/gcc/testsuite/gcc.target/i386/ssetype-1.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* This test checks for absolute memory operands. */ /* { dg-require-effective-target nonpic } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O2 -msse2 -march=k8" } */ /* { dg-final { scan-assembler "andpd\[^\\n\]*magic" } } */ /* { dg-final { scan-assembler "andnpd\[^\\n\]*magic" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssetype-2.c b/gcc/testsuite/gcc.target/i386/ssetype-2.c index c6a8ba7b548..b68a63923fb 100644 --- a/gcc/testsuite/gcc.target/i386/ssetype-2.c +++ b/gcc/testsuite/gcc.target/i386/ssetype-2.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "andpd" } } */ /* { dg-final { scan-assembler "andnpd" } } */ /* { dg-final { scan-assembler "xorpd" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssetype-3.c b/gcc/testsuite/gcc.target/i386/ssetype-3.c index 0e83e28c468..d6887d5cd20 100644 --- a/gcc/testsuite/gcc.target/i386/ssetype-3.c +++ b/gcc/testsuite/gcc.target/i386/ssetype-3.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* This test checks for absolute memory operands. */ /* { dg-require-effective-target nonpic } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O2 -msse2 -march=k8" } */ /* { dg-final { scan-assembler "andps\[^\\n\]*magic" } } */ /* { dg-final { scan-assembler "andnps\[^\\n\]*magic" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssetype-4.c b/gcc/testsuite/gcc.target/i386/ssetype-4.c index 9b68792390d..9994b07f21c 100644 --- a/gcc/testsuite/gcc.target/i386/ssetype-4.c +++ b/gcc/testsuite/gcc.target/i386/ssetype-4.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -march=k8" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "andps" } } */ /* { dg-final { scan-assembler "andnps" } } */ /* { dg-final { scan-assembler "xorps" } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssetype-5.c b/gcc/testsuite/gcc.target/i386/ssetype-5.c index 098ed89ad66..75133e9fa68 100644 --- a/gcc/testsuite/gcc.target/i386/ssetype-5.c +++ b/gcc/testsuite/gcc.target/i386/ssetype-5.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ /* This test checks for absolute memory operands. */ /* { dg-require-effective-target nonpic } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O2 -msse2 -march=k8" } */ /* { dg-final { scan-assembler "pand\[^\\n\]*magic" } } */ /* { dg-final { scan-assembler "pandn\[^\\n\]*magic" } } */ diff --git a/gcc/testsuite/gcc.target/i386/stackalign/return-3.c b/gcc/testsuite/gcc.target/i386/stackalign/return-3.c index 87210d817a8..dd2c2e8b452 100644 --- a/gcc/testsuite/gcc.target/i386/stackalign/return-3.c +++ b/gcc/testsuite/gcc.target/i386/stackalign/return-3.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-skip-if "" { ! { ilp32 && dfp } } { "*" } { "" } } */ /* { dg-options "-msse -std=gnu99 -mpreferred-stack-boundary=2" } */ +/* { dg-require-effective-target sse } */ /* This compile only test is to detect an assertion failure in stack branch development. */ diff --git a/gcc/testsuite/gcc.target/i386/unordcmp-1.c b/gcc/testsuite/gcc.target/i386/unordcmp-1.c index 85de4865d2f..49d4b8e076a 100644 --- a/gcc/testsuite/gcc.target/i386/unordcmp-1.c +++ b/gcc/testsuite/gcc.target/i386/unordcmp-1.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "cmpunordss" } } */ /* { dg-final { scan-assembler "cmpunordps" } } */ /* { dg-final { scan-assembler "cmpunordsd" } } */ diff --git a/gcc/testsuite/gcc.target/i386/vcvtph2ps-1.c b/gcc/testsuite/gcc.target/i386/vcvtph2ps-1.c new file mode 100644 index 00000000000..3b46671f056 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vcvtph2ps-1.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-require-effective-target f16c } */ +/* { dg-options "-O2 -mf16c" } */ + +#include "f16c-check.h" + +static void +f16c_test (void) +{ + union128i_w val; + union128 res; + float exp[4]; + + exp[0] = 1; + exp[1] = -2; + exp[2] = -1; + exp[3] = 2; + + val.a[0] = 0x3c00; + val.a[1] = 0xc000; + val.a[2] = 0xbc00; + val.a[3] = 0x4000; + + res.x = _mm_cvtph_ps (val.x); + + if (check_union128 (res, exp)) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/vcvtph2ps-2.c b/gcc/testsuite/gcc.target/i386/vcvtph2ps-2.c new file mode 100644 index 00000000000..1523deaa1d5 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vcvtph2ps-2.c @@ -0,0 +1,36 @@ +/* { dg-do run } */ +/* { dg-require-effective-target f16c } */ +/* { dg-options "-O2 -mf16c" } */ + +#include "f16c-check.h" + +static void +f16c_test (void) +{ + union256 res; + union128i_w val; + float exp[8]; + + exp[0] = 1; + exp[1] = 2; + exp[2] = 4; + exp[3] = 8; + exp[4] = -1; + exp[5] = -2; + exp[6] = -4; + exp[7] = -8; + + val.a[0] = 0x3c00; + val.a[1] = 0x4000; + val.a[2] = 0x4400; + val.a[3] = 0x4800; + val.a[4] = 0xbc00; + val.a[5] = 0xc000; + val.a[6] = 0xc400; + val.a[7] = 0xc800; + + res.x = _mm256_cvtph_ps (val.x); + + if (check_union256 (res, exp)) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/vcvtph2ps-3.c b/gcc/testsuite/gcc.target/i386/vcvtph2ps-3.c new file mode 100644 index 00000000000..49b61f678c4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vcvtph2ps-3.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ +/* { dg-require-effective-target f16c } */ +/* { dg-options "-O2 -mf16c" } */ + +#include "f16c-check.h" + +static void +f16c_test (void) +{ + unsigned short val = 0xc000; + float exp = -2; + float res; + + res = _cvtsh_ss (val); + + if (res != exp) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/vcvtps2ph-1.c b/gcc/testsuite/gcc.target/i386/vcvtps2ph-1.c new file mode 100644 index 00000000000..c114c98ad8d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vcvtps2ph-1.c @@ -0,0 +1,32 @@ +/* { dg-do run } */ +/* { dg-require-effective-target f16c } */ +/* { dg-options "-O2 -mf16c" } */ + +#include "f16c-check.h" + +static void +f16c_test (void) +{ + union128 val; + union128i_w res; + short exp[8]; + + val.a[0] = 1; + val.a[1] = -2; + val.a[2] = -1; + val.a[3] = 2; + + exp[0] = 0x3c00; + exp[1] = 0xc000; + exp[2] = 0xbc00; + exp[3] = 0x4000; + exp[4] = 0; + exp[5] = 0; + exp[6] = 0; + exp[7] = 0; + + res.x = _mm_cvtps_ph (val.x, 0); + + if (check_union128i_w (res, exp)) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/vcvtps2ph-2.c b/gcc/testsuite/gcc.target/i386/vcvtps2ph-2.c new file mode 100644 index 00000000000..57436ae86bf --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vcvtps2ph-2.c @@ -0,0 +1,36 @@ +/* { dg-do run } */ +/* { dg-require-effective-target f16c } */ +/* { dg-options "-O2 -mf16c" } */ + +#include "f16c-check.h" + +static void +f16c_test (void) +{ + union256 val; + union128i_w res; + short exp[8]; + + val.a[0] = 1; + val.a[1] = 2; + val.a[2] = 4; + val.a[3] = 8; + val.a[4] = -1; + val.a[5] = -2; + val.a[6] = -4; + val.a[7] = -8; + + exp[0] = 0x3c00; + exp[1] = 0x4000; + exp[2] = 0x4400; + exp[3] = 0x4800; + exp[4] = 0xbc00; + exp[5] = 0xc000; + exp[6] = 0xc400; + exp[7] = 0xc800; + + res.x = _mm256_cvtps_ph (val.x, 0); + + if (check_union128i_w (res, exp)) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/vcvtps2ph-3.c b/gcc/testsuite/gcc.target/i386/vcvtps2ph-3.c new file mode 100644 index 00000000000..3b7cb5c5ca0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vcvtps2ph-3.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ +/* { dg-require-effective-target f16c } */ +/* { dg-options "-O2 -mf16c" } */ + +#include "f16c-check.h" + +static void +f16c_test (void) +{ + float val = -2; + unsigned short exp = 0xc000; + unsigned short res; + + res = _cvtss_sh (val, 0); + + if (res != exp) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/vecinit-1.c b/gcc/testsuite/gcc.target/i386/vecinit-1.c index cba7429f242..fad0c07e100 100644 --- a/gcc/testsuite/gcc.target/i386/vecinit-1.c +++ b/gcc/testsuite/gcc.target/i386/vecinit-1.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ + #define vector __attribute__((vector_size(16))) float a; diff --git a/gcc/testsuite/gcc.target/i386/vecinit-2.c b/gcc/testsuite/gcc.target/i386/vecinit-2.c index fdfa837c698..a3a7abc5340 100644 --- a/gcc/testsuite/gcc.target/i386/vecinit-2.c +++ b/gcc/testsuite/gcc.target/i386/vecinit-2.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ + #define vector __attribute__((vector_size(16))) int a; diff --git a/gcc/testsuite/gcc.target/i386/vecinit-3.c b/gcc/testsuite/gcc.target/i386/vecinit-3.c index aae642ae27c..062fb1ed10a 100644 --- a/gcc/testsuite/gcc.target/i386/vecinit-3.c +++ b/gcc/testsuite/gcc.target/i386/vecinit-3.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ + #define vector __attribute__((vector_size(16))) char a; diff --git a/gcc/testsuite/gcc.target/i386/vecinit-4.c b/gcc/testsuite/gcc.target/i386/vecinit-4.c index 101b68badc4..2dfa29c4922 100644 --- a/gcc/testsuite/gcc.target/i386/vecinit-4.c +++ b/gcc/testsuite/gcc.target/i386/vecinit-4.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ + #define vector __attribute__((vector_size(16))) short a; diff --git a/gcc/testsuite/gcc.target/i386/vecinit-5.c b/gcc/testsuite/gcc.target/i386/vecinit-5.c index b9e7e27c78f..dcf8b9206aa 100644 --- a/gcc/testsuite/gcc.target/i386/vecinit-5.c +++ b/gcc/testsuite/gcc.target/i386/vecinit-5.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ + #define vector __attribute__((vector_size(16))) float a, b; diff --git a/gcc/testsuite/gcc.target/i386/vecinit-6.c b/gcc/testsuite/gcc.target/i386/vecinit-6.c index 3b22043273b..6817922d26b 100644 --- a/gcc/testsuite/gcc.target/i386/vecinit-6.c +++ b/gcc/testsuite/gcc.target/i386/vecinit-6.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2" } */ -/* { dg-require-effective-target sse2 } */ + #define vector __attribute__((vector_size(16))) int a, b; diff --git a/gcc/testsuite/gcc.target/i386/vectorize1.c b/gcc/testsuite/gcc.target/i386/vectorize1.c index 7a5023aa905..f673e44c963 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize1.c +++ b/gcc/testsuite/gcc.target/i386/vectorize1.c @@ -1,5 +1,6 @@ /* PR middle-end/28915 */ /* { dg-options "-msse -O2 -ftree-vectorize -fdump-tree-vect" } */ +/* { dg-require-effective-target sse } */ extern char lanip[3][40]; typedef struct diff --git a/gcc/testsuite/gcc.target/i386/vectorize2.c b/gcc/testsuite/gcc.target/i386/vectorize2.c index a7196c70d13..41964871959 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize2.c +++ b/gcc/testsuite/gcc.target/i386/vectorize2.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 -mfpmath=sse" } */ double a[256]; diff --git a/gcc/testsuite/gcc.target/i386/vectorize3.c b/gcc/testsuite/gcc.target/i386/vectorize3.c index e19f8d87bda..2947acbafda 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize3.c +++ b/gcc/testsuite/gcc.target/i386/vectorize3.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 -mfpmath=sse" } */ float a[256]; diff --git a/gcc/testsuite/gcc.target/i386/vectorize4.c b/gcc/testsuite/gcc.target/i386/vectorize4.c index 9933d299729..f3d605e228a 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize4.c +++ b/gcc/testsuite/gcc.target/i386/vectorize4.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-require-effective-target sse2 } */ /* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 --param ggc-min-expand=0 --param ggc-min-heapsize=0" } */ /* This test, tests two thing, we vectorize square root and also we don't crash due to a GC issue. */ diff --git a/gcc/testsuite/gcc.target/i386/vectorize6.c b/gcc/testsuite/gcc.target/i386/vectorize6.c index 41e61aa2ccd..78ec53d15a8 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize6.c +++ b/gcc/testsuite/gcc.target/i386/vectorize6.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -ftree-vectorize -mveclibabi=svml -ffast-math" } */ -/* { dg-require-effective-target sse2 } */ double x[256]; diff --git a/gcc/testsuite/gcc.target/i386/vectorize7.c b/gcc/testsuite/gcc.target/i386/vectorize7.c index eca043bdfa2..10b7ba27868 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize7.c +++ b/gcc/testsuite/gcc.target/i386/vectorize7.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-vectorize -msse2" } */ -/* { dg-require-effective-target sse2 } */ unsigned int a[256]; float b[256]; diff --git a/gcc/testsuite/gcc.target/i386/vectorize8.c b/gcc/testsuite/gcc.target/i386/vectorize8.c index e26362035ad..ed1517b93ef 100644 --- a/gcc/testsuite/gcc.target/i386/vectorize8.c +++ b/gcc/testsuite/gcc.target/i386/vectorize8.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-vectorize -msse2" } */ -/* { dg-require-effective-target sse2 } */ unsigned int a[256]; double b[256]; diff --git a/gcc/testsuite/gcc.target/i386/vperm-v2df.c b/gcc/testsuite/gcc.target/i386/vperm-v2df.c index d0394635c59..40a51306fdc 100644 --- a/gcc/testsuite/gcc.target/i386/vperm-v2df.c +++ b/gcc/testsuite/gcc.target/i386/vperm-v2df.c @@ -3,6 +3,7 @@ /* { dg-require-effective-target sse2 } */ #include "isa-check.h" +#include "sse-os-support.h" typedef double S; typedef double V __attribute__((vector_size(16))); @@ -25,6 +26,11 @@ extern int memcmp (const void *, const void *, __SIZE_TYPE__); int main() { + check_isa (); + + if (!sse_os_support ()) + exit (0); + i[0].s[0] = 0; i[0].s[1] = 1; i[0].s[2] = 2; diff --git a/gcc/testsuite/gcc.target/i386/vperm-v2di.c b/gcc/testsuite/gcc.target/i386/vperm-v2di.c index 940de68af19..8e300837da8 100644 --- a/gcc/testsuite/gcc.target/i386/vperm-v2di.c +++ b/gcc/testsuite/gcc.target/i386/vperm-v2di.c @@ -3,6 +3,7 @@ /* { dg-require-effective-target sse2 } */ #include "isa-check.h" +#include "sse-os-support.h" typedef long long S; typedef long long V __attribute__((vector_size(16))); @@ -25,6 +26,11 @@ extern int memcmp (const void *, const void *, __SIZE_TYPE__); int main() { + check_isa (); + + if (!sse_os_support ()) + exit (0); + i[0].s[0] = 0; i[0].s[1] = 1; i[0].s[2] = 2; diff --git a/gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c b/gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c index b9fc9b172fe..23608b3cf0a 100644 --- a/gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c +++ b/gcc/testsuite/gcc.target/i386/vperm-v4sf-1.c @@ -1,7 +1,9 @@ /* { dg-do run } */ /* { dg-options "-O -msse" } */ +/* { dg-require-effective-target sse } */ #include "isa-check.h" +#include "sse-os-support.h" typedef float S; typedef float V __attribute__((vector_size(16))); @@ -26,6 +28,11 @@ extern int memcmp (const void *, const void *, __SIZE_TYPE__); int main() { + check_isa (); + + if (!sse_os_support ()) + exit (0); + i[0].s[0] = 0; i[0].s[1] = 1; i[0].s[2] = 2; diff --git a/gcc/testsuite/gcc.target/i386/vperm-v4sf-2.c b/gcc/testsuite/gcc.target/i386/vperm-v4sf-2.c index 61b0d5a80dd..a0d49874f99 100644 --- a/gcc/testsuite/gcc.target/i386/vperm-v4sf-2.c +++ b/gcc/testsuite/gcc.target/i386/vperm-v4sf-2.c @@ -27,6 +27,8 @@ extern int memcmp (const void *, const void *, __SIZE_TYPE__); int main() { + check_isa (); + i[0].s[0] = 0; i[0].s[1] = 1; i[0].s[2] = 2; diff --git a/gcc/testsuite/gcc.target/i386/vperm-v4si-1.c b/gcc/testsuite/gcc.target/i386/vperm-v4si-1.c index 93c25c6826a..01b7c6fdab6 100644 --- a/gcc/testsuite/gcc.target/i386/vperm-v4si-1.c +++ b/gcc/testsuite/gcc.target/i386/vperm-v4si-1.c @@ -3,6 +3,7 @@ /* { dg-require-effective-target sse2 } */ #include "isa-check.h" +#include "sse-os-support.h" typedef int S; typedef int V __attribute__((vector_size(16))); @@ -27,6 +28,11 @@ extern int memcmp (const void *, const void *, __SIZE_TYPE__); int main() { + check_isa (); + + if (!sse_os_support ()) + exit (0); + i[0].s[0] = 0; i[0].s[1] = 1; i[0].s[2] = 2; diff --git a/gcc/testsuite/gcc.target/i386/vperm-v4si-2.c b/gcc/testsuite/gcc.target/i386/vperm-v4si-2.c index d77146896e4..43f88ee0935 100644 --- a/gcc/testsuite/gcc.target/i386/vperm-v4si-2.c +++ b/gcc/testsuite/gcc.target/i386/vperm-v4si-2.c @@ -27,6 +27,8 @@ extern int memcmp (const void *, const void *, __SIZE_TYPE__); int main() { + check_isa (); + i[0].s[0] = 0; i[0].s[1] = 1; i[0].s[2] = 2; diff --git a/gcc/testsuite/gcc.target/i386/wrfsbase-1.c b/gcc/testsuite/gcc.target/i386/wrfsbase-1.c new file mode 100644 index 00000000000..4b849269bb2 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/wrfsbase-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "wrfsbase\[ \t]+(%|)edi" } } */ + +#include <immintrin.h> + +void +write_fs_base32 (unsigned int base) +{ + _writefsbase_u32 (base); +} diff --git a/gcc/testsuite/gcc.target/i386/wrfsbase-2.c b/gcc/testsuite/gcc.target/i386/wrfsbase-2.c new file mode 100644 index 00000000000..5e1762dfa3d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/wrfsbase-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "wrfsbase\[ \t]+(%|)rdi" } } */ + +#include <immintrin.h> + +void +write_fs_base64 (unsigned long long base) +{ + _writefsbase_u64 (base); +} diff --git a/gcc/testsuite/gcc.target/i386/wrgsbase-1.c b/gcc/testsuite/gcc.target/i386/wrgsbase-1.c new file mode 100644 index 00000000000..15d2d7ffb9c --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/wrgsbase-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "wrgsbase\[ \t]+(%|)edi" } } */ + +#include <immintrin.h> + +void +write_gs_base32 (unsigned int base) +{ + _writegsbase_u32 (base); +} diff --git a/gcc/testsuite/gcc.target/i386/wrgsbase-2.c b/gcc/testsuite/gcc.target/i386/wrgsbase-2.c new file mode 100644 index 00000000000..0a33d770710 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/wrgsbase-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -mfsgsbase" } */ +/* { dg-final { scan-assembler "wrgsbase\[ \t]+(%|)rdi" } } */ + +#include <immintrin.h> + +void +write_gs_base64 (unsigned long long base) +{ + _writegsbase_u64 (base); +} diff --git a/gcc/testsuite/gcc.target/i386/xorps-sse2.c b/gcc/testsuite/gcc.target/i386/xorps-sse2.c index 4d3994c88ef..3c268b4cbaa 100644 --- a/gcc/testsuite/gcc.target/i386/xorps-sse2.c +++ b/gcc/testsuite/gcc.target/i386/xorps-sse2.c @@ -1,7 +1,6 @@ /* Test that we generate xorps when the result is used in FP math. */ /* { dg-do compile } */ /* { dg-options "-O -msse2 -mno-sse3" } */ -/* { dg-require-effective-target sse2 } */ /* { dg-final { scan-assembler "xorps\[ \t\]" { xfail *-*-* } } } */ /* { dg-final { scan-assembler-not "pxor" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.target/i386/xorps.c b/gcc/testsuite/gcc.target/i386/xorps.c index bc2e97d76d6..6803a4d8916 100644 --- a/gcc/testsuite/gcc.target/i386/xorps.c +++ b/gcc/testsuite/gcc.target/i386/xorps.c @@ -1,6 +1,5 @@ /* { dg-do compile } */ /* { dg-options "-Os -msse2" } */ -/* { dg-require-effective-target sse2 } */ typedef float __m128 __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/gcc.target/m68k/pr45015.c b/gcc/testsuite/gcc.target/m68k/pr45015.c new file mode 100644 index 00000000000..fba9550e9ef --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/pr45015.c @@ -0,0 +1,26 @@ +/* PR debug/45015 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -g" } */ + +unsigned int +foo (unsigned int *x, const unsigned int *y, int z, unsigned int w) +{ + unsigned int a, b, c, s; + int j; + j = -z; + x -= j; + y -= j; + a = 0; + do + { + __asm__ ("move.l %2, %0; move.l %3, %1" : "=d" (b), "=d" (c) : "g<>" (y[j]), "d" (w)); + c += a; + a = (c < a) + b; + s = x[j]; + c = s + c; + a += (c < s); + x[j] = c; + } + while (++j != 0); + return a; +} diff --git a/gcc/testsuite/gcc.target/mips/cache-1.c b/gcc/testsuite/gcc.target/mips/cache-1.c index 05cb4079157..da897066d49 100644 --- a/gcc/testsuite/gcc.target/mips/cache-1.c +++ b/gcc/testsuite/gcc.target/mips/cache-1.c @@ -26,5 +26,5 @@ f4 (const volatile unsigned char *area) /* { dg-final { scan-assembler "\tcache\t0x14,0\\(\\\$4\\)" } } */ /* { dg-final { scan-assembler "\tcache\t0x18,20\\(\\\$4\\)" } } */ -/* { dg-final { scan-assembler "\tcache\t0x0,0\\(\\\$.\\)" } } */ +/* { dg-final { scan-assembler "\tcache\t(0x|)0,0\\(\\\$.\\)" } } */ /* { dg-final { scan-assembler "\tcache\t0x4,-80\\(\\\$4\\)" } } */ diff --git a/gcc/testsuite/gcc.target/mips/mips.exp b/gcc/testsuite/gcc.target/mips/mips.exp index 02e031cd15c..0a7bc1de8dd 100644 --- a/gcc/testsuite/gcc.target/mips/mips.exp +++ b/gcc/testsuite/gcc.target/mips/mips.exp @@ -233,7 +233,7 @@ set mips_option_groups { fp "-mfp(32|64)" gp "-mgp(32|64)" long "-mlong(32|64)" - mips16 "-mips16|-mno-mips16" + mips16 "-mips16|-mno-mips16|-mflip-mips16" mips3d "-mips3d|-mno-mips3d" optimization "-O(|[0-3s])" pic "-f(no-|)(pic|PIC)" @@ -509,6 +509,14 @@ proc mips_have_option_p { upstatus option } { $option] } +# Return true if the options described by UPSTATUS require MIPS16 support. +proc mips_using_mips16_p { upstatus } { + upvar $upstatus status + + return [expr { [mips_have_option_p status "-mips16"] + || [mips_have_option_p status "-mflip-mips16"] }] +} + # Return true if the test described by UPSTATUS requires option OPTION. proc mips_have_test_option_p { upstatus option } { upvar $upstatus status @@ -763,7 +771,7 @@ proc mips-dg-finish {} { # # START END # | | -# -mips16 -mno-mips16 +# -mips16/-mflip-mips16 -mno-mips16 # | | # -mips3d -mno-mips3d # | | @@ -1011,7 +1019,7 @@ proc mips-dg-options { args } { # EABI doesn't support -mabicalls. # EABI doesn't support the combination -mgp32 -mfp64. set force_abi 1 - } elseif { [mips_have_option_p options "-mips16"] + } elseif { [mips_using_mips16_p options] && ![mips_same_option_p $abi "-mabi=32"] && ![mips_same_option_p $abi "-mabi=o64"] && (![mips_have_option_p options "addressing=absolute"] @@ -1048,7 +1056,7 @@ proc mips-dg-options { args } { mips_make_test_option options "-mfp32" } } - if { [mips_have_option_p options "-mips16"] + if { [mips_using_mips16_p options] && ![mips_same_option_p $abi "-mabi=32"] && ![mips_same_option_p $abi "-mabi=o64"] && (![mips_have_option_p options "addressing=absolute"] diff --git a/gcc/testsuite/gcc.target/mips/mips16-attributes-4.c b/gcc/testsuite/gcc.target/mips/mips16-attributes-4.c new file mode 100644 index 00000000000..de7cb4349b7 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/mips16-attributes-4.c @@ -0,0 +1,17 @@ +/* { dg-do run } */ +/* { dg-options "(-mips16)" } */ + +extern void abort (void); + +__complex float f = { -1.0 + -1.0i }; +__complex float __attribute__((nomips16)) foo (void) { return f; } +__complex float (*volatile foop) (void) = foo; +__complex float __attribute__((mips16, noinline)) bar (void) { return foop (); } + +int +main (void) +{ + if (bar () != f) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-volatile.c b/gcc/testsuite/gcc.target/powerpc/altivec-volatile.c index 594ec88b4e7..a2aa111459e 100644 --- a/gcc/testsuite/gcc.target/powerpc/altivec-volatile.c +++ b/gcc/testsuite/gcc.target/powerpc/altivec-volatile.c @@ -8,6 +8,6 @@ vector float *f (volatile vector float *a) { - return a; /* { dg-warning "discards qualifiers" } */ + return a; /* { dg-warning "discards 'volatile' qualifier" } */ } diff --git a/gcc/testsuite/gcc.target/powerpc/block-move-1.c b/gcc/testsuite/gcc.target/powerpc/block-move-1.c new file mode 100644 index 00000000000..7b6623fbe51 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/block-move-1.c @@ -0,0 +1,14 @@ +/* Test that we bump up low values of -mblock-move-inline-limit */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mblock-move-inline-limit=8" } */ + +typedef __SIZE_TYPE__ size_t; +extern void *memcpy (void *, const void *, size_t); + +void +cpy16 (void *x, void *y) +{ + memcpy (x, y, 16); +} + +/* { dg-final { scan-assembler-not "memcpy" } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/block-move-2.c b/gcc/testsuite/gcc.target/powerpc/block-move-2.c new file mode 100644 index 00000000000..ffaf9ef05e8 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/block-move-2.c @@ -0,0 +1,14 @@ +/* Test that we honor -mblock-move-inline-limit. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mblock-move-inline-limit=128" } */ + +typedef __SIZE_TYPE__ size_t; +extern void *memcpy (void *, const void *, size_t); + +void +cpy128 (void *x, void *y) +{ + memcpy (x, y, 128); +} + +/* { dg-final { scan-assembler-not "memcpy" } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/ppu-intrinsics.c b/gcc/testsuite/gcc.target/powerpc/ppu-intrinsics.c index 3d9afb25aa7..8efaeaba38a 100644 --- a/gcc/testsuite/gcc.target/powerpc/ppu-intrinsics.c +++ b/gcc/testsuite/gcc.target/powerpc/ppu-intrinsics.c @@ -1,5 +1,5 @@ /* { dg-do link { target { *-*-linux* && powerpc_fprs } } } */ -/* { dg-options "-W -Wall -Wno-uninitialized -mcpu=cell" } */ +/* { dg-options "-W -Wall -Wno-uninitialized -Wno-unused-but-set-variable -mcpu=cell" } */ /* Test some PPU intrinsics from <ppu_intrinsics.h>. */ #include <ppu_intrinsics.h> diff --git a/gcc/testsuite/gcc.target/powerpc/recip-1.c b/gcc/testsuite/gcc.target/powerpc/recip-1.c index d1e383dc4ea..590881bb892 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-1.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-1.c @@ -1,4 +1,4 @@ -/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-do compile { target { { powerpc*-*-* } && { ! powerpc*-apple-darwin* } } } } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power6" } */ /* { dg-final { scan-assembler-times "frsqrte" 2 } } */ /* { dg-final { scan-assembler-times "fmsub" 2 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/recip-2.c b/gcc/testsuite/gcc.target/powerpc/recip-2.c index 69442733aab..3e64c07578f 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-2.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-2.c @@ -1,4 +1,4 @@ -/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-do compile { target { { powerpc*-*-* } && { ! powerpc*-apple-darwin* } } } } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power5" } */ /* { dg-final { scan-assembler-times "frsqrtes" 1 } } */ /* { dg-final { scan-assembler-times "fmsubs" 1 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/recip-3.c b/gcc/testsuite/gcc.target/powerpc/recip-3.c index 80a34e8ee59..c5ce539bb42 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-3.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-3.c @@ -1,4 +1,4 @@ -/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-do compile { target { { powerpc*-*-* } && { ! powerpc*-apple-darwin* } } } } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power7" } */ /* { dg-final { scan-assembler-times "xsrsqrtedp" 1 } } */ /* { dg-final { scan-assembler-times "xsmsub.dp" 1 } } */ diff --git a/gcc/testsuite/gcc.target/x86_64/abi/asm-support-darwin.s b/gcc/testsuite/gcc.target/x86_64/abi/asm-support-darwin.s index 5a7c91be6ee..b3b88466a62 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/asm-support-darwin.s +++ b/gcc/testsuite/gcc.target/x86_64/abi/asm-support-darwin.s @@ -22,20 +22,20 @@ _snapshot: movq %r15, _r15(%rip) movdqu %xmm0, _xmm_regs+0(%rip) movdqu %xmm1, _xmm_regs+16(%rip) - movdqu %xmm2, _xmm_regs+16*2(%rip) - movdqu %xmm3, _xmm_regs+16*3(%rip) - movdqu %xmm4, _xmm_regs+16*4(%rip) - movdqu %xmm5, _xmm_regs+16*5(%rip) - movdqu %xmm6, _xmm_regs+16*6(%rip) - movdqu %xmm7, _xmm_regs+16*7(%rip) - movdqu %xmm8, _xmm_regs+16*8(%rip) - movdqu %xmm9, _xmm_regs+16*9(%rip) - movdqu %xmm10, _xmm_regs+16*10(%rip) - movdqu %xmm11, _xmm_regs+16*11(%rip) - movdqu %xmm12, _xmm_regs+16*12(%rip) - movdqu %xmm13, _xmm_regs+16*13(%rip) - movdqu %xmm14, _xmm_regs+16*14(%rip) - movdqu %xmm15, _xmm_regs+16*15(%rip) + movdqu %xmm2, _xmm_regs+32(%rip) + movdqu %xmm3, _xmm_regs+48(%rip) + movdqu %xmm4, _xmm_regs+64(%rip) + movdqu %xmm5, _xmm_regs+80(%rip) + movdqu %xmm6, _xmm_regs+96(%rip) + movdqu %xmm7, _xmm_regs+112(%rip) + movdqu %xmm8, _xmm_regs+128(%rip) + movdqu %xmm9, _xmm_regs+144(%rip) + movdqu %xmm10, _xmm_regs+160(%rip) + movdqu %xmm11, _xmm_regs+176(%rip) + movdqu %xmm12, _xmm_regs+192(%rip) + movdqu %xmm13, _xmm_regs+208(%rip) + movdqu %xmm14, _xmm_regs+224(%rip) + movdqu %xmm15, _xmm_regs+240(%rip) jmp *_callthis(%rip) .LFE3: .p2align 4,,15 diff --git a/gcc/testsuite/gcc.target/x86_64/abi/asm-support.S b/gcc/testsuite/gcc.target/x86_64/abi/asm-support.S index cb1e31ea785..8e0bffe8b49 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/asm-support.S +++ b/gcc/testsuite/gcc.target/x86_64/abi/asm-support.S @@ -26,20 +26,20 @@ snapshot: movq %r15, r15(%rip) movdqu %xmm0, xmm_regs+0(%rip) movdqu %xmm1, xmm_regs+16(%rip) - movdqu %xmm2, xmm_regs+16*2(%rip) - movdqu %xmm3, xmm_regs+16*3(%rip) - movdqu %xmm4, xmm_regs+16*4(%rip) - movdqu %xmm5, xmm_regs+16*5(%rip) - movdqu %xmm6, xmm_regs+16*6(%rip) - movdqu %xmm7, xmm_regs+16*7(%rip) - movdqu %xmm8, xmm_regs+16*8(%rip) - movdqu %xmm9, xmm_regs+16*9(%rip) - movdqu %xmm10, xmm_regs+16*10(%rip) - movdqu %xmm11, xmm_regs+16*11(%rip) - movdqu %xmm12, xmm_regs+16*12(%rip) - movdqu %xmm13, xmm_regs+16*13(%rip) - movdqu %xmm14, xmm_regs+16*14(%rip) - movdqu %xmm15, xmm_regs+16*15(%rip) + movdqu %xmm2, xmm_regs+32(%rip) + movdqu %xmm3, xmm_regs+48(%rip) + movdqu %xmm4, xmm_regs+64(%rip) + movdqu %xmm5, xmm_regs+80(%rip) + movdqu %xmm6, xmm_regs+96(%rip) + movdqu %xmm7, xmm_regs+112(%rip) + movdqu %xmm8, xmm_regs+128(%rip) + movdqu %xmm9, xmm_regs+144(%rip) + movdqu %xmm10, xmm_regs+160(%rip) + movdqu %xmm11, xmm_regs+176(%rip) + movdqu %xmm12, xmm_regs+192(%rip) + movdqu %xmm13, xmm_regs+208(%rip) + movdqu %xmm14, xmm_regs+224(%rip) + movdqu %xmm15, xmm_regs+240(%rip) jmp *callthis(%rip) .LFE3: .size snapshot, .-snapshot diff --git a/gcc/testsuite/gcc.target/x86_64/abi/avx/asm-support.S b/gcc/testsuite/gcc.target/x86_64/abi/avx/asm-support.S index a4d002e19e4..d248ef02e84 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/avx/asm-support.S +++ b/gcc/testsuite/gcc.target/x86_64/abi/avx/asm-support.S @@ -23,20 +23,20 @@ snapshot: movq %r15, r15(%rip) vmovdqu %ymm0, ymm_regs+0(%rip) vmovdqu %ymm1, ymm_regs+32(%rip) - vmovdqu %ymm2, ymm_regs+32*2(%rip) - vmovdqu %ymm3, ymm_regs+32*3(%rip) - vmovdqu %ymm4, ymm_regs+32*4(%rip) - vmovdqu %ymm5, ymm_regs+32*5(%rip) - vmovdqu %ymm6, ymm_regs+32*6(%rip) - vmovdqu %ymm7, ymm_regs+32*7(%rip) - vmovdqu %ymm8, ymm_regs+32*8(%rip) - vmovdqu %ymm9, ymm_regs+32*9(%rip) - vmovdqu %ymm10, ymm_regs+32*10(%rip) - vmovdqu %ymm11, ymm_regs+32*11(%rip) - vmovdqu %ymm12, ymm_regs+32*12(%rip) - vmovdqu %ymm13, ymm_regs+32*13(%rip) - vmovdqu %ymm14, ymm_regs+32*14(%rip) - vmovdqu %ymm15, ymm_regs+32*15(%rip) + vmovdqu %ymm2, ymm_regs+64(%rip) + vmovdqu %ymm3, ymm_regs+96(%rip) + vmovdqu %ymm4, ymm_regs+128(%rip) + vmovdqu %ymm5, ymm_regs+160(%rip) + vmovdqu %ymm6, ymm_regs+192(%rip) + vmovdqu %ymm7, ymm_regs+224(%rip) + vmovdqu %ymm8, ymm_regs+256(%rip) + vmovdqu %ymm9, ymm_regs+288(%rip) + vmovdqu %ymm10, ymm_regs+320(%rip) + vmovdqu %ymm11, ymm_regs+352(%rip) + vmovdqu %ymm12, ymm_regs+384(%rip) + vmovdqu %ymm13, ymm_regs+416(%rip) + vmovdqu %ymm14, ymm_regs+448(%rip) + vmovdqu %ymm15, ymm_regs+480(%rip) jmp *callthis(%rip) .LFE3: .size snapshot, .-snapshot diff --git a/gcc/testsuite/gcc.target/x86_64/abi/avx/avx-check.h b/gcc/testsuite/gcc.target/x86_64/abi/avx/avx-check.h index 7f1f8f9fc5c..e66a27e9afd 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/avx/avx-check.h +++ b/gcc/testsuite/gcc.target/x86_64/abi/avx/avx-check.h @@ -12,7 +12,7 @@ main () return 0; /* Run AVX test only if host has AVX support. */ - if (ecx & bit_AVX) + if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE)) { avx_test (); #ifdef DEBUG diff --git a/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 b/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 new file mode 100644 index 00000000000..379fbd7f8f9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 @@ -0,0 +1,55 @@ +! { dg-do run } +! +! PR fortran/45019 +! +! Check that the compiler knows that +! "arg" and "arr" can alias. +! +MODULE m + IMPLICIT NONE + INTEGER, TARGET :: arr(3) +CONTAINS + SUBROUTINE foobar (arg) + INTEGER, TARGET :: arg(:) + arr(2:3) = arg(1:2) + END SUBROUTINE foobar +END MODULE m + +PROGRAM main + USE m + IMPLICIT NONE + arr = (/ 1, 2, 3 /) + CALL bar(arr) + if (any (arr /= (/ 1, 1, 2 /))) call abort() + CALL test() +contains + subroutine bar(x) + INTEGER, TARGET :: x(:) + CALL foobar (x) + end subroutine bar +END PROGRAM main + +MODULE m2 + IMPLICIT NONE + INTEGER, TARGET :: arr(3) +CONTAINS + SUBROUTINE foobar (arg) + INTEGER, TARGET :: arg(:) + arr(1) = 5 + arg(1) = 6 + if (arr(1) == 5) call abort() + END SUBROUTINE foobar +END MODULE m2 +subroutine test + USE m2 + IMPLICIT NONE + arr = (/ 1, 2, 3 /) + CALL bar(arr) +contains + subroutine bar(x) + INTEGER, TARGET :: x(:) + CALL foobar (x) + end subroutine bar +END subroutine test + +! { dg-final { cleanup-modules "m m2" } } diff --git a/gcc/testsuite/gfortran.dg/array_memcpy_3.f90 b/gcc/testsuite/gfortran.dg/array_memcpy_3.f90 index df6bd49ef26..78097308030 100644 --- a/gcc/testsuite/gfortran.dg/array_memcpy_3.f90 +++ b/gcc/testsuite/gfortran.dg/array_memcpy_3.f90 @@ -11,5 +11,5 @@ subroutine bar(x) x = (/ 3, 1, 4, 1 /) end subroutine -! { dg-final { scan-tree-dump-times "memcpy|ref-all" 2 "original" } } +! { dg-final { scan-tree-dump-times "memcpy|(ref-all.*ref-all)" 2 "original" } } ! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/array_memcpy_4.f90 b/gcc/testsuite/gfortran.dg/array_memcpy_4.f90 index 0f8b5cb15b0..9f2279d881c 100644 --- a/gcc/testsuite/gfortran.dg/array_memcpy_4.f90 +++ b/gcc/testsuite/gfortran.dg/array_memcpy_4.f90 @@ -9,5 +9,5 @@ d = s end -! { dg-final { scan-tree-dump-times "d = " 1 "original" } } +! { dg-final { scan-tree-dump-times "MEM.*d\\\] = MEM" 1 "original" } } ! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/c_loc_tests_15.f90 b/gcc/testsuite/gfortran.dg/c_loc_tests_15.f90 new file mode 100644 index 00000000000..63f8816379e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/c_loc_tests_15.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! +! PR 44925: [OOP] C_LOC with CLASS pointer +! +! Contributed by Barron Bichon <barron.bichon@swri.org> + + use iso_c_binding + + type :: t + end type t + + type(c_ptr) :: tt_cptr + class(t), pointer :: tt_fptr + if (associated(tt_fptr)) tt_cptr = c_loc(tt_fptr) ! { dg-error "must not be polymorphic" } + +end diff --git a/gcc/testsuite/gfortran.dg/c_sizeof_1.f90 b/gcc/testsuite/gfortran.dg/c_sizeof_1.f90 index f2a5caf6864..b30bdc5285e 100644 --- a/gcc/testsuite/gfortran.dg/c_sizeof_1.f90 +++ b/gcc/testsuite/gfortran.dg/c_sizeof_1.f90 @@ -1,8 +1,12 @@ ! { dg-do run } ! Support F2008's c_sizeof() ! -integer(4) :: i, j(10) -character(4),parameter :: str(1) = "abcd" +use iso_c_binding, only: c_int, c_char, c_ptr, c_intptr_t, c_null_ptr + +integer(kind=c_int) :: i, j(10) +character(kind=c_char,len=4),parameter :: str(1) = "abcd" +type(c_ptr) :: cptr +integer(c_intptr_t) :: iptr ! Using F2008's C_SIZEOF i = c_sizeof(i) @@ -18,9 +22,10 @@ i = c_sizeof(str(1)) if (i /= 4) call abort() i = c_sizeof(str(1)(1:3)) -print *, i if (i /= 3) call abort() +write(*,*) c_sizeof(cptr), c_sizeof(iptr), c_sizeof(C_NULL_PTR) + ! Using GNU's SIZEOF i = sizeof(i) if (i /= 4) call abort() @@ -36,5 +41,6 @@ if (i /= 4) call abort() i = sizeof(str(1)(1:3)) if (i /= 3) call abort() + end diff --git a/gcc/testsuite/gfortran.dg/char4_iunit_1.f03 b/gcc/testsuite/gfortran.dg/char4_iunit_1.f03 new file mode 100644 index 00000000000..98e5cdd070c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char4_iunit_1.f03 @@ -0,0 +1,32 @@ +! { dg-do run } +! PR37077 Implement Internal Unit I/O for character KIND=4 +! Test case prepared by Jerry DeLisle <jvdelisle@gcc.gnu.org> +program char4_iunit_1 + implicit none + character(kind=4,len=42) :: string + integer(kind=4) :: i,j + real(kind=4) :: inf, nan, large + + large = huge(large) + inf = 2 * large + nan = 0 + nan = nan / nan + + string = 4_"123456789x" + write(string,'(a11)') 4_"abcdefg" + if (string .ne. 4_" abcdefg ") call abort + write(string,*) 12345 + if (string .ne. 4_" 12345 ") call abort + write(string, '(i6,5x,i8,a5)') 78932, 123456, "abc" + if (string .ne. 4_" 78932 123456 abc ") call abort + write(string, *) .true., .false. , .true. + if (string .ne. 4_" T F T ") call abort + write(string, *) 1.2345e-06, 4.2846e+10_8 + if (string .ne. 4_" 1.23450002E-06 42846000000.000000 ") call abort + write(string, *) nan, inf + if (string .ne. 4_" NaN +Infinity ") call abort + write(string, '(10x,f3.1,3x,f9.1)') nan, inf + if (string .ne. 4_" NaN +Infinity ") call abort + write(string, *) (1.2, 3.4 ) + if (string .ne. 4_" ( 1.2000000 , 3.4000001 ) ") call abort +end program char4_iunit_1 diff --git a/gcc/testsuite/gfortran.dg/char4_iunit_2.f03 b/gcc/testsuite/gfortran.dg/char4_iunit_2.f03 new file mode 100644 index 00000000000..074321274ca --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char4_iunit_2.f03 @@ -0,0 +1,47 @@ +! { dg-do run } +! PR37077 Implement Internal Unit I/O for character KIND=4 +! Test case prepared by Jerry DeLisle <jvdelisle@gcc.gnu.org> +program char4_iunit_2 + implicit none + integer, parameter :: k = 4 + character(kind=4,len=80) :: widestring, str_char4 + character(kind=1,len=80) :: skinnystring + integer :: i,j + real :: x + character(9) :: str_default + + widestring = k_"12345 2.54360 hijklmnop qwertyuiopasdfg" + skinnystring = "12345 2.54360 hijklmnop qwertyuiopasdfg" + i = 77777 + x = 0.0 + str_default = "xxxxxxxxx" + str_char4 = k_"xyzzy" + read(widestring,'(i5,1x,f7.5,1x,a9,1x,a15)') i, x, str_default, str_char4 + if (i /= 12345 .or. (x - 2.5436001) > epsilon(x) .or. & + str_default /= "hijklmnop" .or. str_char4 /= k_"qwertyuiopasdfg")& + call abort + i = 77777 + x = 0.0 + str_default = "xxxxxxxxx" + str_char4 = k_"xyzzy" + read(widestring,'(2x,i4,tl3,1x,f7.5,1x,a9,1x,a15)')i, x, str_default,& + str_char4 + if (i /= 345 .or. (x - 52.542999) > epsilon(x) .or. & + str_default /= "0 hijklmn" .or. str_char4 /= k_"p qwertyuiopasd")& + call abort + read(skinnystring,'(2x,i4,tl3,1x,f7.5,1x,a9,1x,a15)')i, x, str_default,& + str_char4 + if (i /= 345 .or. (x - 52.542999) > epsilon(x) .or. & + str_default /= "0 hijklmn" .or. str_char4 /= k_"p qwertyuiopasd")& + call abort + write(widestring,'(2x,i4,tl3,1x,f10.5,1x,a9,1x,a15)')i, x, str_default,& + trim(str_char4) + if (widestring .ne. k_" 3 52.54300 0 hijklmn p qwertyuiopasd") call abort + write(skinnystring,'(2x,i4,tl3,1x,f10.5,1x,a9,1x,a15)')i, x, str_default,& + trim(str_char4) + if (skinnystring .ne. " 3 52.54300 0 hijklmn p qwertyuiopasd") call abort + write(widestring,*)"test",i, x, str_default,& + trim(str_char4) + if (widestring .ne. & + k_" test 345 52.542999 0 hijklmnp qwertyuiopasd") call abort +end program char4_iunit_2 diff --git a/gcc/testsuite/gfortran.dg/char_bounds_check_fail_1.f90 b/gcc/testsuite/gfortran.dg/char_bounds_check_fail_1.f90 index bd5552c0ea6..15d70215020 100644 --- a/gcc/testsuite/gfortran.dg/char_bounds_check_fail_1.f90 +++ b/gcc/testsuite/gfortran.dg/char_bounds_check_fail_1.f90 @@ -10,4 +10,4 @@ program bound_check zz(i:j) = 'abcdef' print * , zz end -! { dg-output "Substring out of bounds: upper bound exceeds string length.*at line 9)} +! { dg-output "At line 10.*Substring out of bounds: upper bound \\(11\\) of 'zz' exceeds string length" } diff --git a/gcc/testsuite/gfortran.dg/class_24.f03 b/gcc/testsuite/gfortran.dg/class_24.f03 new file mode 100644 index 00000000000..085e6d1e1ce --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_24.f03 @@ -0,0 +1,22 @@ +! { dg-do compile } +! +! PR 44869: [OOP] Missing TARGET check - and wrong code or accepts-invalid? +! +! Contributed by Satish.BD <bdsatish@gmail.com> + + type :: test_case + end type + + type :: test_suite + type(test_case) :: list + end type + +contains + + subroutine sub(self) + class(test_suite), intent(inout) :: self + type(test_case), pointer :: tst_case + tst_case => self%list ! { dg-error "is neither TARGET nor POINTER" } + end subroutine + +end diff --git a/gcc/testsuite/gfortran.dg/class_defined_operator_1.f03 b/gcc/testsuite/gfortran.dg/class_defined_operator_1.f03 new file mode 100644 index 00000000000..008739e3f98 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_defined_operator_1.f03 @@ -0,0 +1,102 @@ +! { dg-do run } +! Test the fix for PR42385, in which CLASS defined operators +! compiled but were not correctly dynamically dispatched. +! +! Contributed by Janus Weil <janus@gcc.gnu.org> +! +module foo_module + implicit none + private + public :: foo + + type :: foo + integer :: foo_x + contains + procedure :: times => times_foo + procedure :: assign => assign_foo + generic :: operator(*) => times + generic :: assignment(=) => assign + end type + +contains + + function times_foo(this,factor) result(product) + class(foo) ,intent(in) :: this + class(foo) ,allocatable :: product + integer, intent(in) :: factor + allocate (product, source = this) + product%foo_x = -product%foo_x * factor + end function + + subroutine assign_foo(lhs,rhs) + class(foo) ,intent(inout) :: lhs + class(foo) ,intent(in) :: rhs + lhs%foo_x = -rhs%foo_x + end subroutine + +end module + +module bar_module + use foo_module ,only : foo + implicit none + private + public :: bar + + type ,extends(foo) :: bar + integer :: bar_x + contains + procedure :: times => times_bar + procedure :: assign => assign_bar + end type + +contains + subroutine assign_bar(lhs,rhs) + class(bar) ,intent(inout) :: lhs + class(foo) ,intent(in) :: rhs + select type(rhs) + type is (bar) + lhs%bar_x = rhs%bar_x + lhs%foo_x = -rhs%foo_x + end select + end subroutine + function times_bar(this,factor) result(product) + class(bar) ,intent(in) :: this + integer, intent(in) :: factor + class(foo), allocatable :: product + select type(this) + type is (bar) + allocate(product,source=this) + select type(product) + type is(bar) + product%bar_x = 2*this%bar_x*factor + end select + end select + end function +end module + +program main + use foo_module ,only : foo + use bar_module ,only : bar + implicit none + type(foo) :: unitf + type(bar) :: unitb + +! foo's assign negates, whilst its '*' negates and mutliplies. + unitf%foo_x = 1 + call rescale(unitf, 42) + if (unitf%foo_x .ne. 42) call abort + +! bar's assign negates foo_x, whilst its '*' copies foo_x +! and does a multiply by twice factor. + unitb%foo_x = 1 + unitb%bar_x = 2 + call rescale(unitb, 3) + if (unitb%bar_x .ne. 12) call abort + if (unitb%foo_x .ne. -1) call abort +contains + subroutine rescale(this,scale) + class(foo) ,intent(inout) :: this + integer, intent(in) :: scale + this = this*scale + end subroutine +end program diff --git a/gcc/testsuite/gfortran.dg/coarray_10.f90 b/gcc/testsuite/gfortran.dg/coarray_10.f90 index 7a50c89fc3c..6ee425d7bf9 100644 --- a/gcc/testsuite/gfortran.dg/coarray_10.f90 +++ b/gcc/testsuite/gfortran.dg/coarray_10.f90 @@ -24,5 +24,23 @@ subroutine this_image_check() j = this_image(dim=3) ! { dg-error "DIM argument without ARRAY argument" } i = image_index(i, [ 1 ]) ! { dg-error "Expected coarray variable" } i = image_index(z, 2) ! { dg-error "must be a rank one array" } - end subroutine this_image_check + + +subroutine rank_mismatch() + implicit none + integer,allocatable :: A(:)[:,:,:,:] + allocate(A(1)[1,1,1:*]) ! { dg-error "Unexpected ... for codimension" } + allocate(A(1)[1,1,1,1,1,*]) ! { dg-error "Invalid codimension 5" } + allocate(A(1)[1,1,1,*]) + allocate(A(1)[1,1]) ! { dg-error "Too few codimensions" } + allocate(A(1)[1,*]) ! { dg-error "Too few codimensions" } + allocate(A(1)[1,1:*]) ! { dg-error "Unexpected ... for codimension" } + + A(1)[1,1,1] = 1 ! { dg-error "Too few codimensions" } + A(1)[1,1,1,1,1,1] = 1 ! { dg-error "Invalid codimension 5" } + A(1)[1,1,1,1] = 1 + A(1)[1,1] = 1 ! { dg-error "Too few codimensions" } + A(1)[1,1] = 1 ! { dg-error "Too few codimensions" } + A(1)[1,1:1] = 1 ! { dg-error "Too few codimensions" } +end subroutine rank_mismatch diff --git a/gcc/testsuite/gfortran.dg/derived_constructor_comps_3.f90 b/gcc/testsuite/gfortran.dg/derived_constructor_comps_3.f90 index 688c38d9192..0aa2e4e1c18 100644 --- a/gcc/testsuite/gfortran.dg/derived_constructor_comps_3.f90 +++ b/gcc/testsuite/gfortran.dg/derived_constructor_comps_3.f90 @@ -1,4 +1,4 @@ -! { dg-compile } +! { dg-do compile } ! ! gfortran was ICEing for the constructor of ! componentfree types. diff --git a/gcc/testsuite/gfortran.dg/dim_range_1.f90 b/gcc/testsuite/gfortran.dg/dim_range_1.f90 new file mode 100644 index 00000000000..59f3f431143 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dim_range_1.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! PR 44693 - check for invalid dim even in functions. +! Based on a test case by Dominique d'Humieres. +subroutine test1(esss,Ix,Iyz, n) + real(kind=kind(1.0d0)), dimension(n), intent(out) :: esss + real(kind=kind(1.0d0)), dimension(n,n,n) :: sp + real(kind=kind(1.0d0)), dimension(n,n) :: Ix,Iyz + esss = sum(Ix * Iyz, 0) ! { dg-error "is not a valid dimension index" } + esss = sum(Ix * Iyz, 1) + esss = sum(Ix * Iyz, 2) + esss = sum(Ix * Iyz, 3) ! { dg-error "is not a valid dimension index" } + sp = spread (ix * iyz, 0, n) ! { dg-error "is not a valid dimension index" } + sp = spread (ix * iyz, 1, n) + sp = spread (ix * iyz, 2, n) + sp = spread (ix * iyz, 3, n) + sp = spread (ix * iyz, 4, n) ! { dg-error "is not a valid dimension index" } +end subroutine diff --git a/gcc/testsuite/gfortran.dg/dynamic_dispatch_1.f03 b/gcc/testsuite/gfortran.dg/dynamic_dispatch_1.f03 index 4854b0ff08d..2182dce3e4f 100644 --- a/gcc/testsuite/gfortran.dg/dynamic_dispatch_1.f03 +++ b/gcc/testsuite/gfortran.dg/dynamic_dispatch_1.f03 @@ -12,16 +12,14 @@ module m procedure, pass :: make_integer procedure, pass :: prod => i_m_j generic, public :: extract => real, make_integer - generic, public :: base_extract => real, make_integer end type t1 type, extends(t1) :: t2 integer :: j = 99 contains procedure, pass :: real => make_real2 - procedure, pass :: make_integer_2 + procedure, pass :: make_integer => make_integer_2 procedure, pass :: prod => i_m_j_2 - generic, public :: extract => real, make_integer_2 end type t2 contains real function make_real (arg) @@ -69,16 +67,13 @@ end module m if (a%real() .ne. real (42)) call abort if (a%prod() .ne. 42) call abort if (a%extract (2) .ne. 84) call abort - if (a%base_extract (2) .ne. 84) call abort a => c ! extension in module if (a%real() .ne. real (99)) call abort if (a%prod() .ne. 99) call abort if (a%extract (3) .ne. 297) call abort - if (a%base_extract (3) .ne. 126) call abort a => d ! extension in main if (a%real() .ne. real (42)) call abort if (a%prod() .ne. 42) call abort if (a%extract (4) .ne. 168) call abort - if (a%base_extract (4) .ne. 168) call abort end ! { dg-final { cleanup-modules "m" } } diff --git a/gcc/testsuite/gfortran.dg/dynamic_dispatch_2.f03 b/gcc/testsuite/gfortran.dg/dynamic_dispatch_2.f03 index 989a2e0d3f0..95ce8372325 100644 --- a/gcc/testsuite/gfortran.dg/dynamic_dispatch_2.f03 +++ b/gcc/testsuite/gfortran.dg/dynamic_dispatch_2.f03 @@ -12,16 +12,14 @@ module m procedure, pass :: make_integer procedure, pass :: prod => i_m_j generic, public :: extract => real, make_integer - generic, public :: base_extract => real, make_integer end type t1 type, extends(t1) :: t2 integer :: j = 99 contains procedure, pass :: real => make_real2 - procedure, pass :: make_integer_2 + procedure, pass :: make_integer => make_integer_2 procedure, pass :: prod => i_m_j_2 - generic, public :: extract => real, make_integer_2 end type t2 contains subroutine make_real (arg, arg2) @@ -79,8 +77,6 @@ end module m if (i .ne. 42) call abort call a%extract (2, i) if (i .ne. 84) call abort - call a%base_extract (2, i) - if (i .ne. 84) call abort a => c ! extension in module call a%real(r) @@ -89,8 +85,6 @@ end module m if (i .ne. 99) call abort call a%extract (3, i) if (i .ne. 297) call abort - call a%base_extract (3, i) - if (i .ne. 126) call abort a => d ! extension in main call a%real(r) @@ -99,7 +93,5 @@ end module m if (i .ne. 42) call abort call a%extract (4, i) if (i .ne. 168) call abort - call a%extract (4, i) - if (i .ne. 168) call abort end ! { dg-final { cleanup-modules "m" } } diff --git a/gcc/testsuite/gfortran.dg/dynamic_dispatch_3.f03 b/gcc/testsuite/gfortran.dg/dynamic_dispatch_3.f03 index aa8713ef4d4..884d3426039 100644 --- a/gcc/testsuite/gfortran.dg/dynamic_dispatch_3.f03 +++ b/gcc/testsuite/gfortran.dg/dynamic_dispatch_3.f03 @@ -15,7 +15,6 @@ module m1 procedure, pass :: make_integer procedure, pass :: prod => i_m_j generic, public :: extract => real, make_integer - generic, public :: base_extract => real, make_integer end type t1 contains real function make_real (arg) @@ -41,9 +40,8 @@ module m2 integer :: j = 99 contains procedure, pass :: real => make_real2 - procedure, pass :: make_integer_2 + procedure, pass :: make_integer => make_integer_2 procedure, pass :: prod => i_m_j_2 - generic, public :: extract => real, make_integer_2 end type t2 contains real function make_real2 (arg) @@ -76,16 +74,13 @@ end module m2 if (a%real() .ne. real (42)) call abort if (a%prod() .ne. 42) call abort if (a%extract (2) .ne. 84) call abort - if (a%base_extract (2) .ne. 84) call abort a => c ! extension in module m2 if (a%real() .ne. real (99)) call abort if (a%prod() .ne. 99) call abort if (a%extract (3) .ne. 297) call abort - if (a%base_extract (3) .ne. 126) call abort a => d ! extension in main if (a%real() .ne. real (42)) call abort if (a%prod() .ne. 42) call abort if (a%extract (4) .ne. 168) call abort - if (a%base_extract (4) .ne. 168) call abort end ! { dg-final { cleanup-modules "m1, m2" } } diff --git a/gcc/testsuite/gfortran.dg/endfile_2.f90 b/gcc/testsuite/gfortran.dg/endfile_2.f90 index ee911e89e9e..e91e80eb2aa 100644 --- a/gcc/testsuite/gfortran.dg/endfile_2.f90 +++ b/gcc/testsuite/gfortran.dg/endfile_2.f90 @@ -5,7 +5,7 @@ integer i endfile(8) rewind(8) - read(8,*,end=0023)i + read(8,end=0023)i call abort ! should never get here stop 0023 continue diff --git a/gcc/testsuite/gfortran.dg/exit_1.f08 b/gcc/testsuite/gfortran.dg/exit_1.f08 new file mode 100644 index 00000000000..9ebc2eccb50 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/exit_1.f08 @@ -0,0 +1,50 @@ +! { dg-do run } +! { dg-options "-std=f2008 -fall-intrinsics" } + +! PR fortran/44709 +! Check that exit and cycle from within a BLOCK works for loops as expected. + +! Contributed by Daniel Kraft, d@domob.eu. + +PROGRAM main + IMPLICIT NONE + INTEGER :: i + + ! Simple exit without loop name. + DO + BLOCK + EXIT + END BLOCK + CALL abort () + END DO + + ! Cycle without loop name. + DO i = 1, 1 + BLOCK + CYCLE + END BLOCK + CALL abort () + END DO + + ! Exit loop by name from within a BLOCK. + loop1: DO + DO + BLOCK + EXIT loop1 + END BLOCK + CALL abort () + END DO + CALL abort () + END DO loop1 + + ! Cycle loop by name from within a BLOCK. + loop2: DO i = 1, 1 + loop3: DO + BLOCK + CYCLE loop2 + END BLOCK + CALL abort () + END DO loop3 + CALL abort () + END DO loop2 +END PROGRAM main diff --git a/gcc/testsuite/gfortran.dg/exit_2.f08 b/gcc/testsuite/gfortran.dg/exit_2.f08 new file mode 100644 index 00000000000..23e7009cbf8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/exit_2.f08 @@ -0,0 +1,31 @@ +! { dg-do compile } +! { dg-options "-std=f2008" } + +! PR fortran/44709 +! Check that the resolving of loop names in parent namespaces introduced to +! handle intermediate BLOCK's does not go too far and other sanity checks. + +! Contributed by Daniel Kraft, d@domob.eu. + +PROGRAM main + IMPLICIT NONE + + EXIT ! { dg-error "is not within a loop" } + EXIT foobar ! { dg-error "is unknown" } + EXIT main ! { dg-error "is not a loop name" } + + mainLoop: DO + CALL test () + END DO mainLoop + + otherLoop: DO + EXIT mainLoop ! { dg-error "is not within loop 'mainloop'" } + END DO otherLoop + +CONTAINS + + SUBROUTINE test () + EXIT mainLoop ! { dg-error "is unknown" } + END SUBROUTINE test + +END PROGRAM main diff --git a/gcc/testsuite/gfortran.dg/ftell_3.f90 b/gcc/testsuite/gfortran.dg/ftell_3.f90 index c16afe8ed16..16875d812a8 100644 --- a/gcc/testsuite/gfortran.dg/ftell_3.f90 +++ b/gcc/testsuite/gfortran.dg/ftell_3.f90 @@ -3,9 +3,10 @@ ! Contributed by Janne Blomqvist, Manfred Schwarb ! and Dominique d'Humieres. program ftell_3 - integer :: i + integer :: i, j + character(1) :: ch character(len=99) :: buffer - open(10, form='formatted', status='scratch', position='rewind') + open(10, form='formatted', position='rewind') write(10, '(a)') '123456' write(10, '(a)') '789' write(10, '(a)') 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC' @@ -13,16 +14,29 @@ program ftell_3 rewind(10) read(10, '(a)') buffer call ftell(10, i) - if(i /= 7) then - call abort() +! Expected: On '\n' systems: 7, on \r\n systems: 8 + if(i /= 7 .and. i /= 8) then + call abort end if read(10,'(a)') buffer if (trim(buffer) /= "789") then call abort() end if - call ftell(10,i) - if (i /= 11) then - call abort() - end if + call ftell(10,j) close(10) + open(10, access="stream") +! Expected: On '\n' systems: 11, on \r\n systems: 13 + if (i == 7) then + read(10, pos=7) ch + if (ch /= char(10)) call abort + if (j /= 11) call abort + end if + if (i == 8) then + read(10, pos=7) ch + if (ch /= char(13)) call abort + read(10) ch + if (ch /= char(10)) call abort + if (j /= 13) call abort + end if + close(10, status="delete") end program ftell_3 diff --git a/gcc/testsuite/gfortran.dg/gomp/pr44847.f90 b/gcc/testsuite/gfortran.dg/gomp/pr44847.f90 new file mode 100644 index 00000000000..3da4311499e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/pr44847.f90 @@ -0,0 +1,86 @@ +! PR fortran/44847 +! { dg-do compile } +! { dg-options "-fopenmp" } + +subroutine pr44847_1 + integer :: i, j +!$omp parallel do collapse(2) +l:do i = 1, 2 + do j = 1, 2 + cycle l ! { dg-error "CYCLE statement" } + end do + end do l +end subroutine +subroutine pr44847_2 + integer :: i, j, k +!$omp parallel do collapse(3) + do i = 1, 2 + l:do j = 1, 2 + do k = 1, 2 + cycle l ! { dg-error "CYCLE statement" } + end do + end do l + end do +end subroutine +subroutine pr44847_3 + integer :: i, j +!$omp parallel do +l:do i = 1, 2 + do j = 1, 2 + cycle l + end do + end do l +end subroutine +subroutine pr44847_4 + integer :: i, j, k +!$omp parallel do collapse(2) + do i = 1, 2 + l:do j = 1, 2 + do k = 1, 2 + cycle l + end do + end do l + end do +end subroutine +subroutine pr44847_5 + integer :: i, j +!$omp parallel do collapse(2) +l:do i = 1, 2 + do j = 1, 2 + exit l ! { dg-error "EXIT statement" } + end do + end do l +end subroutine +subroutine pr44847_6 + integer :: i, j, k +!$omp parallel do collapse(3) + do i = 1, 2 + l:do j = 1, 2 + do k = 1, 2 + exit l ! { dg-error "EXIT statement" } + end do + end do l + end do +end subroutine +subroutine pr44847_7 + integer :: i, j, k +!$omp parallel do collapse(2) + do i = 1, 2 + l:do j = 1, 2 + do k = 1, 2 + exit l ! { dg-error "EXIT statement" } + end do + end do l + end do +end subroutine +subroutine pr44847_8 + integer :: i, j, k +!$omp parallel do + do i = 1, 2 + l:do j = 1, 2 + do k = 1, 2 + exit l + end do + end do l + end do +end subroutine diff --git a/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 b/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 index d0e1b017879..6fa6e303677 100644 --- a/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 +++ b/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 @@ -1,4 +1,4 @@ -! { dg-compile } +! { dg-do compile } ! { dg-options "-fgraphite -O -ffast-math" } MODULE powell diff --git a/gcc/testsuite/gfortran.dg/initialization_20.f90 b/gcc/testsuite/gfortran.dg/initialization_20.f90 index 47d552834ae..6af1a00a45d 100644 --- a/gcc/testsuite/gfortran.dg/initialization_20.f90 +++ b/gcc/testsuite/gfortran.dg/initialization_20.f90 @@ -6,5 +6,5 @@ program pr19925 integer j integer, parameter :: n = 100000 integer, parameter :: i(n)=(/(j,j=1,n)/) ! { dg-error "number of elements" } - print *, i(5) + print *, i(5) ! { dg-error "has no IMPLICIT type" } end program pr19925 diff --git a/gcc/testsuite/gfortran.dg/initialization_24.f90 b/gcc/testsuite/gfortran.dg/initialization_24.f90 index 4c203312be4..0ab8dc624e4 100644 --- a/gcc/testsuite/gfortran.dg/initialization_24.f90 +++ b/gcc/testsuite/gfortran.dg/initialization_24.f90 @@ -3,7 +3,7 @@ ! Test case by Dominique d'Humieres INTEGER, PARAMETER ::N=65536 INTEGER, PARAMETER ::I(N)=(/(MOD(K,2),K=1,N)/)!{ dg-error "number of elements" } -INTEGER, PARAMETER ::M(N)=I(N:1:-1) +INTEGER, PARAMETER ::M(N)=I(N:1:-1) ! { dg-error "Syntax error in argument" } print *, I(1), M(1), I(N), M(N) END diff --git a/gcc/testsuite/gfortran.dg/intent_out_5.f90 b/gcc/testsuite/gfortran.dg/intent_out_5.f90 index acd2b606525..6a9c6f4bd39 100644 --- a/gcc/testsuite/gfortran.dg/intent_out_5.f90 +++ b/gcc/testsuite/gfortran.dg/intent_out_5.f90 @@ -1,4 +1,4 @@ -! { dg-do run} +! { dg-do run } ! ! PR fortran/41479 ! diff --git a/gcc/testsuite/gfortran.dg/ltrans-7.f90 b/gcc/testsuite/gfortran.dg/ltrans-7.f90 index 9c9bcf939eb..583edf216ba 100644 --- a/gcc/testsuite/gfortran.dg/ltrans-7.f90 +++ b/gcc/testsuite/gfortran.dg/ltrans-7.f90 @@ -27,5 +27,5 @@ Program FOO end Program FOO ! Please do not XFAIL. -! { dg-final { scan-tree-dump-times "transformed loop" 1 "ltrans"} } +! { dg-final { scan-tree-dump-times "transformed loop" 1 "ltrans" } } ! { dg-final { cleanup-tree-dump "ltrans" } } diff --git a/gcc/testsuite/gfortran.dg/minmaxloc_4.f90 b/gcc/testsuite/gfortran.dg/minmaxloc_4.f90 index 2ea2e7b86ab..673739518dc 100644 --- a/gcc/testsuite/gfortran.dg/minmaxloc_4.f90 +++ b/gcc/testsuite/gfortran.dg/minmaxloc_4.f90 @@ -3,7 +3,6 @@ PROGRAM TST IMPLICIT NONE REAL :: A(1,3) - REAL :: B(3,1) A(:,1) = 10 A(:,2) = 20 A(:,3) = 30 @@ -13,9 +12,4 @@ PROGRAM TST if (minloc(sum(a(:,1:3),1),1) .ne. 1) call abort() if (maxloc(sum(a(:,1:3),1),1) .ne. 3) call abort() - B(1,:) = 10 - B(2,:) = 20 - B(3,:) = 30 - if (minloc(sum(b(1:3,:),2),2) .ne. 1) call abort() - if (maxloc(sum(b(1:3,:),2),2) .ne. 3) call abort() END PROGRAM TST diff --git a/gcc/testsuite/gfortran.dg/namelist_36.f90 b/gcc/testsuite/gfortran.dg/namelist_36.f90 index 61e88b6b3e9..b6a14e36bc3 100644 --- a/gcc/testsuite/gfortran.dg/namelist_36.f90 +++ b/gcc/testsuite/gfortran.dg/namelist_36.f90 @@ -1,4 +1,4 @@ -! { dg-compile } +! { dg-do compile } ! ! Private types and types with private components ! are acceptable in local namelists. diff --git a/gcc/testsuite/gfortran.dg/parameter_array_init_6.f90 b/gcc/testsuite/gfortran.dg/parameter_array_init_6.f90 new file mode 100644 index 00000000000..9a654db3f00 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/parameter_array_init_6.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } +! +! PR fortran/44742 +! +! Test case based on Juergen Reuter's and reduced by +! Janus Weil. +! +! The program creates a large array constructor, which +! exceeds -fmax-array-constructor - and caused an ICE. +! + +module proc8 + implicit none + integer, parameter :: N = 256 + logical, dimension(N**2), parameter :: A = .false. + logical, dimension(N,N), parameter :: B & + = reshape ( (/ A /), (/ N, N /) ) ! { dg-error "array constructor at .1. requires an increase" } +end module diff --git a/gcc/testsuite/gfortran.dg/pr44882.f90 b/gcc/testsuite/gfortran.dg/pr44882.f90 new file mode 100644 index 00000000000..ac22459dc08 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr44882.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! { dg-options "-O3 -ffast-math -funroll-loops -w" } + + SUBROUTINE TRUDGE(KDIR) +! There is a type mismatch here for TRUPAR which caused an ICE + COMMON /TRUPAR/ DR(10),V(10,10) + DO 110 I=1,NDIR + 110 DR(I)=V(I,JDIR) + END + SUBROUTINE TRUSRC(LEAVE) + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + COMMON /TRUPAR/ DX(10),V(10,10) + END + diff --git a/gcc/testsuite/gfortran.dg/runtime_warning_1.f90 b/gcc/testsuite/gfortran.dg/runtime_warning_1.f90 index cff9eae7ae7..2894136a8b5 100644 --- a/gcc/testsuite/gfortran.dg/runtime_warning_1.f90 +++ b/gcc/testsuite/gfortran.dg/runtime_warning_1.f90 @@ -14,4 +14,4 @@ close (42) if (c /= 'abcde') call abort () end -! { dg-warning ".*descriptor" "" 10} + diff --git a/gcc/testsuite/gfortran.dg/select_char_2.f90 b/gcc/testsuite/gfortran.dg/select_char_2.f90 new file mode 100644 index 00000000000..22af1c76dfc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/select_char_2.f90 @@ -0,0 +1,45 @@ +! { dg-do run } +! { dg-options "-O -fdump-tree-original" } + + if (foo ('E') .ne. 1) call abort + if (foo ('e') .ne. 1) call abort + if (foo ('f') .ne. 2) call abort + if (foo ('g') .ne. 2) call abort + if (foo ('h') .ne. 2) call abort + if (foo ('Q') .ne. 3) call abort + if (foo (' ') .ne. 4) call abort + if (bar ('e') .ne. 1) call abort + if (bar ('f') .ne. 3) call abort +contains + function foo (c) + character :: c + integer :: foo + select case (c) + case ('E','e') + foo = 1 + case ('f':'h ') + foo = 2 + case default + foo = 3 + case ('') + foo = 4 + end select + end function + function bar (c) + character :: c + integer :: bar + select case (c) + case ('ea':'ez') + bar = 2 + case ('e') + bar = 1 + case default + bar = 3 + case ('fd') + bar = 4 + end select + end function +end + +! { dg-final { scan-tree-dump-not "_gfortran_select_string" "original" } } +! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/select_char_3.f90 b/gcc/testsuite/gfortran.dg/select_char_3.f90 new file mode 100644 index 00000000000..f0a7c874175 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/select_char_3.f90 @@ -0,0 +1,15 @@ +! PR fortran/40206 +! { dg-do compile } +! { dg-options "-O2 -Wuninitialized" } + +function char2type (char) + character, intent(in) :: char + integer :: char2type + + select case (char) + case ('E','e') + char2type=1 + case default + char2type=-1234 + end select +end function diff --git a/gcc/testsuite/gfortran.dg/storage_size_1.f08 b/gcc/testsuite/gfortran.dg/storage_size_1.f08 new file mode 100644 index 00000000000..ade9dfc30b0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/storage_size_1.f08 @@ -0,0 +1,31 @@ +! { dg-do run } +! +! PR 44649: [OOP] F2008: storage_size intrinsic +! +! Contributed by Janus Weil <janus@gcc.gnu.org> + +type :: t + integer(4) :: i + real(4) :: r +end type + +type,extends(t) :: t2 + integer(4) :: j +end type + +type(t) :: a +type(t), dimension(1:3) :: b +class(t), allocatable :: cp + +allocate(t2::cp) + +if (sizeof(a) /= 8) call abort() +if (storage_size(a) /= 64) call abort() + +if (sizeof(b) /= 24) call abort() +if (storage_size(b) /= 64) call abort() + +if (sizeof(cp) /= 8) call abort() +if (storage_size(cp) /= 96) call abort() + +end diff --git a/gcc/testsuite/gfortran.dg/storage_size_2.f08 b/gcc/testsuite/gfortran.dg/storage_size_2.f08 new file mode 100644 index 00000000000..50de9575e74 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/storage_size_2.f08 @@ -0,0 +1,27 @@ +! { dg-do compile } +! +! PR 44649: [OOP] F2008: storage_size intrinsic +! +! Contributed by Janus Weil <janus@gcc.gnu.org> + +use iso_c_binding, only: c_int + +type, bind(c) :: t + integer(c_int) :: j +end type + +integer(4) :: i1 +integer(c_int) :: i2 +type(t) :: x + +print *,c_sizeof(i1) ! { dg-error "must be be an interoperable data entity" } +print *,c_sizeof(i2) +print *,c_sizeof(x) +print *, c_sizeof(ran()) ! { dg-error "must be be an interoperable data entity" } + +print *,storage_size(1.0,4) +print *,storage_size(1.0,3.2) ! { dg-error "must be INTEGER" } +print *,storage_size(1.0,(/1,2/)) ! { dg-error "must be a scalar" } +print *,storage_size(1.0,irand()) ! { dg-error "must be a constant" } + +end diff --git a/gcc/testsuite/gfortran.dg/typebound_call_16.f03 b/gcc/testsuite/gfortran.dg/typebound_call_16.f03 new file mode 100644 index 00000000000..fdd60c603cc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_call_16.f03 @@ -0,0 +1,35 @@ +! { dg-do compile } +! +! PR 41685: [OOP] internal compiler error: verify_flow_info failed +! +! Contributed by Salvatore Filippone <sfilippone@uniroma2.it> + +module base_mat_mod + + type :: base_sparse_mat + contains + procedure, pass(a) :: get_nrows + end type base_sparse_mat + +contains + + integer function get_nrows(a) + implicit none + class(base_sparse_mat), intent(in) :: a + end function get_nrows + +end module base_mat_mod + + + use base_mat_mod + + type, extends(base_sparse_mat) :: s_coo_sparse_mat + end type s_coo_sparse_mat + + class(s_coo_sparse_mat), pointer :: a + Integer :: m + m = a%get_nrows() + +end + +! { dg-final { cleanup-modules "base_mat_mod" } } diff --git a/gcc/testsuite/gfortran.dg/typebound_generic_6.f03 b/gcc/testsuite/gfortran.dg/typebound_generic_6.f03 new file mode 100644 index 00000000000..973e10a35e3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_generic_6.f03 @@ -0,0 +1,69 @@ +! { dg-do run } +! +! PR 43945: [OOP] Derived type with GENERIC: resolved to the wrong specific TBP +! +! Contributed by by Salvatore Filippone <sfilippone@uniroma2.it> + +module foo_mod + type foo + integer :: i + contains + procedure, pass(a) :: doit + procedure, pass(a) :: getit + generic, public :: do => doit + generic, public :: get => getit + end type foo + private doit,getit +contains + subroutine doit(a) + class(foo) :: a + a%i = 1 + write(*,*) 'FOO%DOIT base version' + end subroutine doit + function getit(a) result(res) + class(foo) :: a + integer :: res + res = a%i + end function getit +end module foo_mod + +module foo2_mod + use foo_mod + type, extends(foo) :: foo2 + integer :: j + contains + procedure, pass(a) :: doit => doit2 + procedure, pass(a) :: getit => getit2 + end type foo2 + private doit2, getit2 + +contains + + subroutine doit2(a) + class(foo2) :: a + a%i = 2 + a%j = 3 + end subroutine doit2 + function getit2(a) result(res) + class(foo2) :: a + integer :: res + res = a%j + end function getit2 +end module foo2_mod + +program testd15 + use foo2_mod + type(foo2) :: af2 + class(foo), allocatable :: afab + + allocate(foo2 :: afab) + call af2%do() + if (af2%i .ne. 2) call abort + if (af2%get() .ne. 3) call abort + call afab%do() + if (afab%i .ne. 2) call abort + if (afab%get() .ne. 3) call abort + +end program testd15 + +! { dg-final { cleanup-modules "foo_mod foo2_mod" } } diff --git a/gcc/testsuite/gfortran.dg/typebound_generic_7.f03 b/gcc/testsuite/gfortran.dg/typebound_generic_7.f03 new file mode 100644 index 00000000000..2519ab09416 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_generic_7.f03 @@ -0,0 +1,28 @@ +! { dg-do compile } +! +! PR 44434: [OOP] ICE in in gfc_add_component_ref +! +! Contributed by Salvatore Filippone <sfilippone@uniroma2.it> + +module foo_mod + type foo + contains + procedure :: doit + generic :: do => doit + end type +contains + subroutine doit(a) + class(foo) :: a + end subroutine +end module + +program testd15 +contains + subroutine dodo(x) + use foo_mod + class(foo) :: x + call x%do() + end subroutine +end + +! { dg-final { cleanup-modules "foo_mod" } } diff --git a/gcc/testsuite/gfortran.dg/typebound_generic_8.f03 b/gcc/testsuite/gfortran.dg/typebound_generic_8.f03 new file mode 100644 index 00000000000..0ee6610e173 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_generic_8.f03 @@ -0,0 +1,29 @@ +! { dg-do compile } +! +! PR 44565: [4.6 Regression] [OOP] ICE in gimplify_expr with array-valued generic TBP +! +! Contributed by Hans-Werner Boschmann <boschmann@tp1.physik.uni-siegen.de> + +module ice6 + + type :: t + contains + procedure :: get_array + generic :: get_something => get_array + end type + +contains + + function get_array(this) + class(t) :: this + real,dimension(2) :: get_array + end function get_array + + subroutine do_something(this) + class(t) :: this + print *,this%get_something() + end subroutine do_something + +end module ice6 + +! { dg-final { cleanup-modules "ice6" } } diff --git a/gcc/testsuite/gfortran.dg/typebound_generic_9.f03 b/gcc/testsuite/gfortran.dg/typebound_generic_9.f03 new file mode 100644 index 00000000000..f85bb385706 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_generic_9.f03 @@ -0,0 +1,63 @@ +! { dg-do run } +! +! PR 44936: [OOP] Generic TBP not resolved correctly at compile time +! +! Contributed by Salvatore Filippone <sfilippone@uniroma2.it> + +module foo_mod + type foo + integer :: i + contains + procedure, pass(a) :: doit => doit1 + procedure, pass(a) :: getit=> getit1 + generic, public :: do => doit + generic, public :: get => getit + end type foo + private doit1,getit1 +contains + subroutine doit1(a) + class(foo) :: a + a%i = 1 + write(*,*) 'FOO%DOIT base version' + end subroutine doit1 + function getit1(a) result(res) + class(foo) :: a + integer :: res + res = a%i + end function getit1 +end module foo_mod + +module foo2_mod + use foo_mod + type, extends(foo) :: foo2 + integer :: j + contains + procedure, pass(a) :: doit => doit2 + procedure, pass(a) :: getit => getit2 + end type foo2 + private doit2, getit2 +contains + subroutine doit2(a) + class(foo2) :: a + a%i = 2 + a%j = 3 + end subroutine doit2 + function getit2(a) result(res) + class(foo2) :: a + integer :: res + res = a%j + end function getit2 +end module foo2_mod + +program testd15 + use foo2_mod + type(foo2) :: af2 + + call af2%do() + if (af2%i .ne. 2) call abort + if (af2%get() .ne. 3) call abort + +end program testd15 + +! { dg-final { cleanup-modules "foo_mod foo2_mod" } } + diff --git a/gcc/testsuite/gfortran.dg/use_iso_c_binding.f90 b/gcc/testsuite/gfortran.dg/use_iso_c_binding.f90 index b35c024c08c..8a28490f7b2 100644 --- a/gcc/testsuite/gfortran.dg/use_iso_c_binding.f90 +++ b/gcc/testsuite/gfortran.dg/use_iso_c_binding.f90 @@ -7,12 +7,12 @@ ! intrinsic one. --Rickett, 09.26.06 module use_stmt_0 ! this is an error because c_ptr_2 does not exist - use, intrinsic :: iso_c_binding, only: c_ptr_2 ! { dg-error "Symbol 'c_ptr_2' referenced at \\(1\\) does not exist" } + use, intrinsic :: iso_c_binding, only: c_ptr_2 ! { dg-error "Symbol 'c_ptr_2' referenced at \\(1\\) not found" } end module use_stmt_0 module use_stmt_1 ! this is an error because c_ptr_2 does not exist - use iso_c_binding, only: c_ptr_2 ! { dg-error "Symbol 'c_ptr_2' referenced at \\(1\\) does not exist" } + use iso_c_binding, only: c_ptr_2 ! { dg-error "Symbol 'c_ptr_2' referenced at \\(1\\) not found" } end module use_stmt_1 module use_stmt_2 diff --git a/gcc/testsuite/gfortran.dg/use_rename_6.f90 b/gcc/testsuite/gfortran.dg/use_rename_6.f90 new file mode 100644 index 00000000000..02f25c36e97 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/use_rename_6.f90 @@ -0,0 +1,40 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! +! PR fortran/44702 +! +! Based on a test case by Joe Krahn. +! +! Multiple import of the same symbol was failing for +! intrinsic modules. +! +subroutine one() + use iso_c_binding, only: a => c_ptr, b => c_ptr, c_ptr + implicit none + type(a) :: x + type(b) :: y + type(c_ptr) :: z +end subroutine one + +subroutine two() + use iso_c_binding, a => c_ptr, b => c_ptr + implicit none + type(a) :: x + type(b) :: y +end subroutine two + +subroutine three() + use iso_fortran_env, only: a => error_unit, b => error_unit, error_unit + implicit none + if(a /= b) call shall_not_be_there() + if(a /= error_unit) call shall_not_be_there() +end subroutine three + +subroutine four() + use iso_fortran_env, a => error_unit, b => error_unit + implicit none + if(a /= b) call shall_not_be_there() +end subroutine four + +! { dg-final { scan-tree-dump-times "shall_not_be_there" 0 "original" } } +! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/vect/vect.exp b/gcc/testsuite/gfortran.dg/vect/vect.exp index 39a1f9d811a..5783e929496 100644 --- a/gcc/testsuite/gfortran.dg/vect/vect.exp +++ b/gcc/testsuite/gfortran.dg/vect/vect.exp @@ -68,11 +68,8 @@ if [istarget "powerpc-*paired*"] { } elseif { [istarget "spu-*-*"] } { set dg-do-what-default run } elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { - if { ![check_effective_target_sse2] } then { - return - } lappend DEFAULT_VECTCFLAGS "-msse2" - if [check_sse2_hw_available] { + if { [check_effective_target_sse2_runtime] } { set dg-do-what-default run } else { set dg-do-what-default compile diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr40421.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr40421.f90 new file mode 100644 index 00000000000..64b129efc3c --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr40421.f90 @@ -0,0 +1,15 @@ +subroutine pr40421 (j, q, r) + double precision :: q(1,1), r(1,1,3) + save + integer :: i, j, m, n + double precision :: s, t, u + do i=1,2 + do m=1,j + do n=1,1 + s=q(n,m)*r(n,m,1) + t=q(n,m)*r(n,m,2) + u=q(n,m)*r(n,m,3) + end do + end do + end do +end diff --git a/gcc/testsuite/gnat.dg/aggr15.adb b/gcc/testsuite/gnat.dg/aggr15.adb new file mode 100644 index 00000000000..e69e9d346e1 --- /dev/null +++ b/gcc/testsuite/gnat.dg/aggr15.adb @@ -0,0 +1,18 @@ +-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+package body Aggr15 is
+
+ function CREATE return DATA_T is
+ D : DATA_T;
+ begin
+ return D;
+ end;
+
+ function ALL_CREATE return ALL_DATA_T is
+ C : constant ALL_DATA_T := (others => (others => Create));
+ begin
+ return C;
+ end;
+
+end Aggr15;
diff --git a/gcc/testsuite/gnat.dg/aggr15.ads b/gcc/testsuite/gnat.dg/aggr15.ads new file mode 100644 index 00000000000..23f26a8df7d --- /dev/null +++ b/gcc/testsuite/gnat.dg/aggr15.ads @@ -0,0 +1,15 @@ +package Aggr15 is
+
+ type T is tagged record
+ I : Integer;
+ end record;
+
+ type DATA_T is record
+ D : T;
+ end record;
+
+ type ALL_DATA_T is array (1..2, 1..2) of DATA_T;
+
+ function ALL_CREATE return ALL_DATA_T;
+
+end Aggr15;
diff --git a/gcc/testsuite/gnat.dg/atomic3.adb b/gcc/testsuite/gnat.dg/atomic3.adb new file mode 100644 index 00000000000..592a856caef --- /dev/null +++ b/gcc/testsuite/gnat.dg/atomic3.adb @@ -0,0 +1,24 @@ +-- { dg-do compile } + +procedure Atomic3 is + + type Unsigned_32_T is mod 2 ** 32; + for Unsigned_32_T'Size use 32; + + type Id_T is (One, Two, Three); + + type Array_T is array (Id_T) of Unsigned_32_T; + pragma Atomic_Components (Array_T); + + A : Array_T := (others => 0); + + function Get_Array return Array_T is + begin + return A; + end; + + X : Array_T; + +begin + X := Get_Array; +end; diff --git a/gcc/testsuite/gnat.dg/cond_expr1.adb b/gcc/testsuite/gnat.dg/cond_expr1.adb new file mode 100644 index 00000000000..e1a87a36ab5 --- /dev/null +++ b/gcc/testsuite/gnat.dg/cond_expr1.adb @@ -0,0 +1,7 @@ +-- { dg-do compile } +-- { dg-options "-gnat12" } + +function Cond_Expr1 (Dir : in String) return String is +begin + return (if Dir (Dir'Last) = '\' then Dir else Dir & '\'); +end; diff --git a/gcc/testsuite/gnat.dg/loop_optimization7.adb b/gcc/testsuite/gnat.dg/loop_optimization7.adb index 16683949465..c6a5dc98900 100644 --- a/gcc/testsuite/gnat.dg/loop_optimization7.adb +++ b/gcc/testsuite/gnat.dg/loop_optimization7.adb @@ -1,6 +1,7 @@ -- { dg-do compile } -- { dg-options "-O3" } -- { dg-options "-O3 -msse" { target i?86-*-* x86_64-*-* } } +-- { dg-require-effective-target sse } package body Loop_Optimization7 is diff --git a/gcc/testsuite/gnat.dg/modular3.adb b/gcc/testsuite/gnat.dg/modular3.adb new file mode 100644 index 00000000000..539edcaf4d4 --- /dev/null +++ b/gcc/testsuite/gnat.dg/modular3.adb @@ -0,0 +1,32 @@ +-- { dg-do run } + +with Modular3_Pkg; use Modular3_Pkg; + +procedure Modular3 is + + function F1 (A : Int16_T) return Int16_T is + begin + return A + 128; + end; + + function F2 (B : Mod16_T) return Mod16_T is + begin + return B + 128; + end; + + A : Int16_T := 16384; + B : Mod16_T := 65504; + +begin + + A := F1 (A); + if A /= 16512 then + raise Program_Error; + end if; + + B := F2 (B); + if B /= 96 then + raise Program_Error; + end if; + +end Modular3; diff --git a/gcc/testsuite/gnat.dg/modular3_pkg.ads b/gcc/testsuite/gnat.dg/modular3_pkg.ads new file mode 100644 index 00000000000..85cf6a8bfaa --- /dev/null +++ b/gcc/testsuite/gnat.dg/modular3_pkg.ads @@ -0,0 +1,11 @@ +package Modular3_Pkg is + + type Int16_T is range -32768 .. 32767; + for Int16_T'Size use 16; + for Int16_T'Alignment use 1; + + type Mod16_T is mod 2 ** 16; + for Mod16_T'Size use 16; + for Mod16_T'Alignment use 1; + +end Modular3_Pkg; diff --git a/gcc/testsuite/gnat.dg/noreturn1.adb b/gcc/testsuite/gnat.dg/noreturn1.adb index 83eafe7f364..f854e662be3 100644 --- a/gcc/testsuite/gnat.dg/noreturn1.adb +++ b/gcc/testsuite/gnat.dg/noreturn1.adb @@ -1,4 +1,4 @@ --- { dg-compile } +-- { dg-do compile } package body Noreturn1 is diff --git a/gcc/testsuite/gnat.dg/specs/small_alignment.ads b/gcc/testsuite/gnat.dg/specs/small_alignment.ads index 318148d1a68..fbedf47d131 100644 --- a/gcc/testsuite/gnat.dg/specs/small_alignment.ads +++ b/gcc/testsuite/gnat.dg/specs/small_alignment.ads @@ -1,4 +1,4 @@ --- { dg-compile } +-- { dg-do compile } package Small_Alignment is diff --git a/gcc/testsuite/gnat.dg/sse_nolib.adb b/gcc/testsuite/gnat.dg/sse_nolib.adb index b024a216e94..d678b9a868b 100644 --- a/gcc/testsuite/gnat.dg/sse_nolib.adb +++ b/gcc/testsuite/gnat.dg/sse_nolib.adb @@ -1,5 +1,6 @@ -- { dg-do run { target i?86-*-* x86_64-*-* } } -- { dg-options "-O1 -msse" } +-- { dg-require-effective-target sse } with Ada.Unchecked_Conversion; diff --git a/gcc/testsuite/gnat.dg/unchecked_convert5b.adb b/gcc/testsuite/gnat.dg/unchecked_convert5b.adb new file mode 100644 index 00000000000..5232041c0d8 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert5b.adb @@ -0,0 +1,22 @@ +-- { dg-do run { target i?86-*-* x86_64-*-* alpha*-*-* ia64-*-* } } + +with Unchecked_Conversion; + +procedure Unchecked_Convert5b is + + subtype c_1 is string(1..1); + + function int2c1 is -- { dg-warning "different sizes" } + new unchecked_conversion (source => integer, target => c_1); + + c1 : c_1; + +begin + + c1 := int2c1(16#12#); + + if c1 (1) /= ASCII.DC2 then + raise Program_Error; + end if; + +end; diff --git a/gcc/testsuite/gnat.dg/unchecked_convert6.adb b/gcc/testsuite/gnat.dg/unchecked_convert6.adb new file mode 100644 index 00000000000..a26a6a9b762 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert6.adb @@ -0,0 +1,22 @@ +-- { dg-do run { target hppa*-*-* sparc*-*-* powerpc*-*-* } } + +with Unchecked_Conversion; + +procedure Unchecked_Convert6 is + + subtype c_5 is string(1..5); + + function int2c5 is -- { dg-warning "different sizes" } + new unchecked_conversion (source => integer, target => c_5); + + c5 : c_5; + +begin + + c5 := int2c5(16#12#); + + if c5 (4) /= ASCII.DC2 then + raise Program_Error; + end if; + +end; diff --git a/gcc/testsuite/gnat.dg/unchecked_convert6b.adb b/gcc/testsuite/gnat.dg/unchecked_convert6b.adb new file mode 100644 index 00000000000..d696f7d5f09 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert6b.adb @@ -0,0 +1,22 @@ +-- { dg-do run { target i?86-*-* x86_64-*-* alpha*-*-* ia64-*-* } } + +with Unchecked_Conversion; + +procedure Unchecked_Convert6b is + + subtype c_5 is string(1..5); + + function int2c5 is -- { dg-warning "different sizes" } + new unchecked_conversion (source => integer, target => c_5); + + c5 : c_5; + +begin + + c5 := int2c5(16#12#); + + if c5 (1) /= ASCII.DC2 then + raise Program_Error; + end if; + +end; diff --git a/gcc/testsuite/lib/fortran-torture.exp b/gcc/testsuite/lib/fortran-torture.exp index 72ce9d682cd..cd24ace426f 100644 --- a/gcc/testsuite/lib/fortran-torture.exp +++ b/gcc/testsuite/lib/fortran-torture.exp @@ -46,7 +46,8 @@ proc get-fortran-torture-options { } { set test_tree_vectorize 1 } elseif { ( [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] ) && [check_effective_target_sse2] - && [check_sse2_hw_available] } { + && [check_sse2_hw_available] + && [check_sse_os_support_available] } { lappend vectorizer_options "-msse2" set test_tree_vectorize 1 } elseif { [istarget "mips*-*-*"] diff --git a/gcc/testsuite/lib/objc-torture.exp b/gcc/testsuite/lib/objc-torture.exp index a3d1ef2446e..d3207a466ac 100644 --- a/gcc/testsuite/lib/objc-torture.exp +++ b/gcc/testsuite/lib/objc-torture.exp @@ -23,17 +23,24 @@ load_lib target-supports.exp # Make sure that the runtime list is re-evaluated for each multilib. proc objc-set-runtime-options { dowhat args } { global OBJC_RUNTIME_OPTIONS - if ![info exists OBJC_RUNTIME_OPTIONS] { - set rtlist [list "-fgnu-runtime" "-fnext-runtime" ] - } else { - set rtlist [list "-fgnu-runtime" "-fnext-runtime" ] - foreach other $OBJC_RUNTIME_OPTIONS { - # Don't do tests twice... - if { ( $other == "-fnext-runtime" || $other == "-fgnu-runtime" ) } { - continue - } - lappend rtlist $other + set rtlist [list "-fgnu-runtime" ] + # At present (4.6), the only NeXT runtime target is Darwin. + # The previously used approach of testing trivial compiles is not reliable + # for determining the absence of the NeXT runtime, since a non-Darwin + # installation can have the objc headers present in the same locations + # that Darwin uses. If NeXT is ported to another target, then it should + # be listed here. + if [istarget "*-*-darwin*" ] { + lappend rtlist "-fnext-runtime" + } + if [info exists OBJC_RUNTIME_OPTIONS] { + foreach other $OBJC_RUNTIME_OPTIONS { + # Don't do tests twice... + if { ( $other == "-fnext-runtime" || $other == "-fgnu-runtime" ) } { + continue } + lappend rtlist $other + } } set OBJC_RUNTIME_OPTIONS "" @@ -49,8 +56,10 @@ proc objc-set-runtime-options { dowhat args } { if [info exists dowhat] { switch $dowhat { "compile" { - set compile_type "assembly" - set output_file "trivial.s" + # We should check that the generated asm is sensible, so do + # the equivalent of -c. + set compile_type "object" + set output_file "trivial.o" set comp_output [objc_target_compile \ "$srcdir/$subdir/trivial.m" "$output_file" "$compile_type" $options] diff --git a/gcc/testsuite/lib/plugin-support.exp b/gcc/testsuite/lib/plugin-support.exp index fe4526549b3..9444f52662b 100644 --- a/gcc/testsuite/lib/plugin-support.exp +++ b/gcc/testsuite/lib/plugin-support.exp @@ -84,7 +84,7 @@ proc plugin-test-execute { plugin_src plugin_tests } { set gcc_objdir "$objdir/../../.." set includes "-I. -I${srcdir} -I${gcc_srcdir}/gcc -I${gcc_objdir}/gcc \ -I${gcc_srcdir}/include -I${gcc_srcdir}/libcpp/include \ - $GMPINC" + $GMPINC -I${gcc_objdir}/intl" set optstr "$includes $extra_flags -DIN_GCC -fPIC -shared" diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp index abc01b7cc55..20aed864ce0 100644 --- a/gcc/testsuite/lib/scanasm.exp +++ b/gcc/testsuite/lib/scanasm.exp @@ -291,3 +291,40 @@ proc scan-assembler-dem-not { args } { fail "$testcase scan-assembler-dem-not $pp_pattern" } } + +# Utility for testing that a function is defined on the current line. +# Call pass if so, otherwise fail. Invoked directly; the file must +# have been compiled with -g -dA. +# +# Argument 0 is the current line, passed implicitly by dejagnu +# Argument 1 is the function to check +# Argument 2 handles expected failures and the like +# Argument 3 is "." to match the current line, or an integer to match +# an explicit line. +proc dg-function-on-line { args } { + # Upvar from dg-final: + upvar dg-final-code final-code + + set line [lindex $args 0] + set symbol [lindex $args 1] + set failures [lindex $args 2] + + if { [llength $args] >= 4 } { + switch [lindex $args 3] { + "." { } + "default" { set line [lindex $args 3] } + } + } + + set pattern [format {%s:[^\t]*(\t.file[^\t]*)?\t[^:]+:%d\n} \ + $symbol $line] + + # The lack of spaces around $pattern is important, since they'd + # become part of the regex scan-assembler tries to match. + set cmd "scan-assembler {$pattern}" + if { [llength $args] >= 3 } { + set cmd "$cmd {$failures}" + } + + append final-code "$cmd\n" +} diff --git a/gcc/testsuite/lib/target-supports-dg.exp b/gcc/testsuite/lib/target-supports-dg.exp index e742d750c76..02f0bc19f57 100644 --- a/gcc/testsuite/lib/target-supports-dg.exp +++ b/gcc/testsuite/lib/target-supports-dg.exp @@ -207,6 +207,14 @@ proc dg-require-host-local { args } { } } +proc dg-require-linker-plugin { args } { + set linker_plugin_available [ check_linker_plugin_available ] + if { $linker_plugin_available == 0 } { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + } +} + # Add any target-specific flags needed for accessing the given list # of features. This must come after all dg-options. diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 1cdc53b4983..b3123442837 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -569,6 +569,24 @@ proc check_effective_target_pcc_bitfield_type_matters { } { }] } +# Add to FLAGS all the target-specific flags needed to use thread-local storage. + +proc add_options_for_tls { flags } { + # On Solaris 8 and 9, __tls_get_addr/___tls_get_addr only lives in + # libthread, so always pass -pthread for native TLS. + # Need to duplicate native TLS check from + # check_effective_target_tls_native to avoid recursion. + if { [istarget *-*-solaris2.\[89\]*] && + [check_no_messages_and_pattern tls_native "!emutls" assembly { + __thread int i; + int f (void) { return i; } + void g (int j) { i = j; } + }] } { + return "$flags -pthread" + } + return $flags +} + # Return 1 if thread local storage (TLS) is supported, 0 otherwise. proc check_effective_target_tls {} { @@ -886,6 +904,12 @@ proc check_effective_target_static_libgfortran { } { } "-static"] } +proc check_linker_plugin_available { } { + return [check_no_compiler_messages_nocache linker_plugin executable { + int main() { return 0; } + } "-flto -fuse-linker-plugin"] +} + # Return 1 if the target supports executing 750CL paired-single instructions, 0 # otherwise. Cache the result. @@ -910,6 +934,53 @@ proc check_750cl_hw_available { } { }] } +# Return 1 if the target OS supports running SSE executables, 0 +# otherwise. Cache the result. + +proc check_sse_os_support_available { } { + return [check_cached_effective_target sse_os_support_available { + # If this is not the right target then we can skip the test. + if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } { + expr 0 + } elseif { [istarget i?86-*-solaris2*] } { + # The Solaris 2 kernel doesn't save and restore SSE registers + # before Solaris 9 4/04. Before that, executables die with SIGILL. + check_runtime_nocache sse_os_support_available { + int main () + { + __asm__ volatile ("movss %xmm2,%xmm1"); + return 0; + } + } "-msse" + } else { + expr 1 + } + }] +} + +# Return 1 if the target supports executing SSE instructions, 0 +# otherwise. Cache the result. + +proc check_sse_hw_available { } { + return [check_cached_effective_target sse_hw_available { + # If this is not the right target then we can skip the test. + if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } { + expr 0 + } else { + check_runtime_nocache sse_hw_available { + #include "cpuid.h" + int main () + { + unsigned int eax, ebx, ecx, edx; + if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)) + return !(edx & bit_SSE); + return 1; + } + } "" + } + }] +} + # Return 1 if the target supports executing SSE2 instructions, 0 # otherwise. Cache the result. @@ -923,7 +994,7 @@ proc check_sse2_hw_available { } { #include "cpuid.h" int main () { - unsigned int eax, ebx, ecx, edx = 0; + unsigned int eax, ebx, ecx, edx; if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)) return !(edx & bit_SSE2); return 1; @@ -933,6 +1004,62 @@ proc check_sse2_hw_available { } { }] } +# Return 1 if the target supports executing AVX instructions, 0 +# otherwise. Cache the result. + +proc check_avx_hw_available { } { + return [check_cached_effective_target avx_hw_available { + # If this is not the right target then we can skip the test. + if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } { + expr 0 + } else { + check_runtime_nocache avx_hw_available { + #include "cpuid.h" + int main () + { + unsigned int eax, ebx, ecx, edx; + if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)) + return ((ecx & (bit_AVX | bit_OSXSAVE)) + != (bit_AVX | bit_OSXSAVE)); + return 1; + } + } "" + } + }] +} + +# Return 1 if the target supports running SSE executables, 0 otherwise. + +proc check_effective_target_sse_runtime { } { + if { [check_effective_target_sse] + && [check_sse_hw_available] + && [check_sse_os_support_available] } { + return 1 + } + return 0 +} + +# Return 1 if the target supports running SSE2 executables, 0 otherwise. + +proc check_effective_target_sse2_runtime { } { + if { [check_effective_target_sse2] + && [check_sse2_hw_available] + && [check_sse_os_support_available] } { + return 1 + } + return 0 +} + +# Return 1 if the target supports running AVX executables, 0 otherwise. + +proc check_effective_target_avx_runtime { } { + if { [check_effective_target_avx] + && [check_avx_hw_available] } { + return 1 + } + return 0 +} + # Return 1 if the target supports executing VSX instructions, 0 # otherwise. Cache the result. @@ -3261,6 +3388,17 @@ proc check_effective_target_avx { } { } "-O2 -mavx" ] } +# Return 1 if sse instructions can be compiled. +proc check_effective_target_sse { } { + return [check_no_compiler_messages sse object { + int main () + { + __builtin_ia32_stmxcsr (); + return 0; + } + } "-O2 -msse" ] +} + # Return 1 if sse2 instructions can be compiled. proc check_effective_target_sse2 { } { return [check_no_compiler_messages sse2 object { @@ -3273,6 +3411,19 @@ proc check_effective_target_sse2 { } { } "-O2 -msse2" ] } +# Return 1 if F16C instructions can be compiled. + +proc check_effective_target_f16c { } { + return [check_no_compiler_messages f16c object { + #include "immintrin.h" + float + foo (unsigned short val) + { + return _cvtsh_ss (val); + } + } "-O2 -mf16c" ] +} + # Return 1 if C wchar_t type is compatible with char16_t. proc check_effective_target_wchar_t_char16_t_compatible { } { diff --git a/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm b/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm index a3c4b0c492a..e94e6ec57a2 100644 --- a/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm +++ b/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm @@ -1,13 +1,12 @@ // Check if ObjC classes with non-POD C++ ivars are specially marked in the metadata. // { dg-do run { target *-*-darwin* } } -// { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } -// { dg-options "-fobjc-call-cxx-cdtors" } -// { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } - -#include "../objc-obj-c++-shared/Object1.h" -#include "../objc-obj-c++-shared/next-mapping.h" +// { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } +// { dg-options "-fobjc-call-cxx-cdtors -mmacosx-version-min=10.4" } +// This test has no equivalent or meaning for m64/ABI V2 +// { dg-xfail-run-if "No Test Avail" { *-*-darwin* && lp64 } { "-fnext-runtime" } { "" } } +#include <objc/objc-runtime.h> #include <stdlib.h> #define CHECK_IF(expr) if(!(expr)) abort() @@ -39,18 +38,17 @@ struct cxx_struct { int main (void) { +#ifndef __LP64__ Class cls; - cls = objc_get_class("Foo"); -#if NEXT_OBJC_USE_NEW_INTERFACE - CHECK_IF(class_isMetaClass(cls) & CLS_HAS_CXX_STRUCTORS); - cls = objc_getClass("Bar"); - CHECK_IF(!(class_isMetaClass(cls) & CLS_HAS_CXX_STRUCTORS)); -#else + cls = objc_getClass("Foo"); CHECK_IF(cls->info & CLS_HAS_CXX_STRUCTORS); cls = objc_getClass("Bar"); CHECK_IF(!(cls->info & CLS_HAS_CXX_STRUCTORS)); + +#else + /* No test needed or available. */ + abort (); #endif return 0; } -#include "../objc-obj-c++-shared/Object1-implementation.h" diff --git a/gcc/testsuite/obj-c++.dg/encode-2.mm b/gcc/testsuite/obj-c++.dg/encode-2.mm index cfa9bc783e3..157bb526700 100644 --- a/gcc/testsuite/obj-c++.dg/encode-2.mm +++ b/gcc/testsuite/obj-c++.dg/encode-2.mm @@ -1,4 +1,5 @@ -/* { dg-do compile } */ +/* { dg-do assemble } */ +/* { dg-options "-save-temps" } */ template <class T> struct Vec { @@ -11,7 +12,7 @@ typedef struct { Vec<float> fvec; float fscalar; double dscalar; - Vec<char> chVec; + Vec<signed char> chVec; int iscalar; } anonymous; @@ -23,4 +24,5 @@ const char *enc3 = @encode(anonymous); /* { dg-final { scan-assembler "{Vec<float>=ffi}" } } */ /* { dg-final { scan-assembler "{Vec<double>=ddi}" } } */ -/* { dg-final { scan-assembler "{?={Vec<double>=ddi}{Vec<float>=ffi}fd{Vec<char>=cci}i}" } } */ +/* { dg-final { scan-file "encode-2.o" "{?={Vec<double>=ddi}{Vec<float>=ffi}fd{Vec<signed char>=cci}i}" } } +/* { dg-final cleanup-saved-temps } */ diff --git a/gcc/testsuite/obj-c++.dg/encode-3.mm b/gcc/testsuite/obj-c++.dg/encode-3.mm index 05193ae2c2f..8627a773e25 100644 --- a/gcc/testsuite/obj-c++.dg/encode-3.mm +++ b/gcc/testsuite/obj-c++.dg/encode-3.mm @@ -18,7 +18,7 @@ typedef struct { int iscalar; long z; long long zz; - Vec<const char> cv; + Vec<const signed char> cv; } anonymous; //Vec<double> dd; @@ -44,7 +44,7 @@ int main(void) { if (strcmp (enc2, "{Vec<double>=dd" L "q}")) _exit(-(__LINE__)); - if (strcmp (enc3, "{?=f[10d]i" L "q{Vec<const char>=rcrc" L "q}}")) + if (strcmp (enc3, "{?=f[10d]i" L "q{Vec<const signed char>=rcrc" L "q}}")) _exit(-(__LINE__)); return 0; diff --git a/gcc/testsuite/obj-c++.dg/lto/lto.exp b/gcc/testsuite/obj-c++.dg/lto/lto.exp new file mode 100644 index 00000000000..291895ffc01 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/lto/lto.exp @@ -0,0 +1,84 @@ +# Copyright (C) 2010 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/>. +# +# Based on gcc/testsuite/gcc.dg/lto/lto.exp. + +# Test link-time optimization across multiple files. +# +# Programs are broken into multiple files. Each one is compiled +# separately with LTO information. The final executable is generated +# by collecting all the generated object files using regular LTO or WHOPR. + +if $tracelevel then { + strace $tracelevel +} + +# Load procedures from common libraries. +load_lib standard.exp +load_lib obj-c++-dg.exp + +# Load the language-independent compabibility support procedures. +load_lib lto.exp + +# If LTO has not been enabled, bail. +if { ![check_effective_target_lto] } { + return +} + +global LTO_OPTIONS + +set LTO_OPTIONS [list \ + {-O0 -fwhopr -fgnu-runtime} \ + {-O2 -fwhopr -fgnu-runtime} \ + {-O0 -flto -fgnu-runtime} \ + {-O2 -flto -fgnu-runtime} \ +] + +obj-c++_init +lto_init no-mathlib + +# Define an identifier for use with this suite to avoid name conflicts +# with other lto tests running at the same time. +set sid "obj_cpp_lto" +set tests [lsort [glob -nocomplain $srcdir/$subdir/*_0.mm]] + +# Main loop. +foreach src $tests { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + lto-execute $src $sid +} + +# darwin targets can also run code with the NeXT runtime. +if [istarget "*-*-darwin*" ] { +set LTO_OPTIONS [list \ + {-O0 -fwhopr -fnext-runtime} \ + {-O2 -fwhopr -fnext-runtime} \ + {-O0 -flto -fnext-runtime} \ + {-O2 -flto -fnext-runtime} \ +] + foreach src $tests { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + lto-execute $src $sid + } +} + +lto_finish diff --git a/gcc/testsuite/obj-c++.dg/lto/trivial-1_0.mm b/gcc/testsuite/obj-c++.dg/lto/trivial-1_0.mm new file mode 100644 index 00000000000..45b6e702481 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/lto/trivial-1_0.mm @@ -0,0 +1,43 @@ +/* { dg-lto-do run } */ +/* { dg-skip-if "Needs OBJC2 ABI" { "*-*-darwin*" && lp64 } { "*" } { "" } } */ +extern "C" { +extern int printf (char *,...) ; +extern void abort (void) ; +} + +typedef struct objc_class *Class; + +struct objc_class { + Class isa; + /* other stuff... */ +} ; + +@interface myRootObject { +@public + Class isa; +} ++initialize; ++(Class)class; + +@end + +@implementation myRootObject ++initialize { + return self; +} + ++(Class)class { + return (Class)self; +} + +@end + +int main(void) +{ + Class cl = [myRootObject class]; + if (cl != (Class)0) { + printf((char *)"trivial OK\n"); + return 0; + } + abort () ; +} diff --git a/gcc/testsuite/obj-c++.dg/tls/static-1.mm b/gcc/testsuite/obj-c++.dg/tls/static-1.mm index 2d20b8881f9..6d58010eb0c 100644 --- a/gcc/testsuite/obj-c++.dg/tls/static-1.mm +++ b/gcc/testsuite/obj-c++.dg/tls/static-1.mm @@ -1,5 +1,6 @@ // { dg-do run } // { dg-require-effective-target tls } +// { dg-add-options tls } // { dg-additional-sources "static-1a.mm" } extern "C" { diff --git a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm index 056073789a5..1ec8623f3ee 100644 --- a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm +++ b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm @@ -1,5 +1,6 @@ // { dg-do run } // { dg-require-effective-target tls } +// { dg-add-options tls } /* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */ extern "C" { extern void abort (); diff --git a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm index 233cf20e132..4e5baac790d 100644 --- a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm +++ b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm @@ -1,5 +1,6 @@ // { dg-do run } // { dg-require-effective-target tls } +// { dg-add-options tls } /* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */ extern "C" { @@ -42,4 +43,4 @@ int main (int ac, char *av[]) abort () ; return 0; -}
\ No newline at end of file +} diff --git a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm index e106a9fe878..1515d250057 100644 --- a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm +++ b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target tls } */ +/* { dg-add-options tls } */ /* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */ /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ /* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.mm" } */ diff --git a/gcc/testsuite/objc-obj-c++-shared/Object1.h b/gcc/testsuite/objc-obj-c++-shared/Object1.h index 3c7dd9aed72..324b6807cf3 100644 --- a/gcc/testsuite/objc-obj-c++-shared/Object1.h +++ b/gcc/testsuite/objc-obj-c++-shared/Object1.h @@ -1 +1,150 @@ -/* Object definition taken from <objc/Object.h>
*/
#ifndef _OBJC_OBJECT1_H_
#define _OBJC_OBJECT1_H_
#undef DO_NEXT_M64_OBJECT_IMPLEMENTATION
#ifndef __NEXT_RUNTIME__
# include <objc/Object.h>
#else
# include "next-abi.h"
# ifndef NEXT_OBJC_USE_NEW_INTERFACE
/* We are on a next system, or version, that is happy to compile V0 ABI */
# include <objc/Object.h>
# else
# if (NEXT_OBJC_ABI_VERSION==0)
/* We are on a system that has V0 ABI implementation in libobjc.dylib.
* However, we need to use the new accessors and pretend that the
* structures are opaque to avoid 'deprecated' warnings
*/
# include <objc/Object.h>
# else
/* We are on a system that includes a V2 ABI Object in libobjc.dylib.
*/
# ifdef __OBJC2__
/* ... and we have a V2 ABI compiler .. */
# include <objc/Object.h>
# else
/* We can't access the Object definition in libobjc.dylib because
* we can't yet generate OBJC2 code.
*
* So we'll roll our own Object - purely for the sake of compile
* checks - the code is unlikely to run...
*/
# ifndef _OBJC_OBJECT_H_
# define _OBJC_OBJECT_H_
#include <stdarg.h>
#import <objc/objc-runtime.h>
/* This is a cut-down Object with only the methods currently required
by the testsuite declared.
For those executables that require an implementation (to link) this
can be provided in a given test by placing:
#include "path/to/objc-c++shared/Object1-implementation.h"
at the end of the source for the test.
*/
@interface Object
{
Class isa; /* A pointer to the instance's class structure */
}
+ initialize;
- init;
+ new;
+ free;
- free;
+ alloc;
//- copy;
//+ allocFromZone:(void *)zone;
//- copyFromZone:(void *)zone;
//- (void *)zone;
+ class;
//+ superclass;
//+ (const char *) name;
- class;
- superclass;
- (const char *) name;
//- self;
//- (unsigned int) hash;
//-(BOOL) isEqual:anObject;
/* Testing inheritance relationships */
//- (BOOL) isKindOf: aClassObject;
//- (BOOL) isMemberOf: aClassObject;
//- (BOOL) isKindOfClassNamed: (const char *)aClassName;
//- (BOOL) isMemberOfClassNamed: (const char *)aClassName;
/* Testing class functionality */
//+ (BOOL) instancesRespondTo:(SEL)aSelector;
//- (BOOL) respondsTo:(SEL)aSelector;
/* Testing protocol conformance */
- (BOOL) conformsTo: (Protocol *)aProtocolObject;
//+ (BOOL) conformsTo: (Protocol *)aProtocolObject;
/* Obtaining method descriptors from protocols */
//- (struct objc_method_description *) descriptionForMethod:(SEL)aSel;
//+ (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel;
/* Obtaining method handles */
//- (IMP) methodFor:(SEL)aSelector;
//+ (IMP) instanceMethodFor:(SEL)aSelector;
/* Sending messages determined at run time */
//- perform:(SEL)aSelector;
//- perform:(SEL)aSelector with:anObject;
//- perform:(SEL)aSelector with:object1 with:object2;
/* Posing */
//+ poseAs: aClassObject;
/* Enforcing intentions */
//- subclassResponsibility:(SEL)aSelector;
//- notImplemented:(SEL)aSelector;
/* Error handling */
//- doesNotRecognize:(SEL)aSelector;
//- error:(const char *)aString, ...;
/* Debugging */
//- (void) printForDebugger:(void *)stream;
/* Archiving */
//- awake;
//- write:(void *)stream;
//- read:(void *)stream;
//+ (int) version;
//+ setVersion: (int) aVersion;
/* Forwarding */
//- forward: (SEL)sel : (marg_list)args;
//- performv: (SEL)sel : (marg_list)args;
@end
#define DO_NEXT_M64_OBJECT_IMPLEMENTATION
# endif /* _OBJC_OBJECT_H_ */
# endif /* __OBJC2__ */
# endif /* ABI=0 */
# endif /* NEXT_OBJC_USE_NEW_INTERFACE */
# endif /* __NEXT_RUNTIME__ */
#endif /* _OBJC_OBJECT1_H_ */
\ No newline at end of file +/* Object definition taken from <objc/Object.h> + */ +#ifndef _OBJC_OBJECT1_H_ +#define _OBJC_OBJECT1_H_ + +#undef DO_NEXT_M64_OBJECT_IMPLEMENTATION + +#ifndef __NEXT_RUNTIME__ +# include <objc/Object.h> +#else +# include "next-abi.h" +# ifndef NEXT_OBJC_USE_NEW_INTERFACE +/* We are on a next system, or version, that is happy to compile V0 ABI */ +# include <objc/Object.h> +# else +# if (NEXT_OBJC_ABI_VERSION==0) +/* We are on a system that has V0 ABI implementation in libobjc.dylib. + * However, we need to use the new accessors and pretend that the + * structures are opaque to avoid 'deprecated' warnings + */ +# include <objc/Object.h> +# else +/* We are on a system that includes a V2 ABI Object in libobjc.dylib. +*/ +# ifdef __OBJC2__ +/* ... and we have a V2 ABI compiler .. */ +# include <objc/Object.h> +# else +/* We can't access the Object definition in libobjc.dylib because + * we can't yet generate OBJC2 code. + * + * So we'll roll our own Object - purely for the sake of compile + * checks - the code is unlikely to run... +*/ +# ifndef _OBJC_OBJECT_H_ +# define _OBJC_OBJECT_H_ + +#include <stdarg.h> +#import <objc/objc-runtime.h> + +/* This is a cut-down Object with only the methods currently required + by the testsuite declared. + + For those executables that require an implementation (to link) this + can be provided in a given test by placing: + #include "path/to/objc-c++shared/Object1-implementation.h" + at the end of the source for the test. +*/ + +@interface Object +{ + Class isa; /* A pointer to the instance's class structure */ +} ++ initialize; +- init; + ++ new; ++ free; +- free; ++ alloc; +//- copy; +//+ allocFromZone:(void *)zone; +//- copyFromZone:(void *)zone; +//- (void *)zone; + ++ class; +//+ superclass; +//+ (const char *) name; +- class; +- superclass; +- (const char *) name; + +//- self; +//- (unsigned int) hash; +//-(BOOL) isEqual:anObject; + +/* Testing inheritance relationships */ + +//- (BOOL) isKindOf: aClassObject; +//- (BOOL) isMemberOf: aClassObject; +//- (BOOL) isKindOfClassNamed: (const char *)aClassName; +//- (BOOL) isMemberOfClassNamed: (const char *)aClassName; + +/* Testing class functionality */ + +//+ (BOOL) instancesRespondTo:(SEL)aSelector; +//- (BOOL) respondsTo:(SEL)aSelector; + +/* Testing protocol conformance */ + +- (BOOL) conformsTo: (Protocol *)aProtocolObject; +//+ (BOOL) conformsTo: (Protocol *)aProtocolObject; + +/* Obtaining method descriptors from protocols */ + +//- (struct objc_method_description *) descriptionForMethod:(SEL)aSel; +//+ (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel; + +/* Obtaining method handles */ + +//- (IMP) methodFor:(SEL)aSelector; +//+ (IMP) instanceMethodFor:(SEL)aSelector; + +/* Sending messages determined at run time */ + +//- perform:(SEL)aSelector; +//- perform:(SEL)aSelector with:anObject; +//- perform:(SEL)aSelector with:object1 with:object2; + +/* Posing */ + +//+ poseAs: aClassObject; + +/* Enforcing intentions */ + +//- subclassResponsibility:(SEL)aSelector; +//- notImplemented:(SEL)aSelector; + +/* Error handling */ + +//- doesNotRecognize:(SEL)aSelector; +//- error:(const char *)aString, ...; + +/* Debugging */ + +//- (void) printForDebugger:(void *)stream; + +/* Archiving */ + +//- awake; +//- write:(void *)stream; +//- read:(void *)stream; +//+ (int) version; +//+ setVersion: (int) aVersion; + +/* Forwarding */ + +//- forward: (SEL)sel : (marg_list)args; +//- performv: (SEL)sel : (marg_list)args; + +@end + +#define DO_NEXT_M64_OBJECT_IMPLEMENTATION + +# endif /* _OBJC_OBJECT_H_ */ +# endif /* __OBJC2__ */ +# endif /* ABI=0 */ +# endif /* NEXT_OBJC_USE_NEW_INTERFACE */ +# endif /* __NEXT_RUNTIME__ */ +#endif /* _OBJC_OBJECT1_H_ */ diff --git a/gcc/testsuite/objc-obj-c++-shared/next-abi.h b/gcc/testsuite/objc-obj-c++-shared/next-abi.h index 21a49d341e1..3ab9804e510 100644 --- a/gcc/testsuite/objc-obj-c++-shared/next-abi.h +++ b/gcc/testsuite/objc-obj-c++-shared/next-abi.h @@ -19,7 +19,7 @@ #undef NEXT_OBJC_USE_NEW_INTERFACE #ifdef __NEXT_RUNTIME__ -# if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 || __OBJC2__) +# if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 || __OBJC2__) /* We have to use an updated interface for 32bit NeXT to avoid * 'deprecated' warnings. * For 64bit NeXT the ABI is different (and the interfaces 'deprecated' @@ -36,7 +36,10 @@ */ # define NEXT_OBJC_ABI_VERSION 0 # endif -# endif -#endif +# else + /* Pre-OSX 10.5 all is ABI 0. */ +# define NEXT_OBJC_ABI_VERSION 0 +# endif /* MAC_OS_X_VERSION_MIN_REQUIRED > 10.5 or OBJC2 */ +#endif /* __NEXT_RUNTIME__ */ #endif /* _OBJC_NEXT_ABI_H_ */ diff --git a/gcc/testsuite/objc.dg/image-info.m b/gcc/testsuite/objc.dg/image-info.m index 0a740fa31f1..e9e9de68906 100644 --- a/gcc/testsuite/objc.dg/image-info.m +++ b/gcc/testsuite/objc.dg/image-info.m @@ -4,6 +4,7 @@ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* { dg-do compile { target { *-*-darwin* } } } */ +/* { dg-skip-if "NeXT-only" { *-*-* } { "-fgnu-runtime" } { "" } } */ /* { dg-options "-freplace-objc-classes" } */ #include "../objc-obj-c++-shared/Object1.h" diff --git a/gcc/testsuite/objc.dg/lto/lto.exp b/gcc/testsuite/objc.dg/lto/lto.exp new file mode 100644 index 00000000000..4ea89cced6c --- /dev/null +++ b/gcc/testsuite/objc.dg/lto/lto.exp @@ -0,0 +1,84 @@ +# Copyright (C) 2010 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/>. +# +# Based on gcc/testsuite/gcc.dg/lto/lto.exp. + +# Test link-time optimization across multiple files. +# +# Programs are broken into multiple files. Each one is compiled +# separately with LTO information. The final executable is generated +# by collecting all the generated object files using regular LTO or WHOPR. + +if $tracelevel then { + strace $tracelevel +} + +# Load procedures from common libraries. +load_lib standard.exp +load_lib objc-dg.exp + +# Load the language-independent compabibility support procedures. +load_lib lto.exp + +# If LTO has not been enabled, bail. +if { ![check_effective_target_lto] } { + return +} + +global LTO_OPTIONS + +set LTO_OPTIONS [list \ + {-O0 -fwhopr -fgnu-runtime} \ + {-O2 -fwhopr -fgnu-runtime} \ + {-O0 -flto -fgnu-runtime} \ + {-O2 -flto -fgnu-runtime} \ +] + +objc_init +lto_init no-mathlib + +# Define an identifier for use with this suite to avoid name conflicts +# with other lto tests running at the same time. +set sid "objc_lto" +set tests [lsort [glob -nocomplain $srcdir/$subdir/*_0.m]] + +# Main loop. +foreach src $tests { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + lto-execute $src $sid +} + +# darwin targets can also run code with the NeXT runtime. +if [istarget "*-*-darwin*" ] { +set LTO_OPTIONS [list \ + {-O0 -fwhopr -fnext-runtime} \ + {-O2 -fwhopr -fnext-runtime} \ + {-O0 -flto -fnext-runtime} \ + {-O2 -flto -fnext-runtime} \ +] + foreach src $tests { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + lto-execute $src $sid + } +} + +lto_finish diff --git a/gcc/testsuite/objc.dg/lto/trivial-1_0.m b/gcc/testsuite/objc.dg/lto/trivial-1_0.m new file mode 100644 index 00000000000..076f2306c1b --- /dev/null +++ b/gcc/testsuite/objc.dg/lto/trivial-1_0.m @@ -0,0 +1,37 @@ +/* { dg-lto-do run } */ +/* { dg-skip-if "" { "*-*-darwin*" && lp64 } { "*" } { "" } } */ +extern int printf (char *,...) ; + +typedef struct objc_class *Class; + +struct objc_class { + Class isa; + /* other stuff... */ +} ; + +@interface myRootObject { +@public + Class isa; +} ++initialize; ++(Class)class; + +@end + +@implementation myRootObject ++initialize { + return self; +} + ++(Class)class { + return (Class)self; +} + +@end + +int main(void) +{ + [myRootObject class]; + printf("trivial OK\n"); + return 0; +} diff --git a/gcc/testsuite/objc.dg/symtab-1.m b/gcc/testsuite/objc.dg/symtab-1.m index 90a79691721..100b245325e 100644 --- a/gcc/testsuite/objc.dg/symtab-1.m +++ b/gcc/testsuite/objc.dg/symtab-1.m @@ -22,6 +22,7 @@ -(void)checkValues { } @end -/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.long\t0\n\t.long\t0\n\t.word\t2\n\t.word\t0\n\t.long\tL_OBJC_CLASS_Derived.*\n\t.long\tL_OBJC_CLASS_Base.*\n" { target { i?86-*-darwin* && { ! lp64 } } } } } */ -/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.long\t0\n\t.long\t0\n\t.short\t2\n\t.short\t0\n\t.long\tL_OBJC_CLASS_Derived.*\n\t.long\tL_OBJC_CLASS_Base.*\n" { target { powerpc-*-darwin* && { ! lp64 } } } } } */ -/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.quad\t0\n\t.long\t0\n\t.space 4\n\t.word\t2\n\t.word\t0\n\t.space 4\n\t.quad\tL_OBJC_CLASS_Derived.*\n\t.quad\tL_OBJC_CLASS_Base.*\n" { target { *-*-darwin* && { lp64 } } } } } */ +/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.long\t0\n\t.long\t0\n\t.word\t2\n\t.word\t0\n\t.long\tL_OBJC_CLASS_Derived.*\n\t.long\tL_OBJC_CLASS_Base.*\n" { target { *86*-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.long\t0\n\t.long\t0\n\t.short\t2\n\t.short\t0\n\t.long\tL_OBJC_CLASS_Derived.*\n\t.long\tL_OBJC_CLASS_Base.*\n" { target { powerpc*-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.quad\t0\n\t.quad\t0\n\t.word\t2\n\t.word\t0\n\t.space 4\n\t.quad\tL_OBJC_CLASS_Derived.*\n\t.quad\tL_OBJC_CLASS_Base.*\n" { target { *86*-*-darwin* && { lp64 } } } } } */ +/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.quad\t0\n\t.quad\t0\n\t.short\t2\n\t.short\t0\n\t.space 4\n\t.quad\tL_OBJC_CLASS_Derived.*\n\t.quad\tL_OBJC_CLASS_Base.*\n" { target { powerpc*-*-darwin* && { lp64 } } } } } */ diff --git a/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m b/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m index b637e2544e6..9a946bb444d 100644 --- a/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m +++ b/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m @@ -1,5 +1,6 @@ // { dg-do run } // { dg-require-effective-target tls } +// { dg-add-options tls } /* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */ extern void _exit(int); diff --git a/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m b/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m index f30315d8819..6ac977c9bae 100644 --- a/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m +++ b/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target tls } */ +/* { dg-add-options tls } */ /* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */ /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ /* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */ diff --git a/gcc/testsuite/objc.dg/torture/tls/thr-init.m b/gcc/testsuite/objc.dg/torture/tls/thr-init.m index 6c3bad1b9bb..286a4706f06 100644 --- a/gcc/testsuite/objc.dg/torture/tls/thr-init.m +++ b/gcc/testsuite/objc.dg/torture/tls/thr-init.m @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-require-effective-target tls } */ +/* { dg-add-options tls } */ /* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */ extern void _exit(int); diff --git a/gcc/testsuite/objc/execute/forward-1.m b/gcc/testsuite/objc/execute/forward-1.m index c20f8c4934f..258a9164999 100644 --- a/gcc/testsuite/objc/execute/forward-1.m +++ b/gcc/testsuite/objc/execute/forward-1.m @@ -55,13 +55,12 @@ id forwarder, receiver; receiver = theReceiver; return self; } -#ifdef NEXT_OBJC_USE_NEW_INTERFACE +#ifdef __NEXT_RUNTIME__ - forward: (SEL)theSel: (marg_list)theArgFrame -{ #else -(retval_t) forward: (SEL)theSel: (arglist_t)theArgFrame -{ #endif +{ /* If we have a reciever try to perform on that object */ if (receiver) return [receiver performv: theSel: theArgFrame]; |