re PR target/59625 (asm goto and TARGET_FOUR_JUMP_LIMIT)
authorJakub Jelinek <jakub@redhat.com>
Fri, 3 Jan 2014 12:22:17 +0000 (13:22 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 3 Jan 2014 12:22:17 +0000 (13:22 +0100)
PR target/59625
* config/i386/i386.c (ix86_avoid_jump_mispredicts): Don't consider
asm goto as jump.

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

From-SVN: r206314

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr59625.c [new file with mode: 0644]

index e4d71d7..09639d3 100644 (file)
@@ -1,5 +1,9 @@
 2014-01-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/59625
+       * config/i386/i386.c (ix86_avoid_jump_mispredicts): Don't consider
+       asm goto as jump.
+
        * config/i386/i386.md (MODE_SIZE): New mode attribute.
        (push splitter): Use <P:MODE_SIZE> instead of
        GET_MODE_SIZE (<P:MODE>mode).
index 637ea65..d2f5b6e 100644 (file)
@@ -38825,7 +38825,10 @@ ix86_avoid_jump_mispredicts (void)
      The smallest offset in the page INSN can start is the case where START
      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
-     */
+
+     Don't consider asm goto as jump, while it can contain a jump, it doesn't
+     have to, control transfer to label(s) can be performed through other
+     means, and also we estimate minimum length of all asm stmts as 0.  */
   for (insn = start; insn; insn = NEXT_INSN (insn))
     {
       int min_size;
@@ -38852,7 +38855,8 @@ ix86_avoid_jump_mispredicts (void)
              while (nbytes + max_skip >= 16)
                {
                  start = NEXT_INSN (start);
-                 if (JUMP_P (start) || CALL_P (start))
+                 if ((JUMP_P (start) && asm_noperands (PATTERN (start)) < 0)
+                     || CALL_P (start))
                    njumps--, isjump = 1;
                  else
                    isjump = 0;
@@ -38867,7 +38871,8 @@ ix86_avoid_jump_mispredicts (void)
       if (dump_file)
        fprintf (dump_file, "Insn %i estimated to %i bytes\n",
                 INSN_UID (insn), min_size);
-      if (JUMP_P (insn) || CALL_P (insn))
+      if ((JUMP_P (insn) && asm_noperands (PATTERN (insn)) < 0)
+         || CALL_P (insn))
        njumps++;
       else
        continue;
@@ -38875,7 +38880,8 @@ ix86_avoid_jump_mispredicts (void)
       while (njumps > 3)
        {
          start = NEXT_INSN (start);
-         if (JUMP_P (start) || CALL_P (start))
+         if ((JUMP_P (start) && asm_noperands (PATTERN (start)) < 0)
+             || CALL_P (start))
            njumps--, isjump = 1;
          else
            isjump = 0;
index 0950914..49b55f8 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/59625
+       * gcc.target/i386/pr59625.c: New test.
+
 2014-01-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        Core DR 1442
diff --git a/gcc/testsuite/gcc.target/i386/pr59625.c b/gcc/testsuite/gcc.target/i386/pr59625.c
new file mode 100644 (file)
index 0000000..8e1a779
--- /dev/null
@@ -0,0 +1,36 @@
+/* PR target/59625 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mtune=atom" } */
+
+int
+foo (void)
+{
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  asm goto ("" : : : : lab);
+  return 0;
+lab:
+  return 1;
+}
+
+/* Verify we don't consider asm goto as a jump for four jumps limit
+   optimization.  asm goto doesn't have to contain a jump at all,
+   the branching to labels can happen through different means.  */
+/* { dg-final { scan-assembler-not "(p2align\[^\n\r\]*\[\n\r]*\[^\n\r\]*){8}p2align" } } */