Blame SOURCES/gcc34-pr21412.patch

6fdc0f
2005-05-07  Richard Henderson  <rth@redhat.com>
6fdc0f
6fdc0f
	PR target/21412
6fdc0f
	* config/rs6000/rs6000.c (rs6000_emit_move): Look for tls addresses
6fdc0f
	with constant offsets.
6fdc0f
6fdc0f
2004-07-11  Ulrich Weigand  <uweigand@de.ibm.com>
6fdc0f
6fdc0f
	* config/s390/s390.c (legitimize_tls_address): Handle constant offsets
6fdc0f
	added to TLS symbol addresses.
6fdc0f
6fdc0f
2004-07-06  Richard Henderson  <rth@redhat.com>
6fdc0f
6fdc0f
	* config/i386/i386.c (legitimize_address): Handle CONST with TLS
6fdc0f
	operand.
6fdc0f
	(ix86_expand_move): Don't call legitimize_pic_address directly.
6fdc0f
6fdc0f
2006-05-05  Jakub Jelinek  <jakub@redhat.com>
6fdc0f
6fdc0f
	* gcc.dg/tls/opt-12.c: New test.
6fdc0f
6fdc0f
--- gcc/config/s390/s390.c	(revision 84404)
6fdc0f
+++ gcc/config/s390/s390.c	(revision 84535)
6fdc0f
@@ -2913,6 +2913,18 @@ legitimize_tls_address (rtx addr, rtx re
6fdc0f
 	}
6fdc0f
     }
6fdc0f
 
6fdc0f
+  else if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
6fdc0f
+	   && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
6fdc0f
+    {
6fdc0f
+      new = XEXP (XEXP (addr, 0), 0);
6fdc0f
+      if (GET_CODE (new) != SYMBOL_REF)
6fdc0f
+	new = gen_rtx_CONST (Pmode, new);
6fdc0f
+
6fdc0f
+      new = legitimize_tls_address (new, reg);
6fdc0f
+      new = plus_constant (new, INTVAL (XEXP (XEXP (addr, 0), 1)));
6fdc0f
+      new = force_operand (new, 0);
6fdc0f
+    }
6fdc0f
+
6fdc0f
   else
6fdc0f
     abort ();  /* for now ... */
6fdc0f
 
6fdc0f
--- gcc/config/i386/i386.c	2005-11-21 14:56:49.000000000 +0100
6fdc0f
+++ gcc/config/i386/i386.c	2006-05-05 11:21:54.000000000 +0200
6fdc0f
@@ -6604,6 +6604,13 @@ legitimize_address (rtx x, rtx oldx ATTR
6fdc0f
   log = tls_symbolic_operand (x, mode);
6fdc0f
   if (log)
6fdc0f
     return legitimize_tls_address (x, log, false);
6fdc0f
+  if (GET_CODE (x) == CONST
6fdc0f
+      && GET_CODE (XEXP (x, 0)) == PLUS
6fdc0f
+      && (log = tls_symbolic_operand (XEXP (XEXP (x, 0), 0), Pmode)))
6fdc0f
+    {
6fdc0f
+      rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0), log, false);
6fdc0f
+      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
6fdc0f
+    }
6fdc0f
 
6fdc0f
   if (flag_pic && SYMBOLIC_CONST (x))
6fdc0f
     return legitimize_pic_address (x, 0);
6fdc0f
@@ -8395,6 +8402,10 @@ ix86_expand_move (enum machine_mode mode
6fdc0f
 #else
6fdc0f
       if (GET_CODE (op0) == MEM)
6fdc0f
 	op1 = force_reg (Pmode, op1);
6fdc0f
+      else if (GET_CODE (op1) == CONST
6fdc0f
+	       && GET_CODE (XEXP (op1, 0)) == PLUS
6fdc0f
+	       && tls_symbolic_operand (XEXP (XEXP (op1, 0), 0), Pmode))
6fdc0f
+	op1 = legitimize_address (op1, op1, Pmode);
6fdc0f
       else
6fdc0f
 	{
6fdc0f
 	  rtx temp = op0;
6fdc0f
--- gcc/config/rs6000/rs6000.c	(revision 99334)
6fdc0f
+++ gcc/config/rs6000/rs6000.c	(revision 99367)
6fdc0f
@@ -4436,11 +4436,31 @@ rs6000_emit_move (rtx dest, rtx source, 
6fdc0f
 
6fdc0f
   /* Recognize the case where operand[1] is a reference to thread-local
6fdc0f
      data and load its address to a register.  */
6fdc0f
-  if (GET_CODE (operands[1]) == SYMBOL_REF)
6fdc0f
+  if (rs6000_tls_referenced_p (operands[1]))
6fdc0f
     {
6fdc0f
-      enum tls_model model = SYMBOL_REF_TLS_MODEL (operands[1]);
6fdc0f
-      if (model != 0)
6fdc0f
-	operands[1] = rs6000_legitimize_tls_address (operands[1], model);
6fdc0f
+      enum tls_model model;
6fdc0f
+      rtx tmp = operands[1];
6fdc0f
+      rtx addend = NULL;
6fdc0f
+
6fdc0f
+      if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
6fdc0f
+	{
6fdc0f
+          addend = XEXP (XEXP (tmp, 0), 1);
6fdc0f
+	  tmp = XEXP (XEXP (tmp, 0), 0);
6fdc0f
+	}
6fdc0f
+
6fdc0f
+      if (GET_CODE (tmp) != SYMBOL_REF)
6fdc0f
+	abort ();
6fdc0f
+      model = SYMBOL_REF_TLS_MODEL (tmp);
6fdc0f
+      if (model == 0)
6fdc0f
+	abort ();
6fdc0f
+
6fdc0f
+      tmp = rs6000_legitimize_tls_address (tmp, model);
6fdc0f
+      if (addend)
6fdc0f
+	{
6fdc0f
+	  tmp = gen_rtx_PLUS (mode, tmp, addend);
6fdc0f
+	  tmp = force_operand (tmp, operands[0]);
6fdc0f
+	}
6fdc0f
+      operands[1] = tmp;
6fdc0f
     }
6fdc0f
 
6fdc0f
   /* Handle the case where reload calls us with an invalid address.  */
6fdc0f
--- gcc/testsuite/gcc.dg/tls/opt-9.c	(revision 0)
6fdc0f
+++ gcc/testsuite/gcc.dg/tls/opt-9.c	(revision 99367)
6fdc0f
@@ -0,0 +1,7 @@
6fdc0f
+/* PR 21412 */
6fdc0f
+/* { dg-do compile */
6fdc0f
+/* { dg-options "-O2 -fPIC" } */
6fdc0f
+
6fdc0f
+struct S { int x[10]; };
6fdc0f
+extern __thread struct S s;
6fdc0f
+int *foo() { return &s.x[2]; }
6fdc0f
--- gcc/testsuite/gcc.dg/tls/opt-12.c	2006-04-19 19:21:31.748476000 +0200
6fdc0f
+++ gcc/testsuite/gcc.dg/tls/opt-12.c	2006-05-05 11:01:33.000000000 +0200
6fdc0f
@@ -0,0 +1,16 @@
6fdc0f
+/* { dg-do compile } */
6fdc0f
+/* { dg-options "-O2" } */
6fdc0f
+/* { XXdgXX-require-effective-target tls } */
6fdc0f
+
6fdc0f
+__thread struct
6fdc0f
+{
6fdc0f
+  int a;
6fdc0f
+  char b[32];
6fdc0f
+} thr;
6fdc0f
+
6fdc0f
+int
6fdc0f
+main ()
6fdc0f
+{
6fdc0f
+  __builtin_strcpy (thr.b, "abcd");
6fdc0f
+  return 0;
6fdc0f
+}