PATCH: PR target/54445: TLS array lookup with negative constant is not combined into a single instruction

H.J. Lu hongjiu.lu@intel.com
Sun Sep 2 14:20:00 GMT 2012


Hi,

When x86-64 TLS support was added by:

http://gcc.gnu.org/ml/gcc-patches/2002-10/msg01262.html

it didn't allow negative offset.  Jakub, do you remember the reason for
it?  I tested this patch on Linux/x86-64 and used the new GCC to build
glibc for x86-64 and x32.  There are no regressions.  OK to install?

Thanks.


H.J.
----
gcc/

2012-09-02  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/54445
	* config/i386/predicates.md (x86_64_immediate_operand): Allow
	negative offset for UNSPEC_DTPOFF/UNSPEC_NTPOFF.

gcc/testsuite/
2012-09-02  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/54445
	* gcc.target/i386/pr54445-1.c: New file.
	* gcc.target/i386/pr54445-2.c: Likewise.

diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 55e4b56..159594e 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -228,8 +228,7 @@
 		{
 		case UNSPEC_DTPOFF:
 		case UNSPEC_NTPOFF:
-		  if (offset > 0
-		      && trunc_int_for_mode (offset, SImode) == offset)
+		  if (trunc_int_for_mode (offset, SImode) == offset)
 		    return true;
 		}
 	      break;
diff --git a/gcc/testsuite/gcc.target/i386/pr54445-1.c b/gcc/testsuite/gcc.target/i386/pr54445-1.c
new file mode 100644
index 0000000..72ef84e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr54445-1.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+__thread unsigned char tls_array[64];
+
+unsigned char
+__attribute__ ((noinline))
+tls_array_lookup_with_negative_constant(long long int position) {
+  return tls_array[position - 1];
+}
+
+int
+main ()
+{
+  int i;
+
+  for (i = 0; i < sizeof (tls_array) / sizeof (tls_array[0]); i++)
+    tls_array[i] = i;
+
+  for (i = 0; i < sizeof (tls_array) / sizeof (tls_array[0]); i++)
+    if (i != tls_array_lookup_with_negative_constant (i + 1))
+      __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr54445-2.c b/gcc/testsuite/gcc.target/i386/pr54445-2.c
new file mode 100644
index 0000000..5151c13
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr54445-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { *-*-linux* && { ! { ia32 } } } } } */
+/* { dg-options "-O2 -fno-pic" } */
+
+__thread unsigned char tls_array[64];
+
+unsigned char
+tls_array_lookup_with_negative_constant(long long int position) {
+  return tls_array[position - 1];
+}
+
+/* { dg-final { scan-assembler "mov(b|zbl)\[ \t\](%fs:)?tls_array@tpoff-1\\(%" } } */



More information about the Gcc-patches mailing list