[ARC] Fix legitimize pic address.
authorClaudiu Zissulescu <claziss@gmail.com>
Mon, 11 Nov 2019 15:40:09 +0000 (15:40 +0000)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Mon, 11 Nov 2019 15:40:09 +0000 (16:40 +0100)
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.

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.

From-SVN: r278056

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/pic-2.c [new file with mode: 0644]

index 9595b769839c5abf565e697a6f9b88dd31085274..ff62a22d1ef3068e158527a0dca41b4b1db6ac63 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-11  Claudiu Zissulescu <claziss@gmail.com>
+
+       * config/arc/arc.c (arc_legitimize_pic_address): Consider UNSPECs
+       as well, if interesting recover the symbol and re-legitimize the
+       pic address.
+
 2019-11-11  Martin Liska  <mliska@suse.cz>
 
        * dbgcnt.def (DEBUG_COUNTER): Sort counters
index e8f4133b3383bb247cdd75d0c52c24c0fbbed4c6..c2d38dd0d583c94df8b43356c0d17e7a6bd1804e 100644 (file)
@@ -6219,6 +6219,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))
index ebdf61161ee97580096fdbdde902ac0a76ac301a..06d98511d0de090dae05f6a3113f675bf9b4e550 100644 (file)
@@ -1,3 +1,7 @@
+2019-11-11  Claudiu Zissulescu <claziss@gmail.com>
+
+       * gcc.target/arc/pic-2.c: New file.
+
 2019-11-11  Tobias Burnus  <tobias@codesourcery.com>
            Mark Eggleston  <mark.eggleston@codethink.com>
 
diff --git a/gcc/testsuite/gcc.target/arc/pic-2.c b/gcc/testsuite/gcc.target/arc/pic-2.c
new file mode 100644 (file)
index 0000000..4b0e171
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-skip-if "PIC not available for ARC6xx" { arc6xx } } */
+/* { dg-options "-mno-sdata -O2 -fpic -fno-builtin" } */
+
+/* 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" } } */