[ARC] Fix legitimize pic address.

Message ID 20191022081014.15747-1-claziss@gmail.com
State New
Headers show
Series
  • [ARC] Fix legitimize pic address.
Related show

Commit Message

Claudiu Zissulescu Oct. 22, 2019, 8:10 a.m.
Hi Andrew,

There are cases when an pic address gets complicated, and it needs to
be resolved via force_reg function found in
prepare_move_operands. When this happens, we need to disambiguate the
pic address and re-legitimize it. Testcase added as well.

The patch needs to be applied to trunk and gcc9 branch as well.

OK to apply?
Claudiu

gcc/
xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc.c (arc_legitimize_pic_address): Consider UNSPECs
	as well, if interesting recover the symbol and re-legitimize the
	pic address.

gcc/testsuite/
xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

	* gcc.target/arc/pic-2.c: New file.
---
 gcc/config/arc/arc.c                 | 16 ++++++++++++++++
 gcc/testsuite/gcc.target/arc/pic-2.c | 23 +++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/arc/pic-2.c

-- 
2.21.0

Comments

Jeff Law Oct. 28, 2019, 7:23 p.m. | #1
On 10/22/19 2:10 AM, Claudiu Zissulescu wrote:
> Hi Andrew,

> 

> There are cases when an pic address gets complicated, and it needs to

> be resolved via force_reg function found in

> prepare_move_operands. When this happens, we need to disambiguate the

> pic address and re-legitimize it. Testcase added as well.

> 

> The patch needs to be applied to trunk and gcc9 branch as well.

> 

> OK to apply?

> Claudiu

> 

> gcc/

> xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

> 

> 	* config/arc/arc.c (arc_legitimize_pic_address): Consider UNSPECs

> 	as well, if interesting recover the symbol and re-legitimize the

> 	pic address.

> 

> gcc/testsuite/

> xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

> 

> 	* gcc.target/arc/pic-2.c: New file.

OK
jeff

Patch

diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 8e9db4c652d..0e838910e9d 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -6234,6 +6234,22 @@  arc_legitimize_pic_address (rtx addr)
 
   switch (GET_CODE (addr))
     {
+    case UNSPEC:
+      /* Can be one or our GOT or GOTOFFPC unspecs.  This situation
+	 happens when an address is not a legitimate constant and we
+	 need the resolve it via force_reg in
+	 prepare_move_operands.  */
+      switch (XINT (addr, 1))
+	{
+	case ARC_UNSPEC_GOT:
+	case ARC_UNSPEC_GOTOFFPC:
+	  /* Recover the symbol ref.  */
+	  addr = XVECEXP (addr, 0, 0);
+	  break;
+	default:
+	  return addr;
+	}
+      /* Fall through.  */
     case SYMBOL_REF:
       /* TLS symbols are handled in different place.  */
       if (SYMBOL_REF_TLS_MODEL (addr))
diff --git a/gcc/testsuite/gcc.target/arc/pic-2.c b/gcc/testsuite/gcc.target/arc/pic-2.c
new file mode 100644
index 00000000000..fed20e0a84c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/pic-2.c
@@ -0,0 +1,23 @@ 
+/* { dg-do compile } */
+/* { dg-skip-if "PIC not available for ARC6xx" { arc6xx } } */
+/* { dg-options "-mno-sdata -O2 -fpic" } */
+
+/* Check if we resolve correctly complex PIC addresses.  */
+
+char *foo (unsigned size)
+{
+  static char buf[32];
+  register int i;
+
+  if (size > 31)
+    size = 31;
+
+  for (i = 0; i < size; i++)
+    {
+      buf[i] = ' ';
+    }
+  buf[size] = '\0';
+  return buf;
+}
+
+/* { dg-final { scan-assembler "@buf.\[0-9\]\+@pcl-1" } } */