re PR rtl-optimization/88751 (Performance regression reload vs lra)

Fix PR88751

This patch implements a small improvement for the heuristic in lra
which decides when it has to activate the simpler register allocation
algorithm.

gcc/ChangeLog:

2019-06-06  Andreas Krebbel  <krebbel@linux.ibm.com>

	PR rtl-optimization/88751
	* ira.c (ira): Use the number of the actually referenced registers
	when calculating the threshold.

From-SVN: r271996
This commit is contained in:
Andreas Krebbel 2019-06-06 11:35:04 +00:00 committed by Andreas Krebbel
parent a96ed9f7d9
commit 891f31f9a4
2 changed files with 14 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2019-06-06 Andreas Krebbel <krebbel@linux.ibm.com>
PR rtl-optimization/88751
* ira.c (ira): Use the number of the actually referenced registers
when calculating the threshold.
2019-06-06 Jakub Jelinek <jakub@redhat.com> 2019-06-06 Jakub Jelinek <jakub@redhat.com>
* configure: Regenerate. * configure: Regenerate.

View File

@ -5198,6 +5198,8 @@ ira (FILE *f)
int ira_max_point_before_emit; int ira_max_point_before_emit;
bool saved_flag_caller_saves = flag_caller_saves; bool saved_flag_caller_saves = flag_caller_saves;
enum ira_region saved_flag_ira_region = flag_ira_region; enum ira_region saved_flag_ira_region = flag_ira_region;
unsigned int i;
int num_used_regs = 0;
clear_bb_flags (); clear_bb_flags ();
@ -5213,12 +5215,17 @@ ira (FILE *f)
ira_conflicts_p = optimize > 0; ira_conflicts_p = optimize > 0;
/* Determine the number of pseudos actually requiring coloring. */
for (i = FIRST_PSEUDO_REGISTER; i < DF_REG_SIZE (df); i++)
num_used_regs += !!(DF_REG_USE_COUNT (i) + DF_REG_DEF_COUNT (i));
/* If there are too many pseudos and/or basic blocks (e.g. 10K /* If there are too many pseudos and/or basic blocks (e.g. 10K
pseudos and 10K blocks or 100K pseudos and 1K blocks), we will pseudos and 10K blocks or 100K pseudos and 1K blocks), we will
use simplified and faster algorithms in LRA. */ use simplified and faster algorithms in LRA. */
lra_simple_p lra_simple_p
= (ira_use_lra_p = (ira_use_lra_p
&& max_reg_num () >= (1 << 26) / last_basic_block_for_fn (cfun)); && num_used_regs >= (1 << 26) / last_basic_block_for_fn (cfun));
if (lra_simple_p) if (lra_simple_p)
{ {
/* It permits to skip live range splitting in LRA. */ /* It permits to skip live range splitting in LRA. */