Preliminary regrename patch for i386 ROP patch

* regrename.c (regrename_find_superclass): New function, code moved
	from ...
	(rename_chains): ... here.  Call it.
	* regrename.h (regrename_find_superclass): Declare.

From-SVN: r230501
This commit is contained in:
Bernd Schmidt 2015-11-17 21:32:14 +00:00 committed by Bernd Schmidt
parent e85883d400
commit 211c93053a
3 changed files with 36 additions and 19 deletions

View File

@ -1,5 +1,10 @@
2015-11-17 Bernd Schmidt <bschmidt@redhat.com>
* regrename.c (regrename_find_superclass): New function, code moved
from ...
(rename_chains): ... here. Call it.
* regrename.h (regrename_find_superclass): Declare.
* regrename.c (record_out_operands): Terminate earlyclobbered
operands here.

View File

@ -422,6 +422,33 @@ find_rename_reg (du_head_p this_head, enum reg_class super_class,
return best_new_reg;
}
/* Iterate over elements in the chain HEAD in order to:
1. Count number of uses, storing it in *PN_USES.
2. Narrow the set of registers we can use for renaming, adding
unavailable registers to *PUNAVAILABLE, which must be
initialized by the caller.
3. Compute the superunion of register classes in this chain
and return it. */
reg_class
regrename_find_superclass (du_head_p head, int *pn_uses,
HARD_REG_SET *punavailable)
{
int n_uses = 0;
reg_class super_class = NO_REGS;
for (du_chain *tmp = head->first; tmp; tmp = tmp->next_use)
{
if (DEBUG_INSN_P (tmp->insn))
continue;
n_uses++;
IOR_COMPL_HARD_REG_SET (*punavailable,
reg_class_contents[tmp->cl]);
super_class
= reg_class_superunion[(int) super_class][(int) tmp->cl];
}
*pn_uses = n_uses;
return super_class;
}
/* Perform register renaming on the current function. */
static void
rename_chains (void)
@ -445,10 +472,8 @@ rename_chains (void)
{
int best_new_reg;
int n_uses;
struct du_chain *tmp;
HARD_REG_SET this_unavailable;
int reg = this_head->regno;
enum reg_class super_class = NO_REGS;
if (this_head->cannot_rename)
continue;
@ -462,23 +487,8 @@ rename_chains (void)
COPY_HARD_REG_SET (this_unavailable, unavailable);
/* Iterate over elements in the chain in order to:
1. Count number of uses, and narrow the set of registers we can
use for renaming.
2. Compute the superunion of register classes in this chain. */
n_uses = 0;
super_class = NO_REGS;
for (tmp = this_head->first; tmp; tmp = tmp->next_use)
{
if (DEBUG_INSN_P (tmp->insn))
continue;
n_uses++;
IOR_COMPL_HARD_REG_SET (this_unavailable,
reg_class_contents[tmp->cl]);
super_class
= reg_class_superunion[(int) super_class][(int) tmp->cl];
}
reg_class super_class = regrename_find_superclass (this_head, &n_uses,
&this_unavailable);
if (n_uses < 2)
continue;

View File

@ -97,5 +97,7 @@ 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 bool regrename_do_replace (du_head_p, int);
extern reg_class regrename_find_superclass (du_head_p, int *,
HARD_REG_SET *);
#endif