haifa-sched.c (call_used_regs_num): Rename to...

* haifa-sched.c (call_used_regs_num): Rename to...
	(call_saved_regs_num): ...this.
	(fixed_regs_num): New variable.
	(sched_pressure_start_bb): Subtract out fixed_regs. Scale call_saved 
	regs not call_used.
	(alloc_global_sched_pressure_data): Compute call_saved and fixed regs.

From-SVN: r241590
This commit is contained in:
Pat Haugen 2016-10-26 17:07:55 +00:00 committed by Pat Haugen
parent eaa402fcc7
commit 6d5c37d004
2 changed files with 28 additions and 12 deletions

View File

@ -1,3 +1,12 @@
2016-10-26 Pat Haugen <pthaugen@us.ibm.com>
* haifa-sched.c (call_used_regs_num): Rename to...
(call_saved_regs_num): ...this.
(fixed_regs_num): New variable.
(sched_pressure_start_bb): Subtract out fixed_regs. Scale call_saved
regs not call_used.
(alloc_global_sched_pressure_data): Compute call_saved and fixed regs.
2016-10-26 David Malcolm <dmalcolm@redhat.com>
* print-rtl-function.c (print_rtx_function): Rewrite in terms of

View File

@ -933,9 +933,10 @@ static bitmap region_ref_regs;
/* Effective number of available registers of a given class (see comment
in sched_pressure_start_bb). */
static int sched_class_regs_num[N_REG_CLASSES];
/* Number of call_used_regs. This is a helper for calculating of
/* Number of call_saved_regs and fixed_regs. Helpers for calculating of
sched_class_regs_num. */
static int call_used_regs_num[N_REG_CLASSES];
static int call_saved_regs_num[N_REG_CLASSES];
static int fixed_regs_num[N_REG_CLASSES];
/* Initiate register pressure relative info for scheduling the current
region. Currently it is only clearing register mentioned in the
@ -3897,17 +3898,19 @@ sched_pressure_start_bb (basic_block bb)
* If the basic block executes much more often than the prologue/epilogue
(e.g., inside a hot loop), then cost of spill in the prologue is close to
nil, so the effective number of available registers is
(ira_class_hard_regs_num[cl] - 0).
(ira_class_hard_regs_num[cl] - fixed_regs_num[cl] - 0).
* If the basic block executes as often as the prologue/epilogue,
then spill in the block is as costly as in the prologue, so the effective
number of available registers is
(ira_class_hard_regs_num[cl] - call_used_regs_num[cl]).
(ira_class_hard_regs_num[cl] - fixed_regs_num[cl]
- call_saved_regs_num[cl]).
Note that all-else-equal, we prefer to spill in the prologue, since that
allows "extra" registers for other basic blocks of the function.
* If the basic block is on the cold path of the function and executes
rarely, then we should always prefer to spill in the block, rather than
in the prologue/epilogue. The effective number of available register is
(ira_class_hard_regs_num[cl] - call_used_regs_num[cl]). */
(ira_class_hard_regs_num[cl] - fixed_regs_num[cl]
- call_saved_regs_num[cl]). */
{
int i;
int entry_freq = ENTRY_BLOCK_PTR_FOR_FN (cfun)->frequency;
@ -3924,9 +3927,10 @@ sched_pressure_start_bb (basic_block bb)
for (i = 0; i < ira_pressure_classes_num; ++i)
{
enum reg_class cl = ira_pressure_classes[i];
sched_class_regs_num[cl] = ira_class_hard_regs_num[cl];
sched_class_regs_num[cl] = ira_class_hard_regs_num[cl]
- fixed_regs_num[cl];
sched_class_regs_num[cl]
-= (call_used_regs_num[cl] * entry_freq) / bb_freq;
-= (call_saved_regs_num[cl] * entry_freq) / bb_freq;
}
}
@ -7238,17 +7242,20 @@ alloc_global_sched_pressure_data (void)
region_ref_regs = BITMAP_ALLOC (NULL);
}
/* Calculate number of CALL_USED_REGS in register classes that
we calculate register pressure for. */
/* Calculate number of CALL_SAVED_REGS and FIXED_REGS in register classes
that we calculate register pressure for. */
for (int c = 0; c < ira_pressure_classes_num; ++c)
{
enum reg_class cl = ira_pressure_classes[c];
call_used_regs_num[cl] = 0;
call_saved_regs_num[cl] = 0;
fixed_regs_num[cl] = 0;
for (int i = 0; i < ira_class_hard_regs_num[cl]; ++i)
if (call_used_regs[ira_class_hard_regs[cl][i]])
++call_used_regs_num[cl];
if (!call_used_regs[ira_class_hard_regs[cl][i]])
++call_saved_regs_num[cl];
else if (fixed_regs[ira_class_hard_regs[cl][i]])
++fixed_regs_num[cl];
}
}
}