regrename.h (regrename_do_replace): Change to return bool.

2015-06-28  Chung-Lin Tang <cltang@codesourcery.com>
	    Sandra Loosemore <sandra@codesourcery.com>

	gcc/
	* regrename.h (regrename_do_replace): Change to return bool.
	* regrename.c (rename_chains): Check return value of
	regname_do_replace.
	(regrename_do_replace): Re-validate the modified insns and
	return bool status.
	* config/aarch64/cortex-a57-fma-steering.c (rename_single_chain):
	Update to match rename_chains changes.
	* config/c6x/c6x.c (try_rename_operands): Assert that
	regrename_do_replace returns true.

Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com>

From-SVN: r225106
This commit is contained in:
Chung-Lin Tang 2015-06-28 20:46:01 +00:00 committed by Sandra Loosemore
parent 2aee355b5a
commit 17369fbf51
5 changed files with 58 additions and 19 deletions

View File

@ -1,3 +1,16 @@
2015-06-28 Chung-Lin Tang <cltang@codesourcery.com>
Sandra Loosemore <sandra@codesourcery.com>
* regrename.h (regrename_do_replace): Change to return bool.
* regrename.c (rename_chains): Check return value of
regname_do_replace.
(regrename_do_replace): Re-validate the modified insns and
return bool status.
* config/aarch64/cortex-a57-fma-steering.c (rename_single_chain):
Update to match rename_chains changes.
* config/c6x/c6x.c (try_rename_operands): Assert that
regrename_do_replace returns true.
2015-06-27 Patrick Palka <ppalka@gcc.gnu.org> 2015-06-27 Patrick Palka <ppalka@gcc.gnu.org>
* print-tree.c (print_node) [TREE_VEC]: Print its length. * print-tree.c (print_node) [TREE_VEC]: Print its length.

View File

@ -289,11 +289,19 @@ rename_single_chain (du_head_p head, HARD_REG_SET *unavailable)
return false; return false;
} }
if (dump_file) if (regrename_do_replace (head, best_new_reg))
fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]); {
if (dump_file)
regrename_do_replace (head, best_new_reg); fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
df_set_regs_ever_live (best_new_reg, true); df_set_regs_ever_live (best_new_reg, true);
}
else
{
if (dump_file)
fprintf (dump_file, ", renaming as %s failed\n",
reg_names[best_new_reg]);
return false;
}
return true; return true;
} }

View File

@ -3516,7 +3516,7 @@ try_rename_operands (rtx_insn *head, rtx_insn *tail, unit_req_table reqs,
best_reg = best_reg =
find_rename_reg (this_head, super_class, &unavailable, old_reg, true); find_rename_reg (this_head, super_class, &unavailable, old_reg, true);
regrename_do_replace (this_head, best_reg); gcc_assert (regrename_do_replace (this_head, best_reg));
count_unit_reqs (new_reqs, head, PREV_INSN (tail)); count_unit_reqs (new_reqs, head, PREV_INSN (tail));
merge_unit_reqs (new_reqs); merge_unit_reqs (new_reqs);
@ -3529,7 +3529,7 @@ try_rename_operands (rtx_insn *head, rtx_insn *tail, unit_req_table reqs,
unit_req_imbalance (reqs), unit_req_imbalance (new_reqs)); unit_req_imbalance (reqs), unit_req_imbalance (new_reqs));
} }
if (unit_req_imbalance (new_reqs) > unit_req_imbalance (reqs)) if (unit_req_imbalance (new_reqs) > unit_req_imbalance (reqs))
regrename_do_replace (this_head, old_reg); gcc_assert (regrename_do_replace (this_head, old_reg));
else else
memcpy (reqs, new_reqs, sizeof (unit_req_table)); memcpy (reqs, new_reqs, sizeof (unit_req_table));

View File

@ -496,12 +496,20 @@ rename_chains (void)
continue; continue;
} }
if (dump_file) if (regrename_do_replace (this_head, best_new_reg))
fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]); {
if (dump_file)
regrename_do_replace (this_head, best_new_reg); fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
tick[best_new_reg] = ++this_tick; tick[best_new_reg] = ++this_tick;
df_set_regs_ever_live (best_new_reg, true); df_set_regs_ever_live (best_new_reg, true);
}
else
{
if (dump_file)
fprintf (dump_file, ", renaming as %s failed\n",
reg_names[best_new_reg]);
tick[reg] = ++this_tick;
}
} }
} }
@ -927,7 +935,13 @@ regrename_analyze (bitmap bb_mask)
bb->aux = NULL; bb->aux = NULL;
} }
void /* Attempt to replace all uses of the register in the chain beginning with
HEAD with REG. Returns true on success and false if the replacement is
rejected because the insns would not validate. The latter can happen
e.g. if a match_parallel predicate enforces restrictions on register
numbering in its subpatterns. */
bool
regrename_do_replace (struct du_head *head, int reg) regrename_do_replace (struct du_head *head, int reg)
{ {
struct du_chain *chain; struct du_chain *chain;
@ -941,22 +955,26 @@ regrename_do_replace (struct du_head *head, int reg)
int reg_ptr = REG_POINTER (*chain->loc); int reg_ptr = REG_POINTER (*chain->loc);
if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno) if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC (); validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
gen_rtx_UNKNOWN_VAR_LOC (), true);
else else
{ {
*chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg); validate_change (chain->insn, chain->loc,
gen_raw_REG (GET_MODE (*chain->loc), reg), true);
if (regno >= FIRST_PSEUDO_REGISTER) if (regno >= FIRST_PSEUDO_REGISTER)
ORIGINAL_REGNO (*chain->loc) = regno; ORIGINAL_REGNO (*chain->loc) = regno;
REG_ATTRS (*chain->loc) = attr; REG_ATTRS (*chain->loc) = attr;
REG_POINTER (*chain->loc) = reg_ptr; REG_POINTER (*chain->loc) = reg_ptr;
} }
df_insn_rescan (chain->insn);
} }
if (!apply_change_group ())
return false;
mode = GET_MODE (*head->first->loc); mode = GET_MODE (*head->first->loc);
head->regno = reg; head->regno = reg;
head->nregs = hard_regno_nregs[reg][mode]; head->nregs = hard_regno_nregs[reg][mode];
return true;
} }

View File

@ -91,6 +91,6 @@ extern void regrename_analyze (bitmap);
extern du_head_p regrename_chain_from_id (unsigned int); extern du_head_p regrename_chain_from_id (unsigned int);
extern int find_rename_reg (du_head_p, enum reg_class, HARD_REG_SET *, int, extern int find_rename_reg (du_head_p, enum reg_class, HARD_REG_SET *, int,
bool); bool);
extern void regrename_do_replace (du_head_p, int); extern bool regrename_do_replace (du_head_p, int);
#endif #endif