]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
sparc: Skip all empty assembly statements
authorDaniel Cederman <cederman@gaisler.com>
Fri, 16 Oct 2020 07:12:30 +0000 (09:12 +0200)
committerDaniel Hellstrom <daniel@gaisler.com>
Thu, 16 Sep 2021 11:05:48 +0000 (13:05 +0200)
This version detects multiple empty assembly statements in a row and also
detects non-memory barrier empty assembly statements (__asm__("")). It
can be used instead of next_active_insn().

gcc/ChangeLog:

* config/sparc/sparc.c (next_active_non_empty_insn): New function
that returns next active non empty assembly instruction.
(sparc_do_work_around_errata): Use new function.

gcc/config/sparc/sparc.c

index 49cee356a836c1723937719cba87bd0571c2c0ed..94061e111bdf7f60485bd444609e68099906109c 100644 (file)
@@ -1094,6 +1094,24 @@ load_insn_p (rtx_insn *insn)
    && GET_CODE (PATTERN (INSN)) != USE                                 \
    && GET_CODE (PATTERN (INSN)) != CLOBBER)
 
+rtx_insn *
+next_active_non_empty_insn (rtx_insn *insn)
+{
+  insn = next_active_insn (insn);
+
+  while (insn
+        && (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
+            || GET_CODE (PATTERN (insn)) == ASM_INPUT
+            || (USEFUL_INSN_P (insn)
+                && (asm_noperands (PATTERN (insn)) >= 0)
+                && !strcmp (decode_asm_operands (PATTERN (insn),
+                                                 NULL, NULL, NULL,
+                                                 NULL, NULL), ""))))
+    insn = next_active_insn (insn);
+
+  return insn;
+}
+
 static unsigned int
 sparc_do_work_around_errata (void)
 {
@@ -1151,7 +1169,7 @@ sparc_do_work_around_errata (void)
                emit_insn_before (gen_nop (), target);
            }
 
-         next = next_active_insn (insn);
+         next = next_active_non_empty_insn (insn);
          if (!next)
            break;
 
@@ -1254,23 +1272,12 @@ sparc_do_work_around_errata (void)
          rtx_insn *after;
          int i;
 
-         next = next_active_insn (insn);
+         next = next_active_non_empty_insn (insn);
          if (!next)
            break;
 
          for (after = next, i = 0; i < 2; i++)
            {
-             /* Skip empty assembly statements.  */
-             if ((GET_CODE (PATTERN (after)) == UNSPEC_VOLATILE)
-                 || (USEFUL_INSN_P (after)
-                     && (asm_noperands (PATTERN (after))>=0)
-                     && !strcmp (decode_asm_operands (PATTERN (after),
-                                                      NULL, NULL, NULL,
-                                                      NULL, NULL), "")))
-               after = next_active_insn (after);
-             if (!after)
-               break;
-
              /* If the insn is a branch, then it cannot be problematic.  */
              if (!NONJUMP_INSN_P (after)
                  || GET_CODE (PATTERN (after)) == SEQUENCE)
@@ -1295,7 +1302,7 @@ sparc_do_work_around_errata (void)
                      && (MEM_P (SET_DEST (set)) || mem_ref (SET_SRC (set))))
                    break;
 
-                 after = next_active_insn (after);
+                 after = next_active_non_empty_insn (after);
                  if (!after)
                    break;
                }