Commit dfc0f53a by Vladimir Makarov Committed by Vladimir Makarov

reginfo.c (max_regno_since_last_resize): New.

2012-09-27  Vladimir Makarov  <vmakarov@redhat.com>

	* reginfo.c (max_regno_since_last_resize): New.
	(reg_preferred_class, reg_alternate_class): Add assert.
	(allocate_reg_info): Initialize allocated reg info.
	(resize_reg_info): Make bigger reg_info and initialize new memory.
	(reginfo_init): Initialize max_regno_since_last_resize.
	(setup_reg_classes): Change assert.

From-SVN: r192047
parent 953ac966
2012-09-27 Vladimir Makarov <vmakarov@redhat.com>
* reginfo.c (max_regno_since_last_resize): New.
(reg_preferred_class, reg_alternate_class): Add assert.
(allocate_reg_info): Initialize allocated reg info.
(resize_reg_info): Make bigger reg_info and initialize new memory.
(reginfo_init): Initialize max_regno_since_last_resize.
(setup_reg_classes): Change assert.
2012-10-03 Andrew W. Nosenko <andrew.w.nosenko@gmail.com> 2012-10-03 Andrew W. Nosenko <andrew.w.nosenko@gmail.com>
* config/i386/driver-i386.c (host_detect_local_cpu): Fix logic * config/i386/driver-i386.c (host_detect_local_cpu): Fix logic
......
...@@ -839,6 +839,8 @@ static struct reg_pref *reg_pref; ...@@ -839,6 +839,8 @@ static struct reg_pref *reg_pref;
/* Current size of reg_info. */ /* Current size of reg_info. */
static int reg_info_size; static int reg_info_size;
/* Max_reg_num still last resize_reg_info call. */
static int max_regno_since_last_resize;
/* Return the reg_class in which pseudo reg number REGNO is best allocated. /* Return the reg_class in which pseudo reg number REGNO is best allocated.
This function is sometimes called before the info has been computed. This function is sometimes called before the info has been computed.
...@@ -849,6 +851,7 @@ reg_preferred_class (int regno) ...@@ -849,6 +851,7 @@ reg_preferred_class (int regno)
if (reg_pref == 0) if (reg_pref == 0)
return GENERAL_REGS; return GENERAL_REGS;
gcc_assert (regno < reg_info_size);
return (enum reg_class) reg_pref[regno].prefclass; return (enum reg_class) reg_pref[regno].prefclass;
} }
...@@ -858,6 +861,7 @@ reg_alternate_class (int regno) ...@@ -858,6 +861,7 @@ reg_alternate_class (int regno)
if (reg_pref == 0) if (reg_pref == 0)
return ALL_REGS; return ALL_REGS;
gcc_assert (regno < reg_info_size);
return (enum reg_class) reg_pref[regno].altclass; return (enum reg_class) reg_pref[regno].altclass;
} }
...@@ -868,45 +872,64 @@ reg_allocno_class (int regno) ...@@ -868,45 +872,64 @@ reg_allocno_class (int regno)
if (reg_pref == 0) if (reg_pref == 0)
return NO_REGS; return NO_REGS;
gcc_assert (regno < reg_info_size);
return (enum reg_class) reg_pref[regno].allocnoclass; return (enum reg_class) reg_pref[regno].allocnoclass;
} }
/* Allocate space for reg info. */ /* Allocate space for reg info and initilize it. */
static void static void
allocate_reg_info (void) allocate_reg_info (void)
{ {
reg_info_size = max_reg_num (); int i;
max_regno_since_last_resize = max_reg_num ();
reg_info_size = max_regno_since_last_resize * 3 / 2 + 1;
gcc_assert (! reg_pref && ! reg_renumber); gcc_assert (! reg_pref && ! reg_renumber);
reg_renumber = XNEWVEC (short, reg_info_size); reg_renumber = XNEWVEC (short, reg_info_size);
reg_pref = XCNEWVEC (struct reg_pref, reg_info_size); reg_pref = XCNEWVEC (struct reg_pref, reg_info_size);
memset (reg_renumber, -1, reg_info_size * sizeof (short)); memset (reg_renumber, -1, reg_info_size * sizeof (short));
for (i = 0; i < reg_info_size; i++)
{
reg_pref[i].prefclass = GENERAL_REGS;
reg_pref[i].altclass = ALL_REGS;
reg_pref[i].allocnoclass = GENERAL_REGS;
}
} }
/* Resize reg info. The new elements will be uninitialized. Return /* Resize reg info. The new elements will be initialized. Return TRUE
TRUE if new elements (for new pseudos) were added. */ if new pseudos were added since the last call. */
bool bool
resize_reg_info (void) resize_reg_info (void)
{ {
int old; int old, i;
bool change_p;
if (reg_pref == NULL) if (reg_pref == NULL)
{ {
allocate_reg_info (); allocate_reg_info ();
return true; return true;
} }
if (reg_info_size == max_reg_num ()) change_p = max_regno_since_last_resize != max_reg_num ();
return false; max_regno_since_last_resize = max_reg_num ();
if (reg_info_size >= max_reg_num ())
return change_p;
old = reg_info_size; old = reg_info_size;
reg_info_size = max_reg_num (); reg_info_size = max_reg_num () * 3 / 2 + 1;
gcc_assert (reg_pref && reg_renumber); gcc_assert (reg_pref && reg_renumber);
reg_renumber = XRESIZEVEC (short, reg_renumber, reg_info_size); reg_renumber = XRESIZEVEC (short, reg_renumber, reg_info_size);
reg_pref = XRESIZEVEC (struct reg_pref, reg_pref, reg_info_size); reg_pref = XRESIZEVEC (struct reg_pref, reg_pref, reg_info_size);
memset (reg_pref + old, -1, memset (reg_pref + old, -1,
(reg_info_size - old) * sizeof (struct reg_pref)); (reg_info_size - old) * sizeof (struct reg_pref));
memset (reg_renumber + old, -1, (reg_info_size - old) * sizeof (short)); memset (reg_renumber + old, -1, (reg_info_size - old) * sizeof (short));
for (i = old; i < reg_info_size; i++)
{
reg_pref[i].prefclass = GENERAL_REGS;
reg_pref[i].altclass = ALL_REGS;
reg_pref[i].allocnoclass = GENERAL_REGS;
}
return true; return true;
} }
...@@ -938,6 +961,7 @@ reginfo_init (void) ...@@ -938,6 +961,7 @@ reginfo_init (void)
/* This prevents dump_reg_info from losing if called /* This prevents dump_reg_info from losing if called
before reginfo is run. */ before reginfo is run. */
reg_pref = NULL; reg_pref = NULL;
reg_info_size = max_regno_since_last_resize = 0;
/* No more global register variables may be declared. */ /* No more global register variables may be declared. */
no_global_reg_vars = 1; no_global_reg_vars = 1;
return 1; return 1;
...@@ -964,7 +988,7 @@ struct rtl_opt_pass pass_reginfo_init = ...@@ -964,7 +988,7 @@ struct rtl_opt_pass pass_reginfo_init =
/* Set up preferred, alternate, and cover classes for REGNO as /* Set up preferred, alternate, and allocno classes for REGNO as
PREFCLASS, ALTCLASS, and ALLOCNOCLASS. */ PREFCLASS, ALTCLASS, and ALLOCNOCLASS. */
void void
setup_reg_classes (int regno, setup_reg_classes (int regno,
...@@ -973,7 +997,7 @@ setup_reg_classes (int regno, ...@@ -973,7 +997,7 @@ setup_reg_classes (int regno,
{ {
if (reg_pref == NULL) if (reg_pref == NULL)
return; return;
gcc_assert (reg_info_size == max_reg_num ()); gcc_assert (reg_info_size >= max_reg_num ());
reg_pref[regno].prefclass = prefclass; reg_pref[regno].prefclass = prefclass;
reg_pref[regno].altclass = altclass; reg_pref[regno].altclass = altclass;
reg_pref[regno].allocnoclass = allocnoclass; reg_pref[regno].allocnoclass = allocnoclass;
......
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