aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Endo <olegendo@gcc.gnu.org>2014-12-30 17:26:18 +0000
committerOleg Endo <olegendo@gcc.gnu.org>2014-12-30 17:26:18 +0000
commit000525b2a33fa5c7cde6b9bf5fef826ceada7d1f (patch)
tree726fee498c25cdf0550c2ca908f01d5139332dd0
parent7aa358f2fd55a9483c88fa22fea2f587a3b71995 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/sh/pr53987-1.c66
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;
+}