]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
x86_cse: Skip JUMP from asm goto
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 19 Jun 2026 12:05:56 +0000 (20:05 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 21 Jun 2026 11:24:47 +0000 (19:24 +0800)
Skip a single set of JUMP came from asm goto:

(jump_insn 9 2 111 2 (parallel [
            (set (reg:SI 134)
                (asm_operands/v:SI ("") ("=r") 0 []
                     []
                     [
                        (label_ref:DI 10)
                    ] x.c:6))
            (clobber (reg:CC 17 flags))
        ]) "x.c":6:3 -1
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil))
 -> 10)

when checking the broadcast source.

gcc/

PR target/125883
* config/i386/i386-features.cc (ix86_broadcast_inner): Skip JUMP
from asm goto.

gcc/testsuite/

PR target/125883
* gcc.target/i386/pr125883.c: New test.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
gcc/config/i386/i386-features.cc
gcc/testsuite/gcc.target/i386/pr125883.c [new file with mode: 0644]

index 23f8038bae8976e7b6ca4177a9d5f4ee82e2349b..aa16c7dc56c4d3bf39f3b7354c4ac3de86b37902 100644 (file)
@@ -4043,6 +4043,11 @@ ix86_broadcast_inner (rtx op, machine_mode mode,
     return nullptr;
 
   rtx_insn *insn = DF_REF_INSN (ref);
+
+  /* Skip JUMP which happens with asm goto.  */
+  if (JUMP_P (insn))
+    return nullptr;
+
   rtx set = single_set (insn);
   if (!set)
     return nullptr;
diff --git a/gcc/testsuite/gcc.target/i386/pr125883.c b/gcc/testsuite/gcc.target/i386/pr125883.c
new file mode 100644 (file)
index 0000000..fe44c62
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=x86-64" } */
+
+int a, b;
+int c[0], d[0];
+void
+foo (void)
+{
+  __asm__ goto("" : "=r"(a) : : : f);
+f:
+  for (; b; b++)
+    c[b] = d[b] = c[b] + a;
+}