aboutsummaryrefslogtreecommitdiff
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-05-29 11:37:21 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2012-05-29 11:37:21 +0000
commit9ff3c7caa816f14eac43fdf220ce6e7ccb0e84a6 (patch)
treeda655bfd3017d0030abc94d345831bdf8586d700 /gcc/alias.c
parent92b05e72eab38351ab9a486e0e0ec9db11f4413b (diff)
downloadgcc-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.c57
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"