Commit cbbb9dab by Dominik Vogt Committed by Andreas Krebbel

Run tests only if the machine supports the instruction set.

gcc/ChangeLog:

2016-12-22  Dominik Vogt  <vogt@linux.vnet.ibm.com>

	* config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define
	__S390_ARCH_LEVEL__.

gcc/testsuite/ChangeLog:

2016-12-22  Dominik Vogt  <vogt@linux.vnet.ibm.com>

	* 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
parent a71dcca8
2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define
__S390_ARCH_LEVEL__.
2016-12-22 Martin Liska <mliska@suse.cz> 2016-12-22 Martin Liska <mliska@suse.cz>
PR tree-optimization/78886 PR tree-optimization/78886
...@@ -320,6 +320,8 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile, ...@@ -320,6 +320,8 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile,
{ {
s390_def_or_undef_macro (pfile, MASK_OPT_HTM, old_opts, opts, s390_def_or_undef_macro (pfile, MASK_OPT_HTM, old_opts, opts,
"__HTM__", "__HTM__"); "__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, s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
"__VEC__=10301", "__VEC__"); "__VEC__=10301", "__VEC__");
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
...@@ -328,6 +330,21 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile, ...@@ -328,6 +330,21 @@ s390_cpu_cpp_builtins_internal (cpp_reader *pfile,
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
"__bool=__attribute__((s390_vector_bool)) unsigned", "__bool=__attribute__((s390_vector_bool)) unsigned",
"__bool"); "__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) if (!flag_iso)
{ {
s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts, s390_def_or_undef_macro (pfile, MASK_ZVECTOR, old_opts, opts,
......
2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com>
* 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 <mliska@suse.cz> 2016-12-22 Martin Liska <mliska@suse.cz>
PR tree-optimization/78886 PR tree-optimization/78886
......
/* Machine description pattern tests. */ /* Machine description pattern tests. */
/* { dg-do run { target { lp64 } } } */ /* { dg-do compile { target { lp64 } } } */
/* { dg-options "-mzarch -save-temps -dP" } */ /* { dg-options "-mzarch -save-temps -dP" } */
/* { dg-do run { target { lp64 && s390_useable_hw } } } */
/* Skip test if -O0 is present on the command line: /* Skip test if -O0 is present on the command line:
{ dg-skip-if "" { *-*-* } { "-O0" } { "" } } { dg-skip-if "" { *-*-* } { "-O0" } { "" } }
...@@ -13,26 +14,26 @@ ...@@ -13,26 +14,26 @@
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned long andc_vv(unsigned long a, unsigned long b) unsigned long andc_vv(unsigned long a, unsigned long b)
{ return ~b & a; } { return ~b & a; }
/* { dg-final { scan-assembler ":15 .\* \{\\*anddi3\}" } } */ /* { dg-final { scan-assembler ":16 .\* \{\\*anddi3\}" } } */
/* { dg-final { scan-assembler ":15 .\* \{\\*xordi3\}" } } */ /* { dg-final { scan-assembler ":16 .\* \{\\*xordi3\}" } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned long andc_pv(unsigned long *a, unsigned long b) unsigned long andc_pv(unsigned long *a, unsigned long b)
{ return ~b & *a; } { return ~b & *a; }
/* { dg-final { scan-assembler ":21 .\* \{\\*anddi3\}" } } */ /* { dg-final { scan-assembler ":22 .\* \{\\*anddi3\}" } } */
/* { dg-final { scan-assembler ":21 .\* \{\\*xordi3\}" } } */ /* { dg-final { scan-assembler ":22 .\* \{\\*xordi3\}" } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned long andc_vp(unsigned long a, unsigned long *b) unsigned long andc_vp(unsigned long a, unsigned long *b)
{ return ~*b & a; } { return ~*b & a; }
/* { dg-final { scan-assembler ":27 .\* \{\\*anddi3\}" } } */ /* { dg-final { scan-assembler ":28 .\* \{\\*anddi3\}" } } */
/* { dg-final { scan-assembler ":27 .\* \{\\*xordi3\}" } } */ /* { dg-final { scan-assembler ":28 .\* \{\\*xordi3\}" } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned long andc_pp(unsigned long *a, unsigned long *b) unsigned long andc_pp(unsigned long *a, unsigned long *b)
{ return ~*b & *a; } { return ~*b & *a; }
/* { dg-final { scan-assembler ":33 .\* \{\\*anddi3\}" } } */ /* { dg-final { scan-assembler ":34 .\* \{\\*anddi3\}" } } */
/* { dg-final { scan-assembler ":33 .\* \{\\*xordi3\}" } } */ /* { dg-final { scan-assembler ":34 .\* \{\\*xordi3\}" } } */
/* { dg-final { scan-assembler-times "\tngr\?k\?\t" 4 } } */ /* { dg-final { scan-assembler-times "\tngr\?k\?\t" 4 } } */
/* { dg-final { scan-assembler-times "\txgr\?\t" 4 } } */ /* { dg-final { scan-assembler-times "\txgr\?\t" 4 } } */
......
/* Machine description pattern tests. */ /* Machine description pattern tests. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-save-temps -dP" } */ /* { dg-options "-save-temps -dP" } */
/* { dg-do run { target { s390_useable_hw } } } */
/* Skip test if -O0 is present on the command line: /* Skip test if -O0 is present on the command line:
{ dg-skip-if "" { *-*-* } { "-O0" } { "" } } { dg-skip-if "" { *-*-* } { "-O0" } { "" } }
...@@ -13,26 +14,26 @@ ...@@ -13,26 +14,26 @@
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned int andc_vv(unsigned int a, unsigned int b) unsigned int andc_vv(unsigned int a, unsigned int b)
{ return ~b & a; } { return ~b & a; }
/* { dg-final { scan-assembler ":15 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ /* { dg-final { scan-assembler ":16 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
/* { dg-final { scan-assembler ":15 .\* \{\\*xorsi3\}" } } */ /* { dg-final { scan-assembler ":16 .\* \{\\*xorsi3\}" } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned int andc_pv(unsigned int *a, unsigned int b) unsigned int andc_pv(unsigned int *a, unsigned int b)
{ return ~b & *a; } { return ~b & *a; }
/* { dg-final { scan-assembler ":21 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ /* { dg-final { scan-assembler ":22 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
/* { dg-final { scan-assembler ":21 .\* \{\\*xorsi3\}" } } */ /* { dg-final { scan-assembler ":22 .\* \{\\*xorsi3\}" } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned int andc_vp(unsigned int a, unsigned int *b) unsigned int andc_vp(unsigned int a, unsigned int *b)
{ return ~*b & a; } { return ~*b & a; }
/* { dg-final { scan-assembler ":27 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ /* { dg-final { scan-assembler ":28 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
/* { dg-final { scan-assembler ":27 .\* \{\\*xorsi3\}" } } */ /* { dg-final { scan-assembler ":28 .\* \{\\*xorsi3\}" } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
unsigned int andc_pp(unsigned int *a, unsigned int *b) unsigned int andc_pp(unsigned int *a, unsigned int *b)
{ return ~*b & *a; } { return ~*b & *a; }
/* { dg-final { scan-assembler ":33 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */ /* { dg-final { scan-assembler ":34 .\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
/* { dg-final { scan-assembler ":33 .\* \{\\*xorsi3\}" } } */ /* { dg-final { scan-assembler ":34 .\* \{\\*xorsi3\}" } } */
/* { dg-final { scan-assembler-times "\tnr\?k\?\t" 4 } } */ /* { dg-final { scan-assembler-times "\tnr\?k\?\t" 4 } } */
/* { dg-final { scan-assembler-times "\txr\?k\?\t" 4 } } */ /* { dg-final { scan-assembler-times "\txr\?k\?\t" 4 } } */
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
always wins, even if the condition is false. If this test is run on hardware 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. older than z10 with a buggy dejagnu release, the execution part will fail.
{ dg-do assemble { target { ! z10_instructions } } } { dg-do assemble }
{ dg-do run { target { z10_instructions } } } { dg-do run { target { s390_useable_hw } } }
Skip test if -O0, -march=z900, -march=z9-109 or -march=z9-ec is present on Skip test if -O0, -march=z900, -march=z9-109 or -march=z9-ec is present on
the command line: the command line:
......
/* Machine description pattern tests. */ /* Machine description pattern tests. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-mmvcle -dP -save-temps" } */ /* { dg-options "-mmvcle -dP -save-temps" } */
/* { dg-do run { target { s390_useable_hw } } } */
__attribute__ ((noinline)) __attribute__ ((noinline))
void test(char *p, char c, int len) void test(char *p, char c, int len)
...@@ -16,8 +17,8 @@ void test2(char *p, int c, int len) ...@@ -16,8 +17,8 @@ void test2(char *p, int c, int len)
} }
/* Check that the right patterns are used. */ /* 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"?:10 .*{[*]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"?:16 .*{[*]setmem_long_and_?3?1?z?}} 1 { xfail *-*-* } } } */
#define LEN 500 #define LEN 500
char buf[LEN + 2]; char buf[LEN + 2];
......
...@@ -16,6 +16,9 @@ ...@@ -16,6 +16,9 @@
# GCC testsuite that uses the `dg.exp' driver. # 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. # Exit immediately if this isn't a s390 target.
if ![istarget s390*-*-*] then { if ![istarget s390*-*-*] then {
return return
...@@ -24,17 +27,6 @@ if ![istarget s390*-*-*] then { ...@@ -24,17 +27,6 @@ if ![istarget s390*-*-*] then {
# Load support procs. # Load support procs.
load_lib gcc-dg.exp 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 # Return 1 if the the assembler understands .machine and .machinemode. The
# target attribute needs that feature to work. # target attribute needs that feature to work.
proc check_effective_target_target_attribute { } { proc check_effective_target_target_attribute { } {
...@@ -78,6 +70,138 @@ proc check_effective_target_vector { } { ...@@ -78,6 +70,138 @@ proc check_effective_target_vector { } {
}] "-march=z13 -mzarch" ] } { return 0 } else { return 1 } }] "-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. # If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then { if ![info exists DEFAULT_CFLAGS] then {
...@@ -110,15 +234,27 @@ gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/hotpatch-\[0-9\]*.c]] \ ...@@ -110,15 +234,27 @@ gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/hotpatch-\[0-9\]*.c]] \
torture-finish torture-finish
# Additional md torture tests. # 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 torture-init
set MD_TEST_OPTS [list \ set MD_TEST_OPTS [list \
{-Os -march=z900} {-Os -march=z13} \ {-Os -march=z13} \
{-O0 -march=z900} {-O0 -march=z13} \ {-O0 -march=z13} \
{-O1 -march=z900} {-O1 -march=z13} \ {-O1 -march=z13} \
{-O2 -march=z900} {-O2 -march=z13} \ {-O2 -march=z13} \
{-O3 -march=z900} {-O3 -march=z13}] {-O3 -march=z13} ]
set-torture-options $MD_TEST_OPTS 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 torture-finish
# All done. # All done.
......
...@@ -533,6 +533,8 @@ proc gcc-dg-runtest { testcases flags default-extra-flags } { ...@@ -533,6 +533,8 @@ proc gcc-dg-runtest { testcases flags default-extra-flags } {
set nshort [file tail [file dirname $test]]/[file tail $test] set nshort [file tail [file dirname $test]]/[file tail $test]
foreach flags_t $option_list { foreach flags_t $option_list {
global torture_current_flags
set torture_current_flags "$flags_t"
verbose "Testing $nshort, $flags $flags_t" 1 verbose "Testing $nshort, $flags $flags_t" 1
dg-test $test "$flags $flags_t" ${default-extra-flags} dg-test $test "$flags $flags_t" ${default-extra-flags}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment