re PR target/90193 (asm goto with TLS "m" input operand generates incorrect assembler...
authorJakub Jelinek <jakub@redhat.com>
Wed, 24 Apr 2019 15:49:36 +0000 (17:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 24 Apr 2019 15:49:36 +0000 (17:49 +0200)
PR target/90193
* rtl.c (classify_insn): Return JUMP_INSN for asm goto.
* emit-rtl.c (try_split): Copy over REG_LABEL_TARGET.

* gcc.target/i386/pr90193.c: New test.

From-SVN: r270550

gcc/ChangeLog
gcc/emit-rtl.c
gcc/rtl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr90193.c [new file with mode: 0644]

index 6d09649c1d01671e049d5e76c06af60cea3a9ae8..a8f5212aca582be1e85732de8bccf19f34c7719d 100644 (file)
@@ -1,3 +1,9 @@
+2019-04-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/90193
+       * rtl.c (classify_insn): Return JUMP_INSN for asm goto.
+       * emit-rtl.c (try_split): Copy over REG_LABEL_TARGET.
+
 2019-04-24  Andreas Krebbel  <krebbel@linux.ibm.com>
 
        PR target/89952
index 4b0aa7cee061a7778eeb760e561f3649ab735ead..15dffa58a2ee1f7d10df49185788c64847dc9c3d 100644 (file)
@@ -3940,6 +3940,7 @@ try_split (rtx pat, rtx_insn *trial, int last)
          break;
 
        case REG_NON_LOCAL_GOTO:
+       case REG_LABEL_TARGET:
          for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
            {
              if (JUMP_P (insn))
index 8a897777041f71241c5b32ec9dba9e5723041f47..d7b8e9877c38b1dd2a4eea2f84ae12a74ff0e3a9 100644 (file)
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -746,6 +746,8 @@ classify_insn (rtx x)
     return CALL_INSN;
   if (ANY_RETURN_P (x))
     return JUMP_INSN;
+  if (GET_CODE (x) == ASM_OPERANDS && ASM_OPERANDS_LABEL_VEC (x))
+    return JUMP_INSN;
   if (GET_CODE (x) == SET)
     {
       if (GET_CODE (SET_DEST (x)) == PC)
@@ -772,6 +774,9 @@ classify_insn (rtx x)
          return CALL_INSN;
       if (has_return_p)
        return JUMP_INSN;
+      if (GET_CODE (XVECEXP (x, 0, 0)) == ASM_OPERANDS
+         && ASM_OPERANDS_LABEL_VEC (XVECEXP (x, 0, 0)))
+       return JUMP_INSN;
     }
 #ifdef GENERATOR_FILE
   if (GET_CODE (x) == MATCH_OPERAND
index 6a34f20da3af65b8c1258f0ebbe3f3b44b8bae95..70ffb8d1e1e38d23da1f7b25d4bbec850f8dbb7e 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/90193
+       * gcc.target/i386/pr90193.c: New test.
+
 2019-04-24  Andreas Krebbel  <krebbel@linux.ibm.com>
 
        PR target/89952
diff --git a/gcc/testsuite/gcc.target/i386/pr90193.c b/gcc/testsuite/gcc.target/i386/pr90193.c
new file mode 100644 (file)
index 0000000..194cffe
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR target/90193 *
+/* { dg-do link } */
+/* { dg-options "-O1" } */
+/* { dg-require-effective-target tls } */
+
+__thread int var;
+
+static int
+foo (void)
+{
+  asm goto ("jmp %l[l]\n\t" : : "m" (var) : : l);
+  return 0;
+l:
+  return 1;
+}
+
+int
+main ()
+{
+  return foo ();
+}