diff options
author | Oleg Endo <olegendo@gcc.gnu.org> | 2014-12-30 17:26:18 +0000 |
---|---|---|
committer | Oleg Endo <olegendo@gcc.gnu.org> | 2014-12-30 17:26:18 +0000 |
commit | 000525b2a33fa5c7cde6b9bf5fef826ceada7d1f (patch) | |
tree | 726fee498c25cdf0550c2ca908f01d5139332dd0 | |
parent | 7aa358f2fd55a9483c88fa22fea2f587a3b71995 (diff) | |
download | gcc-000525b2a33fa5c7cde6b9bf5fef826ceada7d1f.zip gcc-000525b2a33fa5c7cde6b9bf5fef826ceada7d1f.tar.gz gcc-000525b2a33fa5c7cde6b9bf5fef826ceada7d1f.tar.bz2 |
re PR target/53987 ([SH] Unnecessary zero-extensions)
gcc/testsuite/
PR target/53987
* gcc.target/sh/pr53987-1.c: New.
From-SVN: r219110
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sh/pr53987-1.c | 66 |
2 files changed, 71 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b91ac70..f72bb69 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-30 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/53987 + * gcc.target/sh/pr53987-1.c: New. + 2014-12-30 Jan Hubicka <hubicka@ucw.cz> * gcc.dg/ipa/inline-7.c: New testcase. diff --git a/gcc/testsuite/gcc.target/sh/pr53987-1.c b/gcc/testsuite/gcc.target/sh/pr53987-1.c new file mode 100644 index 0000000..a0394ac --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/pr53987-1.c @@ -0,0 +1,66 @@ +/* Check that no unnecessary sign/zero extensions are being emitted. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "extu.b" 2 } } */ +/* { dg-final { scan-assembler-not "extu.w" } } */ +/* { dg-final { scan-assembler-not "exts.b" } } */ +/* { dg-final { scan-assembler-not "exts.w" } } */ +/* { dg-final { scan-assembler-not "movu" } } */ +/* { dg-final { scan-assembler-not "tst\t#255" { xfail *-*-*} } } */ + +int +test_00 (unsigned char* x, char* xx, int y, int z) +{ + /* If x[0] / b is treated as a non-extended QImode subreg the zero + test will be a QImode subreg test, which is supposed to ignore + bits[31:8]. However, since the QImode memory load always sign + extends, it's also OK to test all the bits. Thus we don't want + to see a tst #255 here. */ + int b = x[0]; + xx[0] = b; + return b ? y : z; +} + +int +test_01 (unsigned char a, unsigned char b, int c, int d) +{ + /* 2x extu.b */ + if (a == b) + return c; + return d; +} + +int +test_02 (unsigned char* a, unsigned char* b, int c, int d) +{ + /* 2x mov.b */ + if (*a != 0 && *b == 0) + return c; + return d; +} + +int +test_03 (unsigned char* a) +{ + /* 1x mov.b */ + return *a == 0; +} + +int +test_04 (unsigned short* a) +{ + /* 1x mov.w */ + return *a == 0; +} + +unsigned char test_05_var; +int +test_05 (int a, int b, int c, int d) +{ + /* Must not see sign/zero extension here. */ + test_05_var = (a == b) | (b == c); + if (test_05_var) + return d; + + return 0; +} |