Commit 3bcdbd50 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/59625 (asm goto and TARGET_FOUR_JUMP_LIMIT)

	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
parent cdc23b1b
2014-01-03 Jakub Jelinek <jakub@redhat.com> 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. * config/i386/i386.md (MODE_SIZE): New mode attribute.
(push splitter): Use <P:MODE_SIZE> instead of (push splitter): Use <P:MODE_SIZE> instead of
GET_MODE_SIZE (<P:MODE>mode). GET_MODE_SIZE (<P:MODE>mode).
......
...@@ -38825,7 +38825,10 @@ ix86_avoid_jump_mispredicts (void) ...@@ -38825,7 +38825,10 @@ ix86_avoid_jump_mispredicts (void)
The smallest offset in the page INSN can start is the case where START 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). 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). 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)) for (insn = start; insn; insn = NEXT_INSN (insn))
{ {
int min_size; int min_size;
...@@ -38852,7 +38855,8 @@ ix86_avoid_jump_mispredicts (void) ...@@ -38852,7 +38855,8 @@ ix86_avoid_jump_mispredicts (void)
while (nbytes + max_skip >= 16) while (nbytes + max_skip >= 16)
{ {
start = NEXT_INSN (start); 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; njumps--, isjump = 1;
else else
isjump = 0; isjump = 0;
...@@ -38867,7 +38871,8 @@ ix86_avoid_jump_mispredicts (void) ...@@ -38867,7 +38871,8 @@ ix86_avoid_jump_mispredicts (void)
if (dump_file) if (dump_file)
fprintf (dump_file, "Insn %i estimated to %i bytes\n", fprintf (dump_file, "Insn %i estimated to %i bytes\n",
INSN_UID (insn), min_size); 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++; njumps++;
else else
continue; continue;
...@@ -38875,7 +38880,8 @@ ix86_avoid_jump_mispredicts (void) ...@@ -38875,7 +38880,8 @@ ix86_avoid_jump_mispredicts (void)
while (njumps > 3) while (njumps > 3)
{ {
start = NEXT_INSN (start); 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; njumps--, isjump = 1;
else else
isjump = 0; isjump = 0;
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> 2014-01-03 Paolo Carlini <paolo.carlini@oracle.com>
Core DR 1442 Core DR 1442
......
/* 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment