Commit 17369fbf by Chung-Lin Tang Committed by Sandra Loosemore

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
parent 2aee355b
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>
* print-tree.c (print_node) [TREE_VEC]: Print its length.
......
......@@ -289,11 +289,19 @@ rename_single_chain (du_head_p head, HARD_REG_SET *unavailable)
return false;
}
if (dump_file)
fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
regrename_do_replace (head, best_new_reg);
df_set_regs_ever_live (best_new_reg, true);
if (regrename_do_replace (head, best_new_reg))
{
if (dump_file)
fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
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;
}
......
......@@ -3516,7 +3516,7 @@ try_rename_operands (rtx_insn *head, rtx_insn *tail, unit_req_table reqs,
best_reg =
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));
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));
}
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
memcpy (reqs, new_reqs, sizeof (unit_req_table));
......
......@@ -496,12 +496,20 @@ rename_chains (void)
continue;
}
if (dump_file)
fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
regrename_do_replace (this_head, best_new_reg);
tick[best_new_reg] = ++this_tick;
df_set_regs_ever_live (best_new_reg, true);
if (regrename_do_replace (this_head, best_new_reg))
{
if (dump_file)
fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]);
tick[best_new_reg] = ++this_tick;
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;
}
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)
{
struct du_chain *chain;
......@@ -941,22 +955,26 @@ regrename_do_replace (struct du_head *head, int reg)
int reg_ptr = REG_POINTER (*chain->loc);
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
{
*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)
ORIGINAL_REGNO (*chain->loc) = regno;
REG_ATTRS (*chain->loc) = attr;
REG_POINTER (*chain->loc) = reg_ptr;
}
df_insn_rescan (chain->insn);
}
if (!apply_change_group ())
return false;
mode = GET_MODE (*head->first->loc);
head->regno = reg;
head->nregs = hard_regno_nregs[reg][mode];
return true;
}
......
......@@ -91,6 +91,6 @@ extern void regrename_analyze (bitmap);
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,
bool);
extern void regrename_do_replace (du_head_p, int);
extern bool regrename_do_replace (du_head_p, int);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment