From cbbb9dabbb498b27ca4cf7337a7c8aa013498bb0 Mon Sep 17 00:00:00 2001 From: Dominik Vogt Date: Thu, 22 Dec 2016 14:46:46 +0000 Subject: [PATCH] Run tests only if the machine supports the instruction set. gcc/ChangeLog: 2016-12-22 Dominik Vogt * config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define __S390_ARCH_LEVEL__. gcc/testsuite/ChangeLog: 2016-12-22 Dominik Vogt * gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw". * gcc.target/s390/md/rXsbg_mode_sXl.c: Likewise. * gcc.target/s390/md/andc-splitter-1.c: Likewise. * gcc.target/s390/md/andc-splitter-2.c: Likewise. * lib/gcc-dg.exp (gcc-dg-runtest): Export torture_current_flags. * gcc.target/s390/s390.exp: Import torture_current_flags. (check_effective_target_s390_useable_hw): New. (check_effective_target_s390_z900_hw): New. (check_effective_target_s390_z990_hw): New. (check_effective_target_s390_z9_ec_hw): New. (check_effective_target_s390_z10_hw): New. (check_effective_target_s390_z196_hw): New. (check_effective_target_s390_zEC12_hw): New. (check_effective_target_s390_z13_hw): New. (check_effective_target_z10_instructions): Removed. (torture tests): Add optimization level without -march=. Reorder torture tests for good cache usage. From-SVN: r243887 --- gcc/ChangeLog | 5 + gcc/config/s390/s390-c.c | 17 ++ gcc/testsuite/ChangeLog | 20 +++ .../gcc.target/s390/md/andc-splitter-1.c | 19 +- .../gcc.target/s390/md/andc-splitter-2.c | 19 +- .../gcc.target/s390/md/rXsbg_mode_sXl.c | 4 +- .../gcc.target/s390/md/setmem_long-1.c | 7 +- gcc/testsuite/gcc.target/s390/s390.exp | 170 ++++++++++++++++-- gcc/testsuite/lib/gcc-dg.exp | 2 + 9 files changed, 223 insertions(+), 40 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b09d8fb7f1f..f3f3816f457 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-12-22 Dominik Vogt + + * config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define + __S390_ARCH_LEVEL__. + 2016-12-22 Martin Liska PR tree-optimization/78886 diff --git a/gcc/config/s390/s390-c.c b/gcc/config/s390/s390-c.c index fcf74774340..e8413653517 100644 --- a/gcc/config/s390/s390-c.c +++ b/gcc/config/s390/s390-c.c @@ -320,6 +320,8 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile, { s390_def_or_undef_macro (pfile, MASK_OPT_HTM, old_opts, opts, "__HTM__", "__HTM__"); + s390_def_or_undef_macro (pfile, MASK_OPT_VX, old_opts, opts, + "__S390_VX__", "__S390_VX__"); s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, "__VEC__=10301", "__VEC__"); s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, @@ -328,6 +330,21 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile, s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, "__bool=__attribute__((s390_vector_bool)) unsigned", "__bool"); + { + char macro_def[64]; + int arch_level; + gcc_assert (s390_arch != PROCESSOR_NATIVE); + arch_level = (int)s390_arch + 3; + if (s390_arch >= PROCESSOR_2094_Z9_EC) + /* Z9_EC has the same level as Z9_109. */ + arch_level--; + /* Review when a new arch is added and increase the value. */ + char dummy[23 - 2 * PROCESSOR_max] __attribute__((unused)); + sprintf (macro_def, "__S390_ARCH_LEVEL__=%d", arch_level); + cpp_undef (pfile, "__S390_ARCH_LEVEL__"); + cpp_define (pfile, macro_def); + } + if (!flag_iso) { s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c9ab9dec6a6..1532f18651c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,23 @@ +2016-12-22 Dominik Vogt + + * gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw". + * gcc.target/s390/md/rXsbg_mode_sXl.c: Likewise. + * gcc.target/s390/md/andc-splitter-1.c: Likewise. + * gcc.target/s390/md/andc-splitter-2.c: Likewise. + * lib/gcc-dg.exp (gcc-dg-runtest): Export torture_current_flags. + * gcc.target/s390/s390.exp: Import torture_current_flags. + (check_effective_target_s390_useable_hw): New. + (check_effective_target_s390_z900_hw): New. + (check_effective_target_s390_z990_hw): New. + (check_effective_target_s390_z9_ec_hw): New. + (check_effective_target_s390_z10_hw): New. + (check_effective_target_s390_z196_hw): New. + (check_effective_target_s390_zEC12_hw): New. + (check_effective_target_s390_z13_hw): New. + (check_effective_target_z10_instructions): Removed. + (torture tests): Add optimization level without -march=. + Reorder torture tests for good cache usage. + 2016-12-22 Martin Liska PR tree-optimization/78886 diff --git a/gcc/testsuite/gcc.target/s390/md/andc-splitter-1.c b/gcc/testsuite/gcc.target/s390/md/andc-splitter-1.c index ed78921e5c9..3f0677cfd76 100644 --- a/gcc/testsuite/gcc.target/s390/md/andc-splitter-1.c +++ b/gcc/testsuite/gcc.target/s390/md/andc-splitter-1.c @@ -1,7 +1,8 @@ /* Machine description pattern tests. */ -/* { dg-do run { target { lp64 } } } */ +/* { dg-do compile { target { lp64 } } } */ /* { dg-options "-mzarch -save-temps -dP" } */ +/* { dg-do run { target { lp64 && s390_useable_hw } } } */ /* Skip test if -O0 is present on the command line: { dg-skip-if "" { *-*-* } { "-O0" } { "" } } @@ -13,26 +14,26 @@ __attribute__ ((noinline)) unsigned long andc_vv(unsigned long a, unsigned long b) { return ~b & a; } -/* { dg-final { scan-assembler ":15 .\* \{\\*anddi3\}" } } */ -/* { dg-final { scan-assembler ":15 .\* \{\\*xordi3\}" } } */ +/* { dg-final { scan-assembler ":16 .\* \{\\*anddi3\}" } } */ +/* { dg-final { scan-assembler ":16 .\* \{\\*xordi3\}" } } */ __attribute__ ((noinline)) unsigned long andc_pv(unsigned long *a, unsigned long b) { return ~b & *a; } -/* { dg-final { scan-assembler ":21 .\* \{\\*anddi3\}" } } */ -/* { dg-final { scan-assembler ":21 .\* \{\\*xordi3\}" } } */ +/* { dg-final { scan-assembler ":22 .\* \{\\*anddi3\}" } } */ +/* { dg-final { scan-assembler ":22 .\* \{\\*xordi3\}" } } */ __attribute__ ((noinline)) unsigned long andc_vp(unsigned long a, unsigned long *b) { return ~*b & a; } -/* { dg-final { scan-assembler ":27 .\* \{\\*anddi3\}" } } */ -/* { dg-final { scan-assembler ":27 .\* \{\\*xordi3\}" } } */ +/* { dg-final { scan-assembler ":28 .\* \{\\*anddi3\}" } } */ +/* { dg-final { scan-assembler ":28 .\* \{\\*xordi3\}" } } */ __attribute__ ((noinline)) unsigned long andc_pp(unsigned long *a, unsigned long *b) { return ~*b & *a; } -/* { dg-final { scan-assembler ":33 .\* \{\\*anddi3\}" } } */ -/* { dg-final { scan-assembler ":33 .\* \{\\*xordi3\}" } } */ +/* { dg-final { scan-assembler ":34 .\* \{\\*anddi3\}" } } */ +/* { dg-final { scan-assembler ":34 .\* \{\\*xordi3\}" } } */ /* { dg-final { scan-assembler-times "\tngr\?k\?\t" 4 } } */ /* { dg-final { scan-assembler-times "\txgr\?\t" 4 } } */ diff --git a/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c b/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c index d88da4d4f6b..89c8ea25f99 100644 --- a/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c +++ b/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c @@ -1,7 +1,8 @@ /* Machine description pattern tests. */ -/* { dg-do run } */ +/* { dg-do compile } */ /* { dg-options "-save-temps -dP" } */ +/* { dg-do run { target { s390_useable_hw } } } */ /* Skip test if -O0 is present on the command line: { dg-skip-if "" { *-*-* } { "-O0" } { "" } } @@ -13,26 +14,26 @@ __attribute__ ((noinline)) unsigned int andc_vv(unsigned int a, unsigned int b) { return ~b & a; } -/* { dg-final { scan-assembler ":15 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ -/* { dg-final { scan-assembler ":15 .\* \{\\*xorsi3\}" } } */ +/* { dg-final { scan-assembler ":16 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ +/* { dg-final { scan-assembler ":16 .\* \{\\*xorsi3\}" } } */ __attribute__ ((noinline)) unsigned int andc_pv(unsigned int *a, unsigned int b) { return ~b & *a; } -/* { dg-final { scan-assembler ":21 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ -/* { dg-final { scan-assembler ":21 .\* \{\\*xorsi3\}" } } */ +/* { dg-final { scan-assembler ":22 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ +/* { dg-final { scan-assembler ":22 .\* \{\\*xorsi3\}" } } */ __attribute__ ((noinline)) unsigned int andc_vp(unsigned int a, unsigned int *b) { return ~*b & a; } -/* { dg-final { scan-assembler ":27 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ -/* { dg-final { scan-assembler ":27 .\* \{\\*xorsi3\}" } } */ +/* { dg-final { scan-assembler ":28 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ +/* { dg-final { scan-assembler ":28 .\* \{\\*xorsi3\}" } } */ __attribute__ ((noinline)) unsigned int andc_pp(unsigned int *a, unsigned int *b) { return ~*b & *a; } -/* { dg-final { scan-assembler ":33 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ -/* { dg-final { scan-assembler ":33 .\* \{\\*xorsi3\}" } } */ +/* { dg-final { scan-assembler ":34 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ +/* { dg-final { scan-assembler ":34 .\* \{\\*xorsi3\}" } } */ /* { dg-final { scan-assembler-times "\tnr\?k\?\t" 4 } } */ /* { dg-final { scan-assembler-times "\txr\?k\?\t" 4 } } */ diff --git a/gcc/testsuite/gcc.target/s390/md/rXsbg_mode_sXl.c b/gcc/testsuite/gcc.target/s390/md/rXsbg_mode_sXl.c index ad442dad931..824ce39dfd9 100644 --- a/gcc/testsuite/gcc.target/s390/md/rXsbg_mode_sXl.c +++ b/gcc/testsuite/gcc.target/s390/md/rXsbg_mode_sXl.c @@ -7,8 +7,8 @@ always wins, even if the condition is false. If this test is run on hardware older than z10 with a buggy dejagnu release, the execution part will fail. - { dg-do assemble { target { ! z10_instructions } } } - { dg-do run { target { z10_instructions } } } + { dg-do assemble } + { dg-do run { target { s390_useable_hw } } } Skip test if -O0, -march=z900, -march=z9-109 or -march=z9-ec is present on the command line: diff --git a/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c b/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c index bd0c5948f12..5fc54e2108f 100644 --- a/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c +++ b/gcc/testsuite/gcc.target/s390/md/setmem_long-1.c @@ -1,7 +1,8 @@ /* Machine description pattern tests. */ -/* { dg-do run } */ +/* { dg-do compile } */ /* { dg-options "-mmvcle -dP -save-temps" } */ +/* { dg-do run { target { s390_useable_hw } } } */ __attribute__ ((noinline)) void test(char *p, char c, int len) @@ -16,8 +17,8 @@ void test2(char *p, int c, int len) } /* Check that the right patterns are used. */ -/* { dg-final { scan-assembler-times {c"?:9 .*{[*]setmem_long_?3?1?z?}} 1 } } */ -/* { dg-final { scan-assembler-times {c"?:15 .*{[*]setmem_long_and_?3?1?z?}} 1 { xfail *-*-* } } } */ +/* { dg-final { scan-assembler-times {c"?:10 .*{[*]setmem_long_?3?1?z?}} 1 } } */ +/* { dg-final { scan-assembler-times {c"?:16 .*{[*]setmem_long_and_?3?1?z?}} 1 { xfail *-*-* } } } */ #define LEN 500 char buf[LEN + 2]; diff --git a/gcc/testsuite/gcc.target/s390/s390.exp b/gcc/testsuite/gcc.target/s390/s390.exp index 450dcaf4272..d826dbaee13 100644 --- a/gcc/testsuite/gcc.target/s390/s390.exp +++ b/gcc/testsuite/gcc.target/s390/s390.exp @@ -16,6 +16,9 @@ # GCC testsuite that uses the `dg.exp' driver. +global torture_current_flags +set torture_current_flags "" + # Exit immediately if this isn't a s390 target. if ![istarget s390*-*-*] then { return @@ -24,17 +27,6 @@ if ![istarget s390*-*-*] then { # Load support procs. load_lib gcc-dg.exp -# Return 1 if z10 instructions work. -proc check_effective_target_z10_instructions { } { - if { ![check_runtime s390_check_z10_instructions [subst { - int main (void) - { - asm ("rosbg %%r2,%%r2,0,0,0" : : ); - return 0; - } - }] "-march=z10 -mzarch" ] } { return 0 } else { return 1 } -} - # Return 1 if the the assembler understands .machine and .machinemode. The # target attribute needs that feature to work. proc check_effective_target_target_attribute { } { @@ -78,6 +70,138 @@ proc check_effective_target_vector { } { }] "-march=z13 -mzarch" ] } { return 0 } else { return 1 } } +global s390_cached_flags +set s390_cached_flags "" +global s390_cached_value +set s390_cached_value "" +global s390_cached_value_noflags +set s390_cached_value_noflags "" + +# Return 1 if a program using the full instruction set allowed by +# the compiler option can be executed. +proc check_effective_target_s390_useable_hw { } { + global torture_current_flags + global s390_cached_flags + global s390_cached_value + global s390_cached_value_noflags + + # Remove -Ox options and whitespace. + set flags [regsub -all {[-]O[0-9s]} "$torture_current_flags" ""] + set flags [regsub -all {[ \\t\\n]+} "$flags" " "] + set flags [regsub -all {(^ )|( $)} "$flags" ""] + if { "$s390_cached_flags" != "" && "$flags" == "$s390_cached_flags" } { + return $s390_cached_value + } + # Extra cache for (frequent) calls with empty torture_current_flags. + if { "$flags" == "" && $s390_cached_value_noflags != "" } { + return $s390_cached_value_noflags + } + if { ![check_runtime_nocache s390_check_useable_hw [subst { + int main (void) + { + asm (".machinemode zarch" : : ); + #if __S390_ARCH_LEVEL__ >= 11 + asm ("lcbb %%r2,0(%%r15),0" : : ); + #elif __S390_ARCH_LEVEL__ >= 10 + asm ("risbgn %%r2,%%r2,0,0,0" : : ); + #elif __S390_ARCH_LEVEL__ >= 9 + asm ("sgrk %%r2,%%r2,%%r2" : : ); + #elif __S390_ARCH_LEVEL__ >= 8 + asm ("rosbg %%r2,%%r2,0,0,0" : : ); + #elif __S390_ARCH_LEVEL__ >= 7 + asm ("nilf %%r2,0" : : ); + #elif __S390_ARCH_LEVEL__ >= 6 + asm ("lay %%r2,0(%%r15)" : : ); + #elif __S390_ARCH_LEVEL__ >= 5 + asm ("tam" : : ); + #endif + #ifdef __HTM__ + { + unsigned int nd; + asm ("etnd %0" : "=d" (nd)); + } + #endif + #ifdef __S390_VX__ + asm ("vzero %%v0" : : ); + #endif + return 0; + } + }] "$flags" ] } { set result 0 } else { set result 1 } + if { "$flags" == "" } { + set s390_cached_value_noflags "$result" + } else { + set s390_cached_flags "$flags" + set s390_cached_value "$result" + } + return $result +} + +# Return 1 if -march=... specific instructions are understood by +# the assembler and can be executed. +proc check_effective_target_s390_z900_hw { } { + if { ![check_runtime s390_check_s390_z900_hw [subst { + int main (void) + { + asm ("tam" : : ); + return 0; + } + }] "-march=z900 -m64 -mzarch" ] } { return 0 } else { return 1 } +} +proc check_effective_target_s390_z990_hw { } { + if { ![check_runtime s390_check_s390_z990_hw [subst { + int main (void) + { + asm ("lay %%r2,0(%%r15)" : : ); + return 0; + } + }] "-march=z990 -m64 -mzarch" ] } { return 0 } else { return 1 } +} +proc check_effective_target_s390_z9_ec_hw { } { + if { ![check_runtime s390_check_s390_z9_ec_hw [subst { + int main (void) + { + asm ("nilf %%r2,0" : : ); + return 0; + } + }] "-march=z9-ec -m64 -mzarch" ] } { return 0 } else { return 1 } +} +proc check_effective_target_s390_z10_hw { } { + if { ![check_runtime s390_check_s390_z10_hw [subst { + int main (void) + { + asm ("rosbg %%r2,%%r2,0,0,0" : : ); + return 0; + } + }] "-march=z10 -m64 -mzarch" ] } { return 0 } else { return 1 } +} +proc check_effective_target_s390_z196_hw { } { + if { ![check_runtime s390_check_s390_z196_hw [subst { + int main (void) + { + asm ("sgrk %%r2,%%r2,%%r2" : : ); + return 0; + } + }] "-march=z196 -m64 -mzarch" ] } { return 0 } else { return 1 } +} +proc check_effective_target_s390_zEC12_hw { } { + if { ![check_runtime s390_check_s390_zEC12_hw [subst { + int main (void) + { + asm ("risbgn %%r2,%%r2,0,0,0" : : ); + return 0; + } + }] "-march=zEC12 -m64 -mzarch" ] } { return 0 } else { return 1 } +} +proc check_effective_target_s390_z13_hw { } { + if { ![check_runtime s390_check_s390_z13_hw [subst { + int main (void) + { + asm ("lcbb %%r2,0(%%r15),0" : : ); + return 0; + } + }] "-march=z13 -m64 -mzarch" ] } { return 0 } else { return 1 } +} + # If a testcase doesn't have special options, use these. global DEFAULT_CFLAGS if ![info exists DEFAULT_CFLAGS] then { @@ -110,15 +234,27 @@ gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/hotpatch-\[0-9\]*.c]] \ torture-finish # Additional md torture tests. +# (Note: Split into a separate torture test for each -march= option to improve +# cacheability.) +torture-init +set MD_TEST_OPTS [list \ + {-Os} {-Os -march=z900} \ + {-O0} {-O0 -march=z900} \ + {-O1} {-O1 -march=z900} \ + {-O2} {-O2 -march=z900} \ + {-O3} {-O3 -march=z900} ] +set-torture-options $MD_TEST_OPTS +gcc-dg-runtest [lsort [glob -nocomplain $md_tests]] "" "$DEFAULT_CFLAGS" +torture-finish torture-init set MD_TEST_OPTS [list \ - {-Os -march=z900} {-Os -march=z13} \ - {-O0 -march=z900} {-O0 -march=z13} \ - {-O1 -march=z900} {-O1 -march=z13} \ - {-O2 -march=z900} {-O2 -march=z13} \ - {-O3 -march=z900} {-O3 -march=z13}] + {-Os -march=z13} \ + {-O0 -march=z13} \ + {-O1 -march=z13} \ + {-O2 -march=z13} \ + {-O3 -march=z13} ] set-torture-options $MD_TEST_OPTS -gcc-dg-runtest [lsort [glob -nocomplain $md_tests]] "" $DEFAULT_CFLAGS +gcc-dg-runtest [lsort [glob -nocomplain $md_tests]] "" "$DEFAULT_CFLAGS" torture-finish # All done. diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index 6217272ac4c..d9681b18ed1 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -533,6 +533,8 @@ proc gcc-dg-runtest { testcases flags default-extra-flags } { set nshort [file tail [file dirname $test]]/[file tail $test] foreach flags_t $option_list { + global torture_current_flags + set torture_current_flags "$flags_t" verbose "Testing $nshort, $flags $flags_t" 1 dg-test $test "$flags $flags_t" ${default-extra-flags} } -- 2.30.2