Add new s390-specific tests that check if we convert two SETs into two loads on condition. Remove the s390-specific target-check in gcc.dg/ifcvt-4.c. --- gcc/testsuite/gcc.dg/ifcvt-4.c | 2 +- .../gcc.target/s390/ifcvt-two-insns-bool.c | 39 +++++++++++++++++++ .../gcc.target/s390/ifcvt-two-insns-int.c | 39 +++++++++++++++++++ .../gcc.target/s390/ifcvt-two-insns-long.c | 39 +++++++++++++++++++ 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/s390/ifcvt-two-insns-bool.c create mode 100644 gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c create mode 100644 gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c
diff --git a/gcc/testsuite/gcc.dg/ifcvt-4.c b/gcc/testsuite/gcc.dg/ifcvt-4.c index ec142cfd943..871ab950756 100644 --- a/gcc/testsuite/gcc.dg/ifcvt-4.c +++ b/gcc/testsuite/gcc.dg/ifcvt-4.c @@ -2,7 +2,7 @@ /* { dg-additional-options "-misel" { target { powerpc*-*-* } } } */ /* { dg-additional-options "-march=z196" { target { s390x-*-* } } } */ /* { dg-additional-options "-mtune-ctrl=^one_if_conv_insn" { target { i?86-*-* x86_64-*-* } } } */ -/* { dg-skip-if "Multiple set if-conversion not guaranteed on all subtargets" { "arm*-*-* avr-*-* hppa*64*-*-* s390-*-* visium-*-*" riscv*-*-* msp430-*-* } } */ +/* { dg-skip-if "Multiple set if-conversion not guaranteed on all subtargets" { "arm*-*-* avr-*-* hppa*64*-*-* visium-*-*" riscv*-*-* msp430-*-* } } */ /* { dg-skip-if "" { "s390x-*-*" } { "-m31" } } */ typedef int word __attribute__((mode(word))); diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-bool.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-bool.c new file mode 100644 index 00000000000..4415cb49f11 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-bool.c @@ -0,0 +1,39 @@ +/* Check if conversion for two instructions. */ + +/* { dg-do run } */ +/* { dg-options "-O2 -march=z13 --save-temps" } */ + +/* { dg-final { scan-assembler "lochinhe\t%r.?,1" } } */ +/* { dg-final { scan-assembler "locrnhe\t.*" } } */ +#include <stdbool.h> +#include <limits.h> +#include <stdio.h> +#include <assert.h> + +__attribute__ ((noinline)) +int foo (int *a, unsigned int n) +{ + int min = 999999; + bool bla = false; + for (int i = 0; i < n; i++) + { + if (a[i] < min) + { + min = a[i]; + bla = true; + } + } + + if (bla) + min += 1; + return min; +} + +int main() +{ + int a[] = {2, 1, -13, INT_MAX, INT_MIN, 0}; + + int res = foo (a, sizeof (a)); + + assert (res == (INT_MIN + 1)); +} diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c new file mode 100644 index 00000000000..db8df84cced --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c @@ -0,0 +1,39 @@ +/* Check if conversion for two instructions. */ + +/* { dg-do run } */ +/* { dg-options "-O2 -march=z13 --save-temps" } */ + +/* { dg-final { scan-assembler "lochinhe\t%r.?,1" } } */ +/* { dg-final { scan-assembler "locrnhe\t.*" } } */ +#include <stdbool.h> +#include <limits.h> +#include <stdio.h> +#include <assert.h> + +__attribute__ ((noinline)) +int foo (int *a, unsigned int n) +{ + int min = 999999; + int bla = 0; + for (int i = 0; i < n; i++) + { + if (a[i] < min) + { + min = a[i]; + bla = 1; + } + } + + if (bla) + min += 1; + return min; +} + +int main() +{ + int a[] = {2, 1, -13, INT_MAX, INT_MIN, 0}; + + int res = foo (a, sizeof (a)); + + assert (res == (INT_MIN + 1)); +} diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c new file mode 100644 index 00000000000..bee63328729 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c @@ -0,0 +1,39 @@ +/* Check if conversion for two instructions. */ + +/* { dg-do run } */ +/* { dg-options "-O2 -march=z13 --save-temps" } */ + +/* { dg-final { scan-assembler "locghinhe\t%r.?,1" } } */ +/* { dg-final { scan-assembler "locgrnhe\t.*" } } */ +#include <stdbool.h> +#include <limits.h> +#include <stdio.h> +#include <assert.h> + +__attribute__ ((noinline)) +long foo (long *a, unsigned long n) +{ + long min = 999999; + long bla = 0; + for (int i = 0; i < n; i++) + { + if (a[i] < min) + { + min = a[i]; + bla = 1; + } + } + + if (bla) + min += 1; + return min; +} + +int main() +{ + long a[] = {2, 1, -13, LONG_MAX, LONG_MIN, 0}; + + long res = foo (a, sizeof (a)); + + assert (res == (LONG_MIN + 1)); +} -- 2.31.1