diff mbox

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

Message ID 20120902142021.GA32216@intel.com
State New
Headers show

Commit Message

H.J. Lu Sept. 2, 2012, 2:20 p.m. UTC
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.

Comments

H.J. Lu Sept. 12, 2012, 5:17 p.m. UTC | #1
On Sun, Sep 2, 2012 at 7:20 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> 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\\(%" } } */

Hi Uros,

Is this OK?

Thanks.
Uros Bizjak Sept. 12, 2012, 6 p.m. UTC | #2
On Wed, Sep 12, 2012 at 7:17 PM, H.J. Lu <hjl.tools@gmail.com> wrote:

>> 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?
>
>> 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.

The spec does not require positive offsets, and truncations will be
detected by the linker anyway.

So, looks OK to me.

Thanks,
Uros.
diff mbox

Patch

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\\(%" } } */