[SPARC] Recognize the load when accessing the GOT
authorDaniel Cederman <cederman@gaisler.com>
Wed, 29 Nov 2017 15:45:41 +0000 (15:45 +0000)
committerDaniel Hellstrom <danielh@gcc.gnu.org>
Wed, 29 Nov 2017 15:45:41 +0000 (16:45 +0100)
Needed for the UT699 errata workaround to function correctly when
compiling with -fPIC.

2017-11-29  Daniel Cederman  <cederman@gaisler.com>

gcc/
* config/sparc/sparc.c (sparc_do_work_around_errata): Treat the
        movsi_pic_gotdata_op instruction as a load for the UT699 errata
        workaround.

From-SVN: r255239

gcc/ChangeLog
gcc/config/sparc/sparc.c

index a00174a3db86d643489182e8eae1c962c83ab8ea..19099451ed13db6794516343fd4a5a2eaf21b9b6 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-29  Daniel Cederman  <cederman@gaisler.com>
+
+       * config/sparc/sparc.c (sparc_do_work_around_errata): Treat the
+        movsi_pic_gotdata_op instruction as a load for the UT699 errata
+        workaround.
+
 2017-11-29  Martin Aberg  <maberg@gaisler.com>
 
        * config/sparc/sparc.md (divdf3_fix): Add NOP and adjust length
index 64c88de38fdf1421cd3bd1f757f5c09222a1f558..dac6483d2abf74a1c393add2b903c584bc32e1ff 100644 (file)
@@ -1321,7 +1321,8 @@ sparc_do_work_around_errata (void)
               && NONJUMP_INSN_P (insn)
               && (set = single_set (insn)) != NULL_RTX
               && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) <= 4
-              && mem_ref (SET_SRC (set)) != NULL_RTX
+              && (mem_ref (SET_SRC (set)) != NULL_RTX
+                  || INSN_CODE (insn) == CODE_FOR_movsi_pic_gotdata_op)
               && REG_P (SET_DEST (set))
               && REGNO (SET_DEST (set)) < 32)
        {
@@ -1359,6 +1360,11 @@ sparc_do_work_around_errata (void)
                               && REGNO (src) != REGNO (x)))
                       && !reg_mentioned_p (x, XEXP (dest, 0)))
                insert_nop = true;
+
+             /* GOT accesses uses LD.  */
+             else if (INSN_CODE (next) == CODE_FOR_movsi_pic_gotdata_op
+                      && !reg_mentioned_p (x, XEXP (XEXP (src, 0), 1)))
+               insert_nop = true;
            }
        }