aboutsummaryrefslogtreecommitdiff
path: root/gcc/regrename.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2015-11-17 21:32:14 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2015-11-17 21:32:14 +0000
commit211c93053a337e65ef245d933f4804a492ba5c6e (patch)
treeb548baec4726967bdfb2026788e9bce526c740c4 /gcc/regrename.c
parente85883d4007a91e3f90a532c9de3e77a39aa1bf3 (diff)
downloadgcc-211c93053a337e65ef245d933f4804a492ba5c6e.zip
gcc-211c93053a337e65ef245d933f4804a492ba5c6e.tar.gz
gcc-211c93053a337e65ef245d933f4804a492ba5c6e.tar.bz2
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
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r--gcc/regrename.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 4d6eb37..1f11695 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -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;