diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2012-05-29 11:37:21 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2012-05-29 11:37:21 +0000 |
commit | 9ff3c7caa816f14eac43fdf220ce6e7ccb0e84a6 (patch) | |
tree | da655bfd3017d0030abc94d345831bdf8586d700 /gcc/alias.c | |
parent | 92b05e72eab38351ab9a486e0e0ec9db11f4413b (diff) | |
download | gcc-9ff3c7caa816f14eac43fdf220ce6e7ccb0e84a6.zip gcc-9ff3c7caa816f14eac43fdf220ce6e7ccb0e84a6.tar.gz gcc-9ff3c7caa816f14eac43fdf220ce6e7ccb0e84a6.tar.bz2 |
alias.c (reg_known_value): Make this a VEC.
* alias.c (reg_known_value): Make this a VEC.
(reg_known_equiv_p): Make this an sbitmap.
(reg_known_value_size): Remove.
(get_reg_known_value, set_reg_known_value, get_reg_known_equiv_p,
set_reg_known_equiv_p): Update for reg_known_value and
reg_known_value_size data structure change.
(init_alias_analysis, end_alias_analysis): Likewise.
From-SVN: r187953
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index 00af340..03cc15d 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -243,12 +243,9 @@ static GTY((deletable)) VEC(rtx,gc) *old_reg_base_value; ? VEC_index (rtx, reg_base_value, REGNO (X)) : 0) /* Vector indexed by N giving the initial (unchanging) value known for - pseudo-register N. This array is initialized in init_alias_analysis, + pseudo-register N. This vector is initialized in init_alias_analysis, and does not change until end_alias_analysis is called. */ -static GTY((length("reg_known_value_size"))) rtx *reg_known_value; - -/* Indicates number of valid entries in reg_known_value. */ -static GTY(()) unsigned int reg_known_value_size; +static GTY(()) VEC(rtx,gc) *reg_known_value; /* Vector recording for each reg_known_value whether it is due to a REG_EQUIV note. Future passes (viz., reload) may replace the @@ -262,7 +259,7 @@ static GTY(()) unsigned int reg_known_value_size; REG_EQUIV notes. One could argue that the REG_EQUIV notes are wrong, but solving the problem in the scheduler will likely give better code, so we do it here. */ -static bool *reg_known_equiv_p; +static sbitmap reg_known_equiv_p; /* True when scanning insns from the start of the rtl to the NOTE_INSN_FUNCTION_BEG note. */ @@ -1362,8 +1359,8 @@ get_reg_known_value (unsigned int regno) if (regno >= FIRST_PSEUDO_REGISTER) { regno -= FIRST_PSEUDO_REGISTER; - if (regno < reg_known_value_size) - return reg_known_value[regno]; + if (regno < VEC_length (rtx, reg_known_value)) + return VEC_index (rtx, reg_known_value, regno); } return NULL; } @@ -1376,8 +1373,8 @@ set_reg_known_value (unsigned int regno, rtx val) if (regno >= FIRST_PSEUDO_REGISTER) { regno -= FIRST_PSEUDO_REGISTER; - if (regno < reg_known_value_size) - reg_known_value[regno] = val; + if (regno < VEC_length (rtx, reg_known_value)) + VEC_replace (rtx, reg_known_value, regno, val); } } @@ -1389,8 +1386,8 @@ get_reg_known_equiv_p (unsigned int regno) if (regno >= FIRST_PSEUDO_REGISTER) { regno -= FIRST_PSEUDO_REGISTER; - if (regno < reg_known_value_size) - return reg_known_equiv_p[regno]; + if (regno < VEC_length (rtx, reg_known_value)) + return TEST_BIT (reg_known_equiv_p, regno); } return false; } @@ -1401,8 +1398,13 @@ set_reg_known_equiv_p (unsigned int regno, bool val) if (regno >= FIRST_PSEUDO_REGISTER) { regno -= FIRST_PSEUDO_REGISTER; - if (regno < reg_known_value_size) - reg_known_equiv_p[regno] = val; + if (regno < VEC_length (rtx, reg_known_value)) + { + if (val) + SET_BIT (reg_known_equiv_p, regno); + else + RESET_BIT (reg_known_equiv_p, regno); + } } } @@ -2799,13 +2801,12 @@ init_alias_analysis (void) int changed, pass; int i; unsigned int ui; - rtx insn; + rtx insn, val; timevar_push (TV_ALIAS_ANALYSIS); - reg_known_value_size = maxreg - FIRST_PSEUDO_REGISTER; - reg_known_value = ggc_alloc_cleared_vec_rtx (reg_known_value_size); - reg_known_equiv_p = XCNEWVEC (bool, reg_known_value_size); + reg_known_value = VEC_alloc (rtx, gc, maxreg - FIRST_PSEUDO_REGISTER); + reg_known_equiv_p = sbitmap_alloc (maxreg - FIRST_PSEUDO_REGISTER); /* If we have memory allocated from the previous run, use it. */ if (old_reg_base_value) @@ -2931,13 +2932,13 @@ init_alias_analysis (void) t = plus_constant (GET_MODE (src), t, INTVAL (XEXP (src, 1))); set_reg_known_value (regno, t); - set_reg_known_equiv_p (regno, 0); + set_reg_known_equiv_p (regno, false); } else if (DF_REG_DEF_COUNT (regno) == 1 && ! rtx_varies_p (src, 1)) { set_reg_known_value (regno, src); - set_reg_known_equiv_p (regno, 0); + set_reg_known_equiv_p (regno, false); } } } @@ -2964,9 +2965,12 @@ init_alias_analysis (void) while (changed && ++pass < MAX_ALIAS_LOOP_PASSES); /* Fill in the remaining entries. */ - for (i = 0; i < (int)reg_known_value_size; i++) - if (reg_known_value[i] == 0) - reg_known_value[i] = regno_reg_rtx[i + FIRST_PSEUDO_REGISTER]; + FOR_EACH_VEC_ELT (rtx, reg_known_value, i, val) + { + int regno = i + FIRST_PSEUDO_REGISTER; + if (! val) + set_reg_known_value (regno, regno_reg_rtx[regno]); + } /* Clean up. */ free (new_reg_base_value); @@ -2989,11 +2993,8 @@ void end_alias_analysis (void) { old_reg_base_value = reg_base_value; - ggc_free (reg_known_value); - reg_known_value = 0; - reg_known_value_size = 0; - free (reg_known_equiv_p); - reg_known_equiv_p = 0; + VEC_free (rtx, gc, reg_known_value); + sbitmap_free (reg_known_equiv_p); } #include "gt-alias.h" |