diff options
author | Bernd Schmidt <bernds@redhat.com> | 2017-03-10 21:17:13 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2017-03-10 21:17:13 +0000 |
commit | 8f2f63816095c764ff6440e4c44b9cc01a649920 (patch) | |
tree | 4b90adb93c4355bfc4ed7065d057804ccc5e3e4a /gcc/lra-assigns.c | |
parent | c7aee4a15c4b993b063a8a94d1b6e2825130ea72 (diff) |
re PR rtl-optimization/78911 (Infinite loop at -O2/O3 optimization levels while trying to compile server.c from Wine-2.0-rc2)
PR rtl-optimization/78911
* lra-assigns.c (must_not_spill_p): New function.
(spill_for): Use it.
PR rtl-optimization/78911
* gcc.target/i386/pr78911-1.c: New test.
* gcc.target/i386/pr78911-2.c: New test.
From-SVN: r246059
Diffstat (limited to 'gcc/lra-assigns.c')
-rw-r--r-- | gcc/lra-assigns.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c index 0ccd42546b7..226601bf2e6 100644 --- a/gcc/lra-assigns.c +++ b/gcc/lra-assigns.c @@ -889,6 +889,30 @@ assign_temporarily (int regno, int hard_regno) live_pseudos_reg_renumber[regno] = hard_regno; } +/* Return true iff there is a reason why pseudo SPILL_REGNO should not + be spilled. */ +static bool +must_not_spill_p (unsigned spill_regno) +{ + if ((pic_offset_table_rtx != NULL + && spill_regno == REGNO (pic_offset_table_rtx)) + || ((int) spill_regno >= lra_constraint_new_regno_start + && ! bitmap_bit_p (&lra_inheritance_pseudos, spill_regno) + && ! bitmap_bit_p (&lra_split_regs, spill_regno) + && ! bitmap_bit_p (&lra_subreg_reload_pseudos, spill_regno) + && ! bitmap_bit_p (&lra_optional_reload_pseudos, spill_regno))) + return true; + /* A reload pseudo that requires a singleton register class should + not be spilled. + FIXME: this mitigates the issue on certain i386 patterns, but + does not solve the general case where existing reloads fully + cover a limited register class. */ + if (!bitmap_bit_p (&non_reload_pseudos, spill_regno) + && reg_class_size [reg_preferred_class (spill_regno)] == 1) + return true; + return false; +} + /* Array used for sorting reload pseudos for subsequent allocation after spilling some pseudo. */ static int *sorted_reload_pseudos; @@ -960,13 +984,7 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap, bool first_p) /* Spill pseudos. */ static_p = false; EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi) - if ((pic_offset_table_rtx != NULL - && spill_regno == REGNO (pic_offset_table_rtx)) - || ((int) spill_regno >= lra_constraint_new_regno_start - && ! bitmap_bit_p (&lra_inheritance_pseudos, spill_regno) - && ! bitmap_bit_p (&lra_split_regs, spill_regno) - && ! bitmap_bit_p (&lra_subreg_reload_pseudos, spill_regno) - && ! bitmap_bit_p (&lra_optional_reload_pseudos, spill_regno))) + if (must_not_spill_p (spill_regno)) goto fail; else if (non_spilled_static_chain_regno_p (spill_regno)) static_p = true; |