Commit 211c9305 by Bernd Schmidt Committed by Bernd Schmidt

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
parent e85883d4
2015-11-17 Bernd Schmidt <bschmidt@redhat.com> 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 * regrename.c (record_out_operands): Terminate earlyclobbered
operands here. operands here.
...@@ -422,6 +422,33 @@ find_rename_reg (du_head_p this_head, enum reg_class super_class, ...@@ -422,6 +422,33 @@ find_rename_reg (du_head_p this_head, enum reg_class super_class,
return best_new_reg; 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. */ /* Perform register renaming on the current function. */
static void static void
rename_chains (void) rename_chains (void)
...@@ -445,10 +472,8 @@ rename_chains (void) ...@@ -445,10 +472,8 @@ rename_chains (void)
{ {
int best_new_reg; int best_new_reg;
int n_uses; int n_uses;
struct du_chain *tmp;
HARD_REG_SET this_unavailable; HARD_REG_SET this_unavailable;
int reg = this_head->regno; int reg = this_head->regno;
enum reg_class super_class = NO_REGS;
if (this_head->cannot_rename) if (this_head->cannot_rename)
continue; continue;
...@@ -462,23 +487,8 @@ rename_chains (void) ...@@ -462,23 +487,8 @@ rename_chains (void)
COPY_HARD_REG_SET (this_unavailable, unavailable); COPY_HARD_REG_SET (this_unavailable, unavailable);
/* Iterate over elements in the chain in order to: reg_class super_class = regrename_find_superclass (this_head, &n_uses,
1. Count number of uses, and narrow the set of registers we can &this_unavailable);
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];
}
if (n_uses < 2) if (n_uses < 2)
continue; continue;
......
...@@ -97,5 +97,7 @@ extern du_head_p regrename_chain_from_id (unsigned int); ...@@ -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, extern int find_rename_reg (du_head_p, enum reg_class, HARD_REG_SET *, int,
bool); bool);
extern bool regrename_do_replace (du_head_p, int); extern bool regrename_do_replace (du_head_p, int);
extern reg_class regrename_find_superclass (du_head_p, int *,
HARD_REG_SET *);
#endif #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