Commit 9ff3c7ca by Steven Bosscher

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
parent 92b05e72
2012-05-29 Steven Bosscher <steven@gcc.gnu.org>
* 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.
2012-05-29 Jakub Jelinek <jakub@redhat.com> 2012-05-29 Jakub Jelinek <jakub@redhat.com>
PR middle-end/53510 PR middle-end/53510
......
...@@ -243,12 +243,9 @@ static GTY((deletable)) VEC(rtx,gc) *old_reg_base_value; ...@@ -243,12 +243,9 @@ static GTY((deletable)) VEC(rtx,gc) *old_reg_base_value;
? VEC_index (rtx, reg_base_value, REGNO (X)) : 0) ? VEC_index (rtx, reg_base_value, REGNO (X)) : 0)
/* Vector indexed by N giving the initial (unchanging) value known for /* 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. */ and does not change until end_alias_analysis is called. */
static GTY((length("reg_known_value_size"))) rtx *reg_known_value; static GTY(()) VEC(rtx,gc) *reg_known_value;
/* Indicates number of valid entries in reg_known_value. */
static GTY(()) unsigned int reg_known_value_size;
/* Vector recording for each reg_known_value whether it is due to a /* Vector recording for each reg_known_value whether it is due to a
REG_EQUIV note. Future passes (viz., reload) may replace the REG_EQUIV note. Future passes (viz., reload) may replace the
...@@ -262,7 +259,7 @@ static GTY(()) unsigned int reg_known_value_size; ...@@ -262,7 +259,7 @@ static GTY(()) unsigned int reg_known_value_size;
REG_EQUIV notes. One could argue that the REG_EQUIV notes are REG_EQUIV notes. One could argue that the REG_EQUIV notes are
wrong, but solving the problem in the scheduler will likely give wrong, but solving the problem in the scheduler will likely give
better code, so we do it here. */ 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 /* True when scanning insns from the start of the rtl to the
NOTE_INSN_FUNCTION_BEG note. */ NOTE_INSN_FUNCTION_BEG note. */
...@@ -1362,8 +1359,8 @@ get_reg_known_value (unsigned int regno) ...@@ -1362,8 +1359,8 @@ get_reg_known_value (unsigned int regno)
if (regno >= FIRST_PSEUDO_REGISTER) if (regno >= FIRST_PSEUDO_REGISTER)
{ {
regno -= FIRST_PSEUDO_REGISTER; regno -= FIRST_PSEUDO_REGISTER;
if (regno < reg_known_value_size) if (regno < VEC_length (rtx, reg_known_value))
return reg_known_value[regno]; return VEC_index (rtx, reg_known_value, regno);
} }
return NULL; return NULL;
} }
...@@ -1376,8 +1373,8 @@ set_reg_known_value (unsigned int regno, rtx val) ...@@ -1376,8 +1373,8 @@ set_reg_known_value (unsigned int regno, rtx val)
if (regno >= FIRST_PSEUDO_REGISTER) if (regno >= FIRST_PSEUDO_REGISTER)
{ {
regno -= FIRST_PSEUDO_REGISTER; regno -= FIRST_PSEUDO_REGISTER;
if (regno < reg_known_value_size) if (regno < VEC_length (rtx, reg_known_value))
reg_known_value[regno] = val; VEC_replace (rtx, reg_known_value, regno, val);
} }
} }
...@@ -1389,8 +1386,8 @@ get_reg_known_equiv_p (unsigned int regno) ...@@ -1389,8 +1386,8 @@ get_reg_known_equiv_p (unsigned int regno)
if (regno >= FIRST_PSEUDO_REGISTER) if (regno >= FIRST_PSEUDO_REGISTER)
{ {
regno -= FIRST_PSEUDO_REGISTER; regno -= FIRST_PSEUDO_REGISTER;
if (regno < reg_known_value_size) if (regno < VEC_length (rtx, reg_known_value))
return reg_known_equiv_p[regno]; return TEST_BIT (reg_known_equiv_p, regno);
} }
return false; return false;
} }
...@@ -1401,8 +1398,13 @@ set_reg_known_equiv_p (unsigned int regno, bool val) ...@@ -1401,8 +1398,13 @@ set_reg_known_equiv_p (unsigned int regno, bool val)
if (regno >= FIRST_PSEUDO_REGISTER) if (regno >= FIRST_PSEUDO_REGISTER)
{ {
regno -= FIRST_PSEUDO_REGISTER; regno -= FIRST_PSEUDO_REGISTER;
if (regno < reg_known_value_size) if (regno < VEC_length (rtx, reg_known_value))
reg_known_equiv_p[regno] = val; {
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) ...@@ -2799,13 +2801,12 @@ init_alias_analysis (void)
int changed, pass; int changed, pass;
int i; int i;
unsigned int ui; unsigned int ui;
rtx insn; rtx insn, val;
timevar_push (TV_ALIAS_ANALYSIS); timevar_push (TV_ALIAS_ANALYSIS);
reg_known_value_size = maxreg - FIRST_PSEUDO_REGISTER; reg_known_value = VEC_alloc (rtx, gc, maxreg - FIRST_PSEUDO_REGISTER);
reg_known_value = ggc_alloc_cleared_vec_rtx (reg_known_value_size); reg_known_equiv_p = sbitmap_alloc (maxreg - FIRST_PSEUDO_REGISTER);
reg_known_equiv_p = XCNEWVEC (bool, reg_known_value_size);
/* If we have memory allocated from the previous run, use it. */ /* If we have memory allocated from the previous run, use it. */
if (old_reg_base_value) if (old_reg_base_value)
...@@ -2931,13 +2932,13 @@ init_alias_analysis (void) ...@@ -2931,13 +2932,13 @@ init_alias_analysis (void)
t = plus_constant (GET_MODE (src), t, t = plus_constant (GET_MODE (src), t,
INTVAL (XEXP (src, 1))); INTVAL (XEXP (src, 1)));
set_reg_known_value (regno, t); 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 else if (DF_REG_DEF_COUNT (regno) == 1
&& ! rtx_varies_p (src, 1)) && ! rtx_varies_p (src, 1))
{ {
set_reg_known_value (regno, src); 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) ...@@ -2964,9 +2965,12 @@ init_alias_analysis (void)
while (changed && ++pass < MAX_ALIAS_LOOP_PASSES); while (changed && ++pass < MAX_ALIAS_LOOP_PASSES);
/* Fill in the remaining entries. */ /* Fill in the remaining entries. */
for (i = 0; i < (int)reg_known_value_size; i++) FOR_EACH_VEC_ELT (rtx, reg_known_value, i, val)
if (reg_known_value[i] == 0) {
reg_known_value[i] = regno_reg_rtx[i + FIRST_PSEUDO_REGISTER]; int regno = i + FIRST_PSEUDO_REGISTER;
if (! val)
set_reg_known_value (regno, regno_reg_rtx[regno]);
}
/* Clean up. */ /* Clean up. */
free (new_reg_base_value); free (new_reg_base_value);
...@@ -2989,11 +2993,8 @@ void ...@@ -2989,11 +2993,8 @@ void
end_alias_analysis (void) end_alias_analysis (void)
{ {
old_reg_base_value = reg_base_value; old_reg_base_value = reg_base_value;
ggc_free (reg_known_value); VEC_free (rtx, gc, reg_known_value);
reg_known_value = 0; sbitmap_free (reg_known_equiv_p);
reg_known_value_size = 0;
free (reg_known_equiv_p);
reg_known_equiv_p = 0;
} }
#include "gt-alias.h" #include "gt-alias.h"
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