From: Bernd Schmidt Date: Tue, 17 Nov 2015 21:32:14 +0000 (+0000) Subject: Preliminary regrename patch for i386 ROP patch X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=211c93053a337e65ef245d933f4804a492ba5c6e;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4037505e454..869685077c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2015-11-17 Bernd Schmidt + * 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. diff --git a/gcc/regrename.c b/gcc/regrename.c index 4d6eb372ddd..1f11695c5db 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; diff --git a/gcc/regrename.h b/gcc/regrename.h index 801e0d25278..c702835cfe2 100644 --- a/gcc/regrename.h +++ b/gcc/regrename.h @@ -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