re PR target/59003 (profiledbootstrap miscompiles gcc during stagefeedback --with-tune=amdfam10)

PR target/59003
	* config/i386/i386.c (expand_small_movmem_or_setmem): If mode is
	smaller than size, perform several stores or loads and stores
	at dst + count - size to store or copy all of size bytes, rather
	than just last modesize bytes.

	* gcc.dg/tree-prof/pr59003.c: New test.

From-SVN: r206896
This commit is contained in:
Jakub Jelinek 2014-01-21 20:12:06 +01:00 committed by Jakub Jelinek
parent 800d8bd547
commit f8ea7cb08d
4 changed files with 54 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2014-01-21 Jakub Jelinek <jakub@redhat.com>
PR target/59003
* config/i386/i386.c (expand_small_movmem_or_setmem): If mode is
smaller than size, perform several stores or loads and stores
at dst + count - size to store or copy all of size bytes, rather
than just last modesize bytes.
2014-01-20 DJ Delorie <dj@redhat.com>
* config/rl78/rl78.c (rl78_propogate_register_origins): Verify

View file

@ -23397,16 +23397,24 @@ expand_small_movmem_or_setmem (rtx destmem, rtx srcmem,
}
destmem = offset_address (destmem, count, 1);
destmem = offset_address (destmem, GEN_INT (-size - GET_MODE_SIZE (mode)),
destmem = offset_address (destmem, GEN_INT (-2 * size),
GET_MODE_SIZE (mode));
if (issetmem)
emit_move_insn (destmem, gen_lowpart (mode, value));
else
if (!issetmem)
{
srcmem = offset_address (srcmem, count, 1);
srcmem = offset_address (srcmem, GEN_INT (-size - GET_MODE_SIZE (mode)),
srcmem = offset_address (srcmem, GEN_INT (-2 * size),
GET_MODE_SIZE (mode));
emit_move_insn (destmem, srcmem);
}
for (n = 0; n * GET_MODE_SIZE (mode) < size; n++)
{
if (issetmem)
emit_move_insn (destmem, gen_lowpart (mode, value));
else
{
emit_move_insn (destmem, srcmem);
srcmem = offset_address (srcmem, modesize, GET_MODE_SIZE (mode));
}
destmem = offset_address (destmem, modesize, GET_MODE_SIZE (mode));
}
emit_jump_insn (gen_jump (done_label));
emit_barrier ();

View file

@ -1,5 +1,8 @@
2014-01-21 Jakub Jelinek <jakub@redhat.com>
PR target/59003
* gcc.dg/tree-prof/pr59003.c: New test.
PR middle-end/59860
* gcc.dg/strlenopt-4.c: Expect the same counts on s390*-* as on all
other targets.

View file

@ -0,0 +1,29 @@
/* PR target/59003 */
/* { dg-options "-O2" } */
/* { dg-options "-O2 -mtune=amdfam10" { target i?86-*-* x86_64-*-* } } */
__attribute__((noinline, noclone)) void *
foo (void *p, unsigned int q)
{
return __builtin_memset (p, 0, q * 4UL);
}
char buf[128] __attribute__((aligned (32)));
int
main ()
{
int i;
for (i = 0; i < 100000; i++)
foo (buf + 4, 1 + (i & 1));
for (i = 0; i < 128; i++)
{
buf[i] = 'X';
asm volatile ("" : : : "memory");
}
foo (buf + 32, 7);
for (i = 0; i < 128; i++)
if (buf[i] != ((i < 32 || i >= 32 + 28) ? 'X' : 0))
__builtin_abort ();
return 0;
}