m68k: handle more cases of TLS symbols with offset

Message ID 87a7pwfwm8.fsf@igel.home
State New
Headers show
Series
  • m68k: handle more cases of TLS symbols with offset
Related show

Commit Message

Andreas Schwab Aug. 8, 2018, 8:10 p.m.
This is a better fix for PR target/46179.  There are more DImode insns
that call adjust_operand during output processing.  Instead of scanning
the insns in the FINAL_PRESCAN_INSN hook, adjust them directly before
they are output by print_operand or print_operand_address.

Andreas.

	PR target/46179
	* config/m68k/m68k.h (FINAL_PRESCAN_INSN): Don't define.
	* config/m68k/m68k.c (handle_move_double): Don't call
	m68k_final_prescan_insn.
	(m68k_adjust_decorated_operand): Renamed from
	m68k_final_prescan_insn, remove first and third operand and
	simplify.
	(print_operand): Call it.
	(print_operand_address): Call it.

	PR target/46179
	* gcc.target/m68k/tls-dimode.c: New file.
---
 gcc/ChangeLog                              | 12 ++++
 gcc/config/m68k/m68k.c                     | 66 ++++++++++------------
 gcc/config/m68k/m68k.h                     |  3 -
 gcc/testsuite/ChangeLog                    |  5 ++
 gcc/testsuite/gcc.target/m68k/tls-dimode.c | 15 +++++
 5 files changed, 62 insertions(+), 39 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/m68k/tls-dimode.c

Comments

Gunther Nikl Aug. 9, 2018, 11:01 a.m. | #1
Andreas Schwab <schwab@linux-m68k.org> wrote:
> -void
> -m68k_final_prescan_insn (rtx_insn *insn ATTRIBUTE_UNUSED,
> -			 rtx *operands, int n_operands)
> +static void
> +m68k_adjust_decorated_operand (rtx op)

FWIW, the prototype for m68k_final_prescan_insn in m68k-protos.h was
not removed.

Gunther
Andreas Schwab Aug. 9, 2018, 4:25 p.m. | #2
On Aug 09 2018, Gunther Nikl <gnikl@justmail.de> wrote:

> FWIW, the prototype for m68k_final_prescan_insn in m68k-protos.h was
> not removed.

Thanks, fixed.

Andreas.

	* config/m68k/m68k-protos.h (m68k_final_prescan_insn): Remove
	prototype.

diff --git a/gcc/config/m68k/m68k-protos.h b/gcc/config/m68k/m68k-protos.h
index 1f6a68f62b..f412db9b31 100644
--- a/gcc/config/m68k/m68k-protos.h
+++ b/gcc/config/m68k/m68k-protos.h
@@ -67,7 +67,6 @@ extern rtx m68k_function_value (const_tree, const_tree);
 extern int emit_move_sequence (rtx *, machine_mode, rtx);
 extern bool m68k_movem_pattern_p (rtx, rtx, HOST_WIDE_INT, bool);
 extern const char *m68k_output_movem (rtx *, rtx, HOST_WIDE_INT, bool);
-extern void m68k_final_prescan_insn (rtx_insn *, rtx *, int);
 extern bool m68k_epilogue_uses (int);
 
 /* Functions from m68k.c used in constraints.md.  */
Jeff Law Aug. 9, 2018, 5:19 p.m. | #3
On 08/09/2018 10:25 AM, Andreas Schwab wrote:
> On Aug 09 2018, Gunther Nikl <gnikl@justmail.de> wrote:
> 
>> FWIW, the prototype for m68k_final_prescan_insn in m68k-protos.h was
>> not removed.
> 
> Thanks, fixed.
> 
> Andreas.
> 
> 	* config/m68k/m68k-protos.h (m68k_final_prescan_insn): Remove
> 	prototype.
> 
> diff --git a/gcc/config/m68k/m68k-protos.h b/gcc/config/m68k/m68k-protos.h
> index 1f6a68f62b..f412db9b31 100644
> --- a/gcc/config/m68k/m68k-protos.h
> +++ b/gcc/config/m68k/m68k-protos.h
> @@ -67,7 +67,6 @@ extern rtx m68k_function_value (const_tree, const_tree);
>  extern int emit_move_sequence (rtx *, machine_mode, rtx);
>  extern bool m68k_movem_pattern_p (rtx, rtx, HOST_WIDE_INT, bool);
>  extern const char *m68k_output_movem (rtx *, rtx, HOST_WIDE_INT, bool);
> -extern void m68k_final_prescan_insn (rtx_insn *, rtx *, int);
>  extern bool m68k_epilogue_uses (int);
>  
>  /* Functions from m68k.c used in constraints.md.  */
> 
There's also an unused variable in m68k_adjust_decorated_operand which
causes bootstrap to fail.

/src/gcc/gcc/config/m68k/m68k.c: In function 'void
m68k_adjust_decorated_operand(rtx)':
/src/gcc/gcc/config/m68k/m68k.c:2337:7: error: unused variable 'i'
[-Werror=unused-variable]
   int i;
       ^
I'm committing the attached patch as an obvious fix.  The tester will
spin it overnight.



Jeff
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dfe1c7c8e0f..b215706ccfa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-09  Jeff Law  <law@redhat.com>
+
+	* config/m68k/m68k.c (m68k_adjust_decorated_operand): Remove
+	unused variable.
+
 2018-08-09  Andreas Schwab  <schwab@linux-m68k.org>
 
 	* config/m68k/m68k-protos.h (m68k_final_prescan_insn): Remove
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 303dfc1c0c9..ea4154583b1 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -2334,8 +2334,6 @@ m68k_unwrap_symbol (rtx orig, bool unwrap_reloc32_p)
 static void
 m68k_adjust_decorated_operand (rtx op)
 {
-  int i;
-
   /* Combine and, possibly, other optimizations may do good job
      converting
        (const (unspec [(symbol)]))

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 64704bcd6d..e8f65c9791 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@ 
+2018-08-08  Andreas Schwab  <schwab@linux-m68k.org>
+
+	PR target/46179
+	* config/m68k/m68k.h (FINAL_PRESCAN_INSN): Don't define.
+	* config/m68k/m68k.c (handle_move_double): Don't call
+	m68k_final_prescan_insn.
+	(m68k_adjust_decorated_operand): Renamed from
+	m68k_final_prescan_insn, remove first and third operand and
+	simplify.
+	(print_operand): Call it.
+	(print_operand_address): Call it.
+
 2018-08-08  Nathan Sidwell  <nathan@acm.org>
 
 	* diagnostic.c (diagnostic_report_current_module): Use
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 75a5a5b69b..303dfc1c0c 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -2329,11 +2329,10 @@  m68k_unwrap_symbol (rtx orig, bool unwrap_reloc32_p)
   return m68k_unwrap_symbol_1 (orig, unwrap_reloc32_p, NULL);
 }
 
-/* Prescan insn before outputing assembler for it.  */
+/* Adjust decorated address operand before outputing assembler for it.  */
 
-void
-m68k_final_prescan_insn (rtx_insn *insn ATTRIBUTE_UNUSED,
-			 rtx *operands, int n_operands)
+static void
+m68k_adjust_decorated_operand (rtx op)
 {
   int i;
 
@@ -2355,45 +2354,38 @@  m68k_final_prescan_insn (rtx_insn *insn ATTRIBUTE_UNUSED,
      to patch up anything outside of the operand.  */
 
   subrtx_var_iterator::array_type array;
-  for (i = 0; i < n_operands; ++i)
+  FOR_EACH_SUBRTX_VAR (iter, array, op, ALL)
     {
-      rtx op;
-
-      op = operands[i];
-
-      FOR_EACH_SUBRTX_VAR (iter, array, op, ALL)
+      rtx x = *iter;
+      if (m68k_unwrap_symbol (x, true) != x)
 	{
-	  rtx x = *iter;
-	  if (m68k_unwrap_symbol (x, true) != x)
-	    {
-	      rtx plus;
+	  rtx plus;
 
-	      gcc_assert (GET_CODE (x) == CONST);
-	      plus = XEXP (x, 0);
+	  gcc_assert (GET_CODE (x) == CONST);
+	  plus = XEXP (x, 0);
 
-	      if (GET_CODE (plus) == PLUS || GET_CODE (plus) == MINUS)
-		{
-		  rtx unspec;
-		  rtx addend;
+	  if (GET_CODE (plus) == PLUS || GET_CODE (plus) == MINUS)
+	    {
+	      rtx unspec;
+	      rtx addend;
 
-		  unspec = XEXP (plus, 0);
-		  gcc_assert (GET_CODE (unspec) == UNSPEC);
-		  addend = XEXP (plus, 1);
-		  gcc_assert (CONST_INT_P (addend));
+	      unspec = XEXP (plus, 0);
+	      gcc_assert (GET_CODE (unspec) == UNSPEC);
+	      addend = XEXP (plus, 1);
+	      gcc_assert (CONST_INT_P (addend));
 
-		  /* We now have all the pieces, rearrange them.  */
+	      /* We now have all the pieces, rearrange them.  */
 
-		  /* Move symbol to plus.  */
-		  XEXP (plus, 0) = XVECEXP (unspec, 0, 0);
+	      /* Move symbol to plus.  */
+	      XEXP (plus, 0) = XVECEXP (unspec, 0, 0);
 
-		  /* Move plus inside unspec.  */
-		  XVECEXP (unspec, 0, 0) = plus;
+	      /* Move plus inside unspec.  */
+	      XVECEXP (unspec, 0, 0) = plus;
 
-		  /* Move unspec to top level of const.  */
-		  XEXP (x, 0) = unspec;
-		}
-	      iter.skip_subrtxes ();
+	      /* Move unspec to top level of const.  */
+	      XEXP (x, 0) = unspec;
 	    }
+	  iter.skip_subrtxes ();
 	}
     }
 }
@@ -3496,7 +3488,6 @@  handle_move_double (rtx operands[2],
 
   /* Normal case: do the two words, low-numbered first.  */
 
-  m68k_final_prescan_insn (NULL, operands, 2);
   handle_movsi (operands);
 
   /* Do the middle one of the three words for long double */
@@ -3507,7 +3498,6 @@  handle_move_double (rtx operands[2],
       if (addreg1)
 	handle_reg_adjust (addreg1, 4);
 
-      m68k_final_prescan_insn (NULL, middlehalf, 2);
       handle_movsi (middlehalf);
     }
 
@@ -3518,7 +3508,6 @@  handle_move_double (rtx operands[2],
     handle_reg_adjust (addreg1, 4);
 
   /* Do that word.  */
-  m68k_final_prescan_insn (NULL, latehalf, 2);
   handle_movsi (latehalf);
 
   /* Undo the adds we just did.  */
@@ -4464,6 +4453,9 @@  floating_exact_log2 (rtx x)
 void
 print_operand (FILE *file, rtx op, int letter)
 {
+  if (op != NULL_RTX)
+    m68k_adjust_decorated_operand (op);
+
   if (letter == '.')
     {
       if (MOTOROLA)
@@ -4712,6 +4704,8 @@  print_operand_address (FILE *file, rtx addr)
 {
   struct m68k_address address;
 
+  m68k_adjust_decorated_operand (addr);
+
   if (!m68k_decompose_address (QImode, addr, true, &address))
     gcc_unreachable ();
 
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 506fa4e50e..29e9be2b9d 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -867,9 +867,6 @@  do { if (cc_prev_status.flags & CC_IN_68881)			\
   assemble_name ((FILE), (NAME)),		\
   fprintf ((FILE), ",%u\n", (int)(ROUNDED)))
 
-#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
-  m68k_final_prescan_insn (INSN, OPVEC, NOPERANDS)
-
 /* On the 68000, we use several CODE characters:
    '.' for dot needed in Motorola-style opcode names.
    '-' for an operand pushing on the stack:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 12f842592d..779b50f98e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2018-08-08  Andreas Schwab  <schwab@linux-m68k.org>
+
+	PR target/46179
+	* gcc.target/m68k/tls-dimode.c: New file.
+
 2018-08-08  Nathan Sidwell  <nathan@acm.org>
 
 	* c-c++-common/inc-from-1a.h, c-c++-common/inc-from-1b.h,
diff --git a/gcc/testsuite/gcc.target/m68k/tls-dimode.c b/gcc/testsuite/gcc.target/m68k/tls-dimode.c
new file mode 100644
index 0000000000..0bc59cd1d9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/m68k/tls-dimode.c
@@ -0,0 +1,15 @@ 
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } } */
+/* { dg-options "-w -O2" } */
+
+__thread long long ti;
+
+void f (void)
+{
+  ti++;
+}
+
+void g (long long x)
+{
+  ti = x;
+}