re PR target/53987 ([SH] Unnecessary zero-extensions)
authorOleg Endo <olegendo@gcc.gnu.org>
Tue, 30 Dec 2014 17:26:18 +0000 (17:26 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Tue, 30 Dec 2014 17:26:18 +0000 (17:26 +0000)
gcc/testsuite/
PR target/53987
* gcc.target/sh/pr53987-1.c: New.

From-SVN: r219110

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/pr53987-1.c [new file with mode: 0644]

index b91ac70..f72bb69 100644 (file)
@@ -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 (file)
index 0000000..a0394ac
--- /dev/null
@@ -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;
+}