Commit aa940f7c by Vladimir Makarov Committed by Vladimir Makarov

re PR middle-end/58418 (wrong code at -O2 and -O3 on x86_64-linux-gnu (in 32-bit mode))

2013-09-16  Vladimir Makarov  <vmakarov@redhat.com>

	PR middle-end/58418
	* lra-constraints.c (undo_optional_reloads): Consider all optional
	reload even if it did not get a hard reg.

2013-09-16  Vladimir Makarov  <vmakarov@redhat.com>

	* gcc.target/i386/pr58418.c: New.

From-SVN: r202630
parent e645e942
2013-09-16 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/58418
* lra-constraints.c (undo_optional_reloads): Consider all optional
reload even if it did not get a hard reg.
2013-09-16 Teresa Johnson <tejohnson@google.com> 2013-09-16 Teresa Johnson <tejohnson@google.com>
* dumpfile.c (dump_loc): Remove newline emission. * dumpfile.c (dump_loc): Remove newline emission.
......
...@@ -5454,43 +5454,42 @@ undo_optional_reloads (void) ...@@ -5454,43 +5454,42 @@ undo_optional_reloads (void)
bitmap_initialize (&removed_optional_reload_pseudos, &reg_obstack); bitmap_initialize (&removed_optional_reload_pseudos, &reg_obstack);
bitmap_copy (&removed_optional_reload_pseudos, &lra_optional_reload_pseudos); bitmap_copy (&removed_optional_reload_pseudos, &lra_optional_reload_pseudos);
EXECUTE_IF_SET_IN_BITMAP (&lra_optional_reload_pseudos, 0, regno, bi) EXECUTE_IF_SET_IN_BITMAP (&lra_optional_reload_pseudos, 0, regno, bi)
if (reg_renumber[regno] >= 0) {
{ keep_p = false;
keep_p = false; if (reg_renumber[lra_reg_info[regno].restore_regno] >= 0)
if (reg_renumber[lra_reg_info[regno].restore_regno] >= 0) /* If the original pseudo changed its allocation, just
/* If the original pseudo changed its allocation, just removing the optional pseudo is dangerous as the original
removing the optional pseudo is dangerous as the original pseudo will have longer live range. */
pseudo will have longer live range. */ keep_p = true;
keep_p = true; else if (reg_renumber[regno] >= 0)
else EXECUTE_IF_SET_IN_BITMAP (&lra_reg_info[regno].insn_bitmap, 0, uid, bi2)
EXECUTE_IF_SET_IN_BITMAP (&lra_reg_info[regno].insn_bitmap, 0, uid, bi2)
{
insn = lra_insn_recog_data[uid]->insn;
if ((set = single_set (insn)) == NULL_RTX)
continue;
src = SET_SRC (set);
dest = SET_DEST (set);
if (! REG_P (src) || ! REG_P (dest))
continue;
if (REGNO (dest) == regno
/* Ignore insn for optional reloads itself. */
&& lra_reg_info[regno].restore_regno != (int) REGNO (src)
/* Check only inheritance on last inheritance pass. */
&& (int) REGNO (src) >= new_regno_start
/* Check that the optional reload was inherited. */
&& bitmap_bit_p (&lra_inheritance_pseudos, REGNO (src)))
{
keep_p = true;
break;
}
}
if (keep_p)
{ {
bitmap_clear_bit (&removed_optional_reload_pseudos, regno); insn = lra_insn_recog_data[uid]->insn;
if (lra_dump_file != NULL) if ((set = single_set (insn)) == NULL_RTX)
fprintf (lra_dump_file, "Keep optional reload reg %d\n", regno); continue;
src = SET_SRC (set);
dest = SET_DEST (set);
if (! REG_P (src) || ! REG_P (dest))
continue;
if (REGNO (dest) == regno
/* Ignore insn for optional reloads itself. */
&& lra_reg_info[regno].restore_regno != (int) REGNO (src)
/* Check only inheritance on last inheritance pass. */
&& (int) REGNO (src) >= new_regno_start
/* Check that the optional reload was inherited. */
&& bitmap_bit_p (&lra_inheritance_pseudos, REGNO (src)))
{
keep_p = true;
break;
}
} }
} if (keep_p)
{
bitmap_clear_bit (&removed_optional_reload_pseudos, regno);
if (lra_dump_file != NULL)
fprintf (lra_dump_file, "Keep optional reload reg %d\n", regno);
}
}
change_p = ! bitmap_empty_p (&removed_optional_reload_pseudos); change_p = ! bitmap_empty_p (&removed_optional_reload_pseudos);
bitmap_initialize (&insn_bitmap, &reg_obstack); bitmap_initialize (&insn_bitmap, &reg_obstack);
EXECUTE_IF_SET_IN_BITMAP (&removed_optional_reload_pseudos, 0, regno, bi) EXECUTE_IF_SET_IN_BITMAP (&removed_optional_reload_pseudos, 0, regno, bi)
......
2013-09-16 Vladimir Makarov <vmakarov@redhat.com>
* gcc.target/i386/pr58418.c: New.
2013-09-16 James Greenhalgh <james.greenhalgh@arm.com> 2013-09-16 James Greenhalgh <james.greenhalgh@arm.com>
* gcc.target/aarch64/fmla-intrinsic.c: New. * gcc.target/aarch64/fmla-intrinsic.c: New.
......
/* { dg-do run } */
/* { dg-options "-O2" } */
extern void abort (void);
int a, b, *c = &b, d = -1, e, f, *g, *h = &f, **i = &g, j;
unsigned int
foo (unsigned int p)
{
return p == 0 ? 0 : 1 / p;
}
static int *
bar ()
{
*c = *h = foo (d) & (-9 < d);
for (e = 0; e; e++)
;
return 0;
}
int
main ()
{
for (; j; j++)
for (;; a--)
;
*i = bar ();
if (f != 0)
abort ();
return 0;
}
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