/* Numbers of operands which are early clobber registers. */
int early_clobbered_nops[MAX_RECOG_OPERANDS];
enum reg_class curr_alt[MAX_RECOG_OPERANDS];
+ enum reg_class all_this_alternative;
+ int all_used_nregs, all_reload_nregs;
HARD_REG_SET curr_alt_set[MAX_RECOG_OPERANDS];
HARD_REG_SET curr_alt_exclude_start_hard_regs[MAX_RECOG_OPERANDS];
bool curr_alt_match_win[MAX_RECOG_OPERANDS];
curr_alt_out_sp_reload_p = false;
curr_reuse_alt_p = true;
curr_alt_class_change_p = false;
-
+ all_this_alternative = NO_REGS;
+ all_used_nregs = all_reload_nregs = 0;
for (nop = 0; nop < n_operands; nop++)
{
const char *p;
/* Record which operands fit this alternative. */
if (win)
{
+ if (early_clobber_p
+ || curr_static_id->operand[nop].type != OP_OUT)
+ {
+ all_used_nregs
+ += ira_reg_class_min_nregs[this_alternative][mode];
+ all_this_alternative
+ = (reg_class_subunion
+ [all_this_alternative][this_alternative]);
+ }
this_alternative_win = true;
if (class_change_p)
{
& ~((ira_prohibited_class_mode_regs
[this_alternative][mode])
| lra_no_alloc_regs));
- if (hard_reg_set_empty_p (available_regs))
+ if (!hard_reg_set_empty_p (available_regs))
+ {
+ if (early_clobber_p
+ || curr_static_id->operand[nop].type != OP_OUT)
+ {
+ all_reload_nregs
+ += ira_reg_class_min_nregs[this_alternative][mode];
+ all_this_alternative
+ = (reg_class_subunion
+ [all_this_alternative][this_alternative]);
+ }
+ }
+ else
{
/* There are no hard regs holding a value of given
mode. */
" Cycle danger: overall += LRA_MAX_REJECT\n");
overall += LRA_MAX_REJECT;
}
+ if (all_this_alternative != NO_REGS
+ && all_used_nregs != 0 && all_reload_nregs != 0
+ && (all_used_nregs + all_reload_nregs + 1
+ >= ira_class_hard_regs_num[all_this_alternative]))
+ {
+ if (lra_dump_file != NULL)
+ fprintf
+ (lra_dump_file,
+ " Register starvation: overall += LRA_MAX_REJECT"
+ "(class=%s,avail=%d,used=%d,reload=%d)\n",
+ reg_class_names[all_this_alternative],
+ ira_class_hard_regs_num[all_this_alternative],
+ all_used_nregs, all_reload_nregs);
+ overall += LRA_MAX_REJECT;
+ }
ok_p = true;
curr_alt_dont_inherit_ops_num = 0;
for (nop = 0; nop < early_clobbered_regs_num; nop++)