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:
parent
2aee355b5a
commit
17369fbf51
@ -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.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user