Commit 1fb49ce7 by Zack Weinberg Committed by Zack Weinberg

r110125@banpei: zack | 2006-01-22 14:46:46 -0800

 r110125@banpei:  zack | 2006-01-22 14:46:46 -0800
 	* genautomata.c:  Include vec.h, not varray.h.
 	Delete vla_ptr_t, all of the VLA_PTR_ macros, and all of the
 	VLA_HWINT_ macros.  Change vla_hwint_t to a typedef for
 	VEC(vect_el_t,heap) *.  Convert all uses of VLA_* macros to
 	VEC_* macros operating on appropriately typed vectors, or to
 	malloced arrays when the size is known in advance.  Const-ify
 	many char* variables and function arguments.  No functional changes.
 	* Makefile.in (build/varray.o): Delete rule.
 	(build/genattrtab): Depend on build/vec.o instead of build/varray.o.
 	(build/genautomata.o): Depend on vec.h instead of $(VARRAY_H).

From-SVN: r110121
parent 0458fe77
2006-01-22 Zack Weinberg <zackw@panix.com> 2006-01-22 Zack Weinberg <zackw@panix.com>
* genautomata.c: Include vec.h, not varray.h.
Delete vla_ptr_t, all of the VLA_PTR_ macros, and all of the
VLA_HWINT_ macros. Change vla_hwint_t to a typedef for
VEC(vect_el_t,heap) *. Convert all uses of VLA_* macros to
VEC_* macros operating on appropriately typed vectors, or to
malloced arrays when the size is known in advance. Const-ify
many char* variables and function arguments. No functional changes.
* Makefile.in (build/varray.o): Delete rule.
(build/genattrtab): Depend on build/vec.o instead of build/varray.o.
(build/genautomata.o): Depend on vec.h instead of $(VARRAY_H).
2006-01-22 Zack Weinberg <zackw@panix.com>
* gensupport.c: Define get_insn_name and record_insn_name here. * gensupport.c: Define get_insn_name and record_insn_name here.
(read_md_rtx): Call record_insn_name as appropriate. (read_md_rtx): Call record_insn_name as appropriate.
* genattr.c, genattrtab.c, gencodes.c, genconfig.c, genemit.c * genattr.c, genattrtab.c, gencodes.c, genconfig.c, genemit.c
......
...@@ -2894,8 +2894,6 @@ build/read-rtl.o: read-rtl.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h \ ...@@ -2894,8 +2894,6 @@ build/read-rtl.o: read-rtl.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h \
$(GTM_H) $(RTL_BASE_H) $(OBSTACK_H) $(HASHTAB_H) gensupport.h $(GTM_H) $(RTL_BASE_H) $(OBSTACK_H) $(HASHTAB_H) gensupport.h
build/rtl.o: rtl.c $(BCONFIG_H) coretypes.h $(GTM_H) $(SYSTEM_H) \ build/rtl.o: rtl.c $(BCONFIG_H) coretypes.h $(GTM_H) $(SYSTEM_H) \
$(RTL_H) real.h $(GGC_H) errors.h $(RTL_H) real.h $(GGC_H) errors.h
build/varray.o: varray.c $(BCONFIG_H) coretypes.h $(GTM_H) $(SYSTEM_H) \
$(VARRAY_H) $(RTL_BASE_H) $(GGC_H) $(TREE_H) bitmap.h errors.h
build/vec.o : vec.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) coretypes.h vec.h \ build/vec.o : vec.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) coretypes.h vec.h \
$(GGC_H) toplev.h $(GGC_H) toplev.h
build/gencondmd.o : build/gencondmd.c $(CONFIG_H) $(SYSTEM_H) $(GTM_H) \ build/gencondmd.o : build/gencondmd.c $(CONFIG_H) $(SYSTEM_H) $(GTM_H) \
...@@ -2910,7 +2908,7 @@ build/genattrtab.o : genattrtab.c $(RTL_BASE_H) $(OBSTACK_H) \ ...@@ -2910,7 +2908,7 @@ build/genattrtab.o : genattrtab.c $(RTL_BASE_H) $(OBSTACK_H) \
$(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h $(GGC_H) \ $(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h $(GGC_H) \
gensupport.h genattrtab.h gensupport.h genattrtab.h
build/genautomata.o : genautomata.c $(RTL_BASE_H) $(OBSTACK_H) \ build/genautomata.o : genautomata.c $(RTL_BASE_H) $(OBSTACK_H) \
$(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h $(VARRAY_H) \ $(BCONFIG_H) $(SYSTEM_H) coretypes.h $(GTM_H) errors.h vec.h \
genattrtab.h $(HASHTAB_H) genattrtab.h $(HASHTAB_H)
build/gencheck.o : gencheck.c gencheck.h tree.def $(BCONFIG_H) $(GTM_H) \ build/gencheck.o : gencheck.c gencheck.h tree.def $(BCONFIG_H) $(GTM_H) \
$(SYSTEM_H) coretypes.h $(lang_tree_files) $(SYSTEM_H) coretypes.h $(lang_tree_files)
...@@ -2968,7 +2966,7 @@ $(genprogmd:%=build/gen%$(build_exeext)): $(BUILD_RTL) $(BUILD_ERRORS) ...@@ -2968,7 +2966,7 @@ $(genprogmd:%=build/gen%$(build_exeext)): $(BUILD_RTL) $(BUILD_ERRORS)
# These programs need files over and above what they get from the above list. # These programs need files over and above what they get from the above list.
build/genextract$(build_exeext) : build/vec.o build/genextract$(build_exeext) : build/vec.o
build/genattrtab$(build_exeext) : build/genautomata.o build/varray.o build/genattrtab$(build_exeext) : build/genautomata.o build/vec.o
build/genattrtab$(build_exeext) : BUILD_LIBS += -lm build/genattrtab$(build_exeext) : BUILD_LIBS += -lm
# These programs are not linked with the MD reader. # These programs are not linked with the MD reader.
......
...@@ -113,6 +113,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA ...@@ -113,6 +113,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include <math.h> #include <math.h>
#include "hashtab.h" #include "hashtab.h"
#include "varray.h" #include "varray.h"
#include "vec.h"
#ifndef CHAR_BIT #ifndef CHAR_BIT
#define CHAR_BIT 8 #define CHAR_BIT 8
...@@ -132,17 +133,6 @@ typedef unsigned HOST_WIDE_INT set_el_t; ...@@ -132,17 +133,6 @@ typedef unsigned HOST_WIDE_INT set_el_t;
type. */ type. */
typedef set_el_t *reserv_sets_t; typedef set_el_t *reserv_sets_t;
/* The following structure represents variable length array (vla) of
pointers and HOST WIDE INTs. We could be use only varray. But we
add new lay because we add elements very frequently and this could
stress OS allocator when varray is used only. */
typedef struct {
size_t length; /* current size of vla. */
varray_type varray; /* container for vla. */
} vla_ptr_t;
typedef vla_ptr_t vla_hwint_t;
/* The following structure describes a ticker. */ /* The following structure describes a ticker. */
struct ticker struct ticker
{ {
...@@ -218,24 +208,24 @@ typedef struct state_ainsn_table *state_ainsn_table_t; ...@@ -218,24 +208,24 @@ typedef struct state_ainsn_table *state_ainsn_table_t;
static void *create_node (size_t); static void *create_node (size_t);
static void *copy_node (const void *, size_t); static void *copy_node (const void *, size_t);
static char *check_name (char *, pos_t); static const char *check_name (const char *, pos_t);
static char *next_sep_el (char **, int, int); static char *next_sep_el (const char **, int, int);
static int n_sep_els (char *, int, int); static int n_sep_els (const char *, int, int);
static char **get_str_vect (char *, int *, int, int); static char **get_str_vect (const char *, int *, int, int);
static void gen_presence_absence_set (rtx, int, int); static void gen_presence_absence_set (rtx, int, int);
static regexp_t gen_regexp_el (char *); static regexp_t gen_regexp_el (const char *);
static regexp_t gen_regexp_repeat (char *); static regexp_t gen_regexp_repeat (const char *);
static regexp_t gen_regexp_allof (char *); static regexp_t gen_regexp_allof (const char *);
static regexp_t gen_regexp_oneof (char *); static regexp_t gen_regexp_oneof (const char *);
static regexp_t gen_regexp_sequence (char *); static regexp_t gen_regexp_sequence (const char *);
static regexp_t gen_regexp (char *); static regexp_t gen_regexp (const char *);
static unsigned string_hash (const char *); static unsigned string_hash (const char *);
static unsigned automaton_decl_hash (const void *); static unsigned automaton_decl_hash (const void *);
static int automaton_decl_eq_p (const void *, static int automaton_decl_eq_p (const void *,
const void *); const void *);
static decl_t insert_automaton_decl (decl_t); static decl_t insert_automaton_decl (decl_t);
static decl_t find_automaton_decl (char *); static decl_t find_automaton_decl (const char *);
static void initiate_automaton_decl_table (void); static void initiate_automaton_decl_table (void);
static void finish_automaton_decl_table (void); static void finish_automaton_decl_table (void);
...@@ -243,7 +233,7 @@ static hashval_t insn_decl_hash (const void *); ...@@ -243,7 +233,7 @@ static hashval_t insn_decl_hash (const void *);
static int insn_decl_eq_p (const void *, static int insn_decl_eq_p (const void *,
const void *); const void *);
static decl_t insert_insn_decl (decl_t); static decl_t insert_insn_decl (decl_t);
static decl_t find_insn_decl (char *); static decl_t find_insn_decl (const char *);
static void initiate_insn_decl_table (void); static void initiate_insn_decl_table (void);
static void finish_insn_decl_table (void); static void finish_insn_decl_table (void);
...@@ -251,7 +241,7 @@ static hashval_t decl_hash (const void *); ...@@ -251,7 +241,7 @@ static hashval_t decl_hash (const void *);
static int decl_eq_p (const void *, static int decl_eq_p (const void *,
const void *); const void *);
static decl_t insert_decl (decl_t); static decl_t insert_decl (decl_t);
static decl_t find_decl (char *); static decl_t find_decl (const char *);
static void initiate_decl_table (void); static void initiate_decl_table (void);
static void finish_decl_table (void); static void finish_decl_table (void);
...@@ -385,7 +375,6 @@ static void form_ainsn_with_same_reservs (automaton_t); ...@@ -385,7 +375,6 @@ static void form_ainsn_with_same_reservs (automaton_t);
static reserv_sets_t form_reservs_matter (automaton_t); static reserv_sets_t form_reservs_matter (automaton_t);
static void make_automaton (automaton_t); static void make_automaton (automaton_t);
static void form_arcs_marked_by_insn (state_t); static void form_arcs_marked_by_insn (state_t);
static int create_composed_state (state_t, arc_t, vla_ptr_t *);
static void NDFA_to_DFA (automaton_t); static void NDFA_to_DFA (automaton_t);
static void pass_state_graph (state_t, void (*) (state_t)); static void pass_state_graph (state_t, void (*) (state_t));
static void pass_states (automaton_t, static void pass_states (automaton_t,
...@@ -394,15 +383,8 @@ static void initiate_pass_states (void); ...@@ -394,15 +383,8 @@ static void initiate_pass_states (void);
static void add_achieved_state (state_t); static void add_achieved_state (state_t);
static int set_out_arc_insns_equiv_num (state_t, int); static int set_out_arc_insns_equiv_num (state_t, int);
static void clear_arc_insns_equiv_num (state_t); static void clear_arc_insns_equiv_num (state_t);
static void copy_equiv_class (vla_ptr_t *to,
const vla_ptr_t *from);
static int first_cycle_unit_presence (state_t, int); static int first_cycle_unit_presence (state_t, int);
static int state_is_differed (state_t, state_t, int, int); static int state_is_differed (state_t, state_t, int, int);
static state_t init_equiv_class (state_t *states, int);
static int partition_equiv_class (state_t *, int,
vla_ptr_t *, int *);
static void evaluate_equiv_classes (automaton_t, vla_ptr_t *);
static void merge_states (automaton_t, vla_ptr_t *);
static void set_new_cycle_flags (state_t); static void set_new_cycle_flags (state_t);
static void minimize_DFA (automaton_t); static void minimize_DFA (automaton_t);
static void incr_states_and_arcs_nums (state_t); static void incr_states_and_arcs_nums (state_t);
...@@ -434,7 +416,6 @@ static void output_range_type (FILE *, long int, long int); ...@@ -434,7 +416,6 @@ static void output_range_type (FILE *, long int, long int);
static int longest_path_length (state_t); static int longest_path_length (state_t);
static void process_state_longest_path_length (state_t); static void process_state_longest_path_length (state_t);
static void output_dfa_max_issue_rate (void); static void output_dfa_max_issue_rate (void);
static void output_vect (vect_el_t *, int);
static void output_chip_member_name (FILE *, automaton_t); static void output_chip_member_name (FILE *, automaton_t);
static void output_temp_chip_member_name (FILE *, automaton_t); static void output_temp_chip_member_name (FILE *, automaton_t);
static void output_translate_vect_name (FILE *, automaton_t); static void output_translate_vect_name (FILE *, automaton_t);
...@@ -455,15 +436,11 @@ static void output_translate_vect (automaton_t); ...@@ -455,15 +436,11 @@ static void output_translate_vect (automaton_t);
static int comb_vect_p (state_ainsn_table_t); static int comb_vect_p (state_ainsn_table_t);
static state_ainsn_table_t create_state_ainsn_table (automaton_t); static state_ainsn_table_t create_state_ainsn_table (automaton_t);
static void output_state_ainsn_table static void output_state_ainsn_table
(state_ainsn_table_t, char *, void (*) (FILE *, automaton_t), (state_ainsn_table_t, const char *, void (*) (FILE *, automaton_t),
void (*) (FILE *, automaton_t), void (*) (FILE *, automaton_t), void (*) (FILE *, automaton_t), void (*) (FILE *, automaton_t),
void (*) (FILE *, automaton_t)); void (*) (FILE *, automaton_t));
static void add_vect (state_ainsn_table_t,
int, vect_el_t *, int);
static int out_state_arcs_num (state_t); static int out_state_arcs_num (state_t);
static int compare_transition_els_num (const void *, const void *); static int compare_transition_els_num (const void *, const void *);
static void add_vect_el (vla_hwint_t *,
ainsn_t, int);
static void add_states_vect_el (state_t); static void add_states_vect_el (state_t);
static void output_trans_table (automaton_t); static void output_trans_table (automaton_t);
static void output_state_alts_table (automaton_t); static void output_state_alts_table (automaton_t);
...@@ -539,110 +516,22 @@ static pos_t no_pos = 0; ...@@ -539,110 +516,22 @@ static pos_t no_pos = 0;
static struct obstack irp; static struct obstack irp;
/* Declare vector types for various data structures: */
/* This page contains code for work with variable length array (vla) DEF_VEC_P(alt_state_t);
of pointers. We could be use only varray. But we add new lay DEF_VEC_ALLOC_P(alt_state_t,heap);
because we add elements very frequently and this could stress OS DEF_VEC_P(ainsn_t);
allocator when varray is used only. */ DEF_VEC_ALLOC_P(ainsn_t,heap);
DEF_VEC_P(state_t);
/* Start work with vla. */ DEF_VEC_ALLOC_P(state_t,heap);
#define VLA_PTR_CREATE(vla, allocated_length, name) \ DEF_VEC_P(decl_t);
do \ DEF_VEC_ALLOC_P(decl_t,heap);
{ \ DEF_VEC_P(reserv_sets_t);
vla_ptr_t *const _vla_ptr = &(vla); \ DEF_VEC_ALLOC_P(reserv_sets_t,heap);
\
VARRAY_GENERIC_PTR_INIT (_vla_ptr->varray, allocated_length, name);\
_vla_ptr->length = 0; \
} \
while (0)
/* Finish work with the vla. */
#define VLA_PTR_DELETE(vla) VARRAY_FREE ((vla).varray)
/* Return start address of the vla. */
#define VLA_PTR_BEGIN(vla) ((void *) &VARRAY_GENERIC_PTR ((vla).varray, 0))
/* Address of the last element of the vla. Do not use side effects in
the macro argument. */
#define VLA_PTR_LAST(vla) (&VARRAY_GENERIC_PTR ((vla).varray, \
(vla).length - 1))
/* Nullify the vla. */
#define VLA_PTR_NULLIFY(vla) ((vla).length = 0)
/* Shorten the vla on given number bytes. */
#define VLA_PTR_SHORTEN(vla, n) ((vla).length -= (n))
/* Expand the vla on N elements. The values of new elements are
undefined. */
#define VLA_PTR_EXPAND(vla, n) \
do { \
vla_ptr_t *const _expand_vla_ptr = &(vla); \
const size_t _new_length = (n) + _expand_vla_ptr->length; \
\
if (VARRAY_SIZE (_expand_vla_ptr->varray) < _new_length) \
VARRAY_GROW (_expand_vla_ptr->varray, \
(_new_length - _expand_vla_ptr->length < 128 \
? _expand_vla_ptr->length + 128 : _new_length)); \
_expand_vla_ptr->length = _new_length; \
} while (0)
/* Add element to the end of the vla. */
#define VLA_PTR_ADD(vla, ptr) \
do { \
vla_ptr_t *const _vla_ptr = &(vla); \
\
VLA_PTR_EXPAND (*_vla_ptr, 1); \
VARRAY_GENERIC_PTR (_vla_ptr->varray, _vla_ptr->length - 1) = (ptr);\
} while (0)
/* Length of the vla in elements. */
#define VLA_PTR_LENGTH(vla) ((vla).length)
/* N-th element of the vla. */
#define VLA_PTR(vla, n) VARRAY_GENERIC_PTR ((vla).varray, n)
/* The following macros are analogous to the previous ones but for
VLAs of HOST WIDE INTs. */
#define VLA_HWINT_CREATE(vla, allocated_length, name) \
do { \
vla_hwint_t *const _vla_ptr = &(vla); \
\
VARRAY_WIDE_INT_INIT (_vla_ptr->varray, allocated_length, name); \
_vla_ptr->length = 0; \
} while (0)
#define VLA_HWINT_DELETE(vla) VARRAY_FREE ((vla).varray)
#define VLA_HWINT_BEGIN(vla) (&VARRAY_WIDE_INT ((vla).varray, 0))
#define VLA_HWINT_NULLIFY(vla) ((vla).length = 0)
#define VLA_HWINT_EXPAND(vla, n) \
do { \
vla_hwint_t *const _expand_vla_ptr = &(vla); \
const size_t _new_length = (n) + _expand_vla_ptr->length; \
\
if (VARRAY_SIZE (_expand_vla_ptr->varray) < _new_length) \
VARRAY_GROW (_expand_vla_ptr->varray, \
(_new_length - _expand_vla_ptr->length < 128 \
? _expand_vla_ptr->length + 128 : _new_length)); \
_expand_vla_ptr->length = _new_length; \
} while (0)
#define VLA_HWINT_ADD(vla, ptr) \
do { \
vla_hwint_t *const _vla_ptr = &(vla); \
\
VLA_HWINT_EXPAND (*_vla_ptr, 1); \
VARRAY_WIDE_INT (_vla_ptr->varray, _vla_ptr->length - 1) = (ptr); \
} while (0)
#define VLA_HWINT_LENGTH(vla) ((vla).length)
#define VLA_HWINT(vla, n) VARRAY_WIDE_INT ((vla).varray, n)
DEF_VEC_I(vect_el_t);
DEF_VEC_ALLOC_I(vect_el_t, heap);
typedef VEC(vect_el_t,heap) *vla_hwint_t;
/* Options with the following names can be set up in automata_option /* Options with the following names can be set up in automata_option
...@@ -727,9 +616,9 @@ enum decl_mode ...@@ -727,9 +616,9 @@ enum decl_mode
rtl.def). */ rtl.def). */
struct unit_decl struct unit_decl
{ {
char *name; const char *name;
/* NULL if the automaton name is absent. */ /* NULL if the automaton name is absent. */
char *automaton_name; const char *automaton_name;
/* If the following value is not zero, the cpu unit reservation is /* If the following value is not zero, the cpu unit reservation is
described in define_query_cpu_unit. */ described in define_query_cpu_unit. */
char query_p; char query_p;
...@@ -789,9 +678,9 @@ struct unit_decl ...@@ -789,9 +678,9 @@ struct unit_decl
struct bypass_decl struct bypass_decl
{ {
int latency; int latency;
char *out_insn_name; const char *out_insn_name;
char *in_insn_name; const char *in_insn_name;
char *bypass_guard_name; const char *bypass_guard_name;
/* The following fields are defined by checker. */ /* The following fields are defined by checker. */
...@@ -805,7 +694,7 @@ struct bypass_decl ...@@ -805,7 +694,7 @@ struct bypass_decl
/* This describes define_automaton (see file rtl.def). */ /* This describes define_automaton (see file rtl.def). */
struct automaton_decl struct automaton_decl
{ {
char *name; const char *name;
/* The following fields are defined by automaton generator. */ /* The following fields are defined by automaton generator. */
...@@ -845,7 +734,7 @@ struct unit_pattern_rel_decl ...@@ -845,7 +734,7 @@ struct unit_pattern_rel_decl
/* This describes define_reservation (see file rtl.def). */ /* This describes define_reservation (see file rtl.def). */
struct reserv_decl struct reserv_decl
{ {
char *name; const char *name;
regexp_t regexp; regexp_t regexp;
/* The following fields are defined by checker. */ /* The following fields are defined by checker. */
...@@ -864,7 +753,7 @@ struct insn_reserv_decl ...@@ -864,7 +753,7 @@ struct insn_reserv_decl
rtx condexp; rtx condexp;
int default_latency; int default_latency;
regexp_t regexp; regexp_t regexp;
char *name; const char *name;
/* The following fields are defined by checker. */ /* The following fields are defined by checker. */
...@@ -938,14 +827,14 @@ enum regexp_mode ...@@ -938,14 +827,14 @@ enum regexp_mode
/* Cpu unit in reservation. */ /* Cpu unit in reservation. */
struct unit_regexp struct unit_regexp
{ {
char *name; const char *name;
unit_decl_t unit_decl; unit_decl_t unit_decl;
}; };
/* Define_reservation in a reservation. */ /* Define_reservation in a reservation. */
struct reserv_regexp struct reserv_regexp
{ {
char *name; const char *name;
struct reserv_decl *reserv_decl; struct reserv_decl *reserv_decl;
}; };
...@@ -1532,8 +1421,8 @@ copy_node (const void *from, size_t size) ...@@ -1532,8 +1421,8 @@ copy_node (const void *from, size_t size)
} }
/* The function checks that NAME does not contain quotes (`"'). */ /* The function checks that NAME does not contain quotes (`"'). */
static char * static const char *
check_name (char * name, pos_t pos ATTRIBUTE_UNUSED) check_name (const char * name, pos_t pos ATTRIBUTE_UNUSED)
{ {
const char *str; const char *str;
...@@ -1545,7 +1434,7 @@ check_name (char * name, pos_t pos ATTRIBUTE_UNUSED) ...@@ -1545,7 +1434,7 @@ check_name (char * name, pos_t pos ATTRIBUTE_UNUSED)
/* Pointers to all declarations during IR generation are stored in the /* Pointers to all declarations during IR generation are stored in the
following. */ following. */
static vla_ptr_t decls; static VEC(decl_t,heap) *decls;
/* Given a pointer to a (char *) and a separator, return an alloc'ed /* Given a pointer to a (char *) and a separator, return an alloc'ed
string containing the next separated element, taking parentheses string containing the next separated element, taking parentheses
...@@ -1553,10 +1442,10 @@ static vla_ptr_t decls; ...@@ -1553,10 +1442,10 @@ static vla_ptr_t decls;
after the string scanned, or the end-of-string. Return NULL if at after the string scanned, or the end-of-string. Return NULL if at
end of string. */ end of string. */
static char * static char *
next_sep_el (char **pstr, int sep, int par_flag) next_sep_el (const char **pstr, int sep, int par_flag)
{ {
char *out_str; char *out_str;
char *p; const char *p;
int pars_num; int pars_num;
int n_spaces; int n_spaces;
...@@ -1601,7 +1490,7 @@ next_sep_el (char **pstr, int sep, int par_flag) ...@@ -1601,7 +1490,7 @@ next_sep_el (char **pstr, int sep, int par_flag)
nonzero value. Return 0 for the null string, -1 if parentheses is nonzero value. Return 0 for the null string, -1 if parentheses is
not balanced. */ not balanced. */
static int static int
n_sep_els (char *s, int sep, int par_flag) n_sep_els (const char *s, int sep, int par_flag)
{ {
int n; int n;
int pars_num; int pars_num;
...@@ -1626,11 +1515,11 @@ n_sep_els (char *s, int sep, int par_flag) ...@@ -1626,11 +1515,11 @@ n_sep_els (char *s, int sep, int par_flag)
function also inserts the end marker NULL at the end of vector. function also inserts the end marker NULL at the end of vector.
Return 0 for the null string, -1 if parentheses are not balanced. */ Return 0 for the null string, -1 if parentheses are not balanced. */
static char ** static char **
get_str_vect (char *str, int *els_num, int sep, int paren_p) get_str_vect (const char *str, int *els_num, int sep, int paren_p)
{ {
int i; int i;
char **vect; char **vect;
char **pstr; const char **pstr;
char *trail; char *trail;
*els_num = n_sep_els (str, sep, paren_p); *els_num = n_sep_els (str, sep, paren_p);
...@@ -1660,8 +1549,7 @@ gen_cpu_unit (rtx def) ...@@ -1660,8 +1549,7 @@ gen_cpu_unit (rtx def)
int vect_length; int vect_length;
int i; int i;
str_cpu_units = get_str_vect ((char *) XSTR (def, 0), &vect_length, ',', str_cpu_units = get_str_vect (XSTR (def, 0), &vect_length, ',', FALSE);
FALSE);
if (str_cpu_units == NULL) if (str_cpu_units == NULL)
fatal ("invalid string `%s' in define_cpu_unit", XSTR (def, 0)); fatal ("invalid string `%s' in define_cpu_unit", XSTR (def, 0));
for (i = 0; i < vect_length; i++) for (i = 0; i < vect_length; i++)
...@@ -1670,11 +1558,11 @@ gen_cpu_unit (rtx def) ...@@ -1670,11 +1558,11 @@ gen_cpu_unit (rtx def)
decl->mode = dm_unit; decl->mode = dm_unit;
decl->pos = 0; decl->pos = 0;
DECL_UNIT (decl)->name = check_name (str_cpu_units [i], decl->pos); DECL_UNIT (decl)->name = check_name (str_cpu_units [i], decl->pos);
DECL_UNIT (decl)->automaton_name = (char *) XSTR (def, 1); DECL_UNIT (decl)->automaton_name = XSTR (def, 1);
DECL_UNIT (decl)->query_p = 0; DECL_UNIT (decl)->query_p = 0;
DECL_UNIT (decl)->min_occ_cycle_num = -1; DECL_UNIT (decl)->min_occ_cycle_num = -1;
DECL_UNIT (decl)->in_set_p = 0; DECL_UNIT (decl)->in_set_p = 0;
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
} }
...@@ -1691,7 +1579,7 @@ gen_query_cpu_unit (rtx def) ...@@ -1691,7 +1579,7 @@ gen_query_cpu_unit (rtx def)
int vect_length; int vect_length;
int i; int i;
str_cpu_units = get_str_vect ((char *) XSTR (def, 0), &vect_length, ',', str_cpu_units = get_str_vect (XSTR (def, 0), &vect_length, ',',
FALSE); FALSE);
if (str_cpu_units == NULL) if (str_cpu_units == NULL)
fatal ("invalid string `%s' in define_query_cpu_unit", XSTR (def, 0)); fatal ("invalid string `%s' in define_query_cpu_unit", XSTR (def, 0));
...@@ -1701,9 +1589,9 @@ gen_query_cpu_unit (rtx def) ...@@ -1701,9 +1589,9 @@ gen_query_cpu_unit (rtx def)
decl->mode = dm_unit; decl->mode = dm_unit;
decl->pos = 0; decl->pos = 0;
DECL_UNIT (decl)->name = check_name (str_cpu_units [i], decl->pos); DECL_UNIT (decl)->name = check_name (str_cpu_units [i], decl->pos);
DECL_UNIT (decl)->automaton_name = (char *) XSTR (def, 1); DECL_UNIT (decl)->automaton_name = XSTR (def, 1);
DECL_UNIT (decl)->query_p = 1; DECL_UNIT (decl)->query_p = 1;
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
} }
...@@ -1723,10 +1611,10 @@ gen_bypass (rtx def) ...@@ -1723,10 +1611,10 @@ gen_bypass (rtx def)
int in_length; int in_length;
int i, j; int i, j;
out_insns = get_str_vect ((char *) XSTR (def, 1), &out_length, ',', FALSE); out_insns = get_str_vect (XSTR (def, 1), &out_length, ',', FALSE);
if (out_insns == NULL) if (out_insns == NULL)
fatal ("invalid string `%s' in define_bypass", XSTR (def, 1)); fatal ("invalid string `%s' in define_bypass", XSTR (def, 1));
in_insns = get_str_vect ((char *) XSTR (def, 2), &in_length, ',', FALSE); in_insns = get_str_vect (XSTR (def, 2), &in_length, ',', FALSE);
if (in_insns == NULL) if (in_insns == NULL)
fatal ("invalid string `%s' in define_bypass", XSTR (def, 2)); fatal ("invalid string `%s' in define_bypass", XSTR (def, 2));
for (i = 0; i < out_length; i++) for (i = 0; i < out_length; i++)
...@@ -1738,8 +1626,8 @@ gen_bypass (rtx def) ...@@ -1738,8 +1626,8 @@ gen_bypass (rtx def)
DECL_BYPASS (decl)->latency = XINT (def, 0); DECL_BYPASS (decl)->latency = XINT (def, 0);
DECL_BYPASS (decl)->out_insn_name = out_insns [i]; DECL_BYPASS (decl)->out_insn_name = out_insns [i];
DECL_BYPASS (decl)->in_insn_name = in_insns [j]; DECL_BYPASS (decl)->in_insn_name = in_insns [j];
DECL_BYPASS (decl)->bypass_guard_name = (char *) XSTR (def, 3); DECL_BYPASS (decl)->bypass_guard_name = XSTR (def, 3);
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
} }
...@@ -1760,10 +1648,10 @@ gen_excl_set (rtx def) ...@@ -1760,10 +1648,10 @@ gen_excl_set (rtx def)
int i; int i;
first_str_cpu_units first_str_cpu_units
= get_str_vect ((char *) XSTR (def, 0), &first_vect_length, ',', FALSE); = get_str_vect (XSTR (def, 0), &first_vect_length, ',', FALSE);
if (first_str_cpu_units == NULL) if (first_str_cpu_units == NULL)
fatal ("invalid first string `%s' in exclusion_set", XSTR (def, 0)); fatal ("invalid first string `%s' in exclusion_set", XSTR (def, 0));
second_str_cpu_units = get_str_vect ((char *) XSTR (def, 1), &length, ',', second_str_cpu_units = get_str_vect (XSTR (def, 1), &length, ',',
FALSE); FALSE);
if (second_str_cpu_units == NULL) if (second_str_cpu_units == NULL)
fatal ("invalid second string `%s' in exclusion_set", XSTR (def, 1)); fatal ("invalid second string `%s' in exclusion_set", XSTR (def, 1));
...@@ -1779,7 +1667,7 @@ gen_excl_set (rtx def) ...@@ -1779,7 +1667,7 @@ gen_excl_set (rtx def)
else else
DECL_EXCL (decl)->names [i] DECL_EXCL (decl)->names [i]
= second_str_cpu_units [i - first_vect_length]; = second_str_cpu_units [i - first_vect_length];
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
...@@ -1794,13 +1682,14 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p) ...@@ -1794,13 +1682,14 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p)
{ {
decl_t decl; decl_t decl;
char **str_cpu_units; char **str_cpu_units;
char **str_pattern_lists;
char ***str_patterns; char ***str_patterns;
int cpu_units_length; int cpu_units_length;
int length; int length;
int patterns_length; int patterns_length;
int i; int i;
str_cpu_units = get_str_vect ((char *) XSTR (def, 0), &cpu_units_length, ',', str_cpu_units = get_str_vect (XSTR (def, 0), &cpu_units_length, ',',
FALSE); FALSE);
if (str_cpu_units == NULL) if (str_cpu_units == NULL)
fatal ((presence_p fatal ((presence_p
...@@ -1811,9 +1700,9 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p) ...@@ -1811,9 +1700,9 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p)
? "invalid first string `%s' in final_absence_set" ? "invalid first string `%s' in final_absence_set"
: "invalid first string `%s' in absence_set")), : "invalid first string `%s' in absence_set")),
XSTR (def, 0)); XSTR (def, 0));
str_patterns = (char ***) get_str_vect ((char *) XSTR (def, 1), str_pattern_lists = get_str_vect (XSTR (def, 1),
&patterns_length, ',', FALSE); &patterns_length, ',', FALSE);
if (str_patterns == NULL) if (str_pattern_lists == NULL)
fatal ((presence_p fatal ((presence_p
? (final_p ? (final_p
? "invalid second string `%s' in final_presence_set" ? "invalid second string `%s' in final_presence_set"
...@@ -1821,10 +1710,11 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p) ...@@ -1821,10 +1710,11 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p)
: (final_p : (final_p
? "invalid second string `%s' in final_absence_set" ? "invalid second string `%s' in final_absence_set"
: "invalid second string `%s' in absence_set")), XSTR (def, 1)); : "invalid second string `%s' in absence_set")), XSTR (def, 1));
str_patterns = obstack_alloc (&irp, patterns_length * sizeof (char **));
for (i = 0; i < patterns_length; i++) for (i = 0; i < patterns_length; i++)
{ {
str_patterns [i] = get_str_vect ((char *) str_patterns [i], &length, ' ', str_patterns [i] = get_str_vect (str_pattern_lists [i],
FALSE); &length, ' ', FALSE);
gcc_assert (str_patterns [i]); gcc_assert (str_patterns [i]);
} }
decl = create_node (sizeof (struct decl)); decl = create_node (sizeof (struct decl));
...@@ -1847,7 +1737,7 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p) ...@@ -1847,7 +1737,7 @@ gen_presence_absence_set (rtx def, int presence_p, int final_p)
DECL_ABSENCE (decl)->patterns_num = patterns_length; DECL_ABSENCE (decl)->patterns_num = patterns_length;
DECL_ABSENCE (decl)->final_p = final_p; DECL_ABSENCE (decl)->final_p = final_p;
} }
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
...@@ -1908,8 +1798,7 @@ gen_automaton (rtx def) ...@@ -1908,8 +1798,7 @@ gen_automaton (rtx def)
int vect_length; int vect_length;
int i; int i;
str_automata = get_str_vect ((char *) XSTR (def, 0), &vect_length, ',', str_automata = get_str_vect (XSTR (def, 0), &vect_length, ',', FALSE);
FALSE);
if (str_automata == NULL) if (str_automata == NULL)
fatal ("invalid string `%s' in define_automaton", XSTR (def, 0)); fatal ("invalid string `%s' in define_automaton", XSTR (def, 0));
for (i = 0; i < vect_length; i++) for (i = 0; i < vect_length; i++)
...@@ -1918,7 +1807,7 @@ gen_automaton (rtx def) ...@@ -1918,7 +1807,7 @@ gen_automaton (rtx def)
decl->mode = dm_automaton; decl->mode = dm_automaton;
decl->pos = 0; decl->pos = 0;
DECL_AUTOMATON (decl)->name = check_name (str_automata [i], decl->pos); DECL_AUTOMATON (decl)->name = check_name (str_automata [i], decl->pos);
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
} }
...@@ -1951,13 +1840,14 @@ gen_automata_option (rtx def) ...@@ -1951,13 +1840,14 @@ gen_automata_option (rtx def)
/* The following string contains original reservation string being /* The following string contains original reservation string being
parsed. */ parsed. */
static char *reserv_str; static const char *reserv_str;
/* Parse an element in STR. */ /* Parse an element in STR. */
static regexp_t static regexp_t
gen_regexp_el (char *str) gen_regexp_el (const char *str)
{ {
regexp_t regexp; regexp_t regexp;
char *dstr;
int len; int len;
if (*str == '(') if (*str == '(')
...@@ -1965,8 +1855,10 @@ gen_regexp_el (char *str) ...@@ -1965,8 +1855,10 @@ gen_regexp_el (char *str)
len = strlen (str); len = strlen (str);
if (str [len - 1] != ')') if (str [len - 1] != ')')
fatal ("garbage after ) in reservation `%s'", reserv_str); fatal ("garbage after ) in reservation `%s'", reserv_str);
str [len - 1] = '\0'; dstr = alloca (len - 1);
regexp = gen_regexp_sequence (str + 1); memcpy (dstr, str + 1, len - 2);
dstr [len-2] = '\0';
regexp = gen_regexp_sequence (dstr);
} }
else if (strcmp (str, NOTHING_NAME) == 0) else if (strcmp (str, NOTHING_NAME) == 0)
{ {
...@@ -1984,7 +1876,7 @@ gen_regexp_el (char *str) ...@@ -1984,7 +1876,7 @@ gen_regexp_el (char *str)
/* Parse construction `repeat' in STR. */ /* Parse construction `repeat' in STR. */
static regexp_t static regexp_t
gen_regexp_repeat (char *str) gen_regexp_repeat (const char *str)
{ {
regexp_t regexp; regexp_t regexp;
regexp_t repeat; regexp_t repeat;
...@@ -2017,7 +1909,7 @@ gen_regexp_repeat (char *str) ...@@ -2017,7 +1909,7 @@ gen_regexp_repeat (char *str)
/* Parse reservation STR which possibly contains separator '+'. */ /* Parse reservation STR which possibly contains separator '+'. */
static regexp_t static regexp_t
gen_regexp_allof (char *str) gen_regexp_allof (const char *str)
{ {
regexp_t allof; regexp_t allof;
char **allof_vect; char **allof_vect;
...@@ -2043,7 +1935,7 @@ gen_regexp_allof (char *str) ...@@ -2043,7 +1935,7 @@ gen_regexp_allof (char *str)
/* Parse reservation STR which possibly contains separator '|'. */ /* Parse reservation STR which possibly contains separator '|'. */
static regexp_t static regexp_t
gen_regexp_oneof (char *str) gen_regexp_oneof (const char *str)
{ {
regexp_t oneof; regexp_t oneof;
char **oneof_vect; char **oneof_vect;
...@@ -2069,7 +1961,7 @@ gen_regexp_oneof (char *str) ...@@ -2069,7 +1961,7 @@ gen_regexp_oneof (char *str)
/* Parse reservation STR which possibly contains separator ','. */ /* Parse reservation STR which possibly contains separator ','. */
static regexp_t static regexp_t
gen_regexp_sequence (char *str) gen_regexp_sequence (const char *str)
{ {
regexp_t sequence; regexp_t sequence;
char **sequence_vect; char **sequence_vect;
...@@ -2094,7 +1986,7 @@ gen_regexp_sequence (char *str) ...@@ -2094,7 +1986,7 @@ gen_regexp_sequence (char *str)
/* Parse construction reservation STR. */ /* Parse construction reservation STR. */
static regexp_t static regexp_t
gen_regexp (char *str) gen_regexp (const char *str)
{ {
reserv_str = str; reserv_str = str;
return gen_regexp_sequence (str);; return gen_regexp_sequence (str);;
...@@ -2113,9 +2005,9 @@ gen_reserv (rtx def) ...@@ -2113,9 +2005,9 @@ gen_reserv (rtx def)
decl = create_node (sizeof (struct decl)); decl = create_node (sizeof (struct decl));
decl->mode = dm_reserv; decl->mode = dm_reserv;
decl->pos = 0; decl->pos = 0;
DECL_RESERV (decl)->name = check_name ((char *) XSTR (def, 0), decl->pos); DECL_RESERV (decl)->name = check_name (XSTR (def, 0), decl->pos);
DECL_RESERV (decl)->regexp = gen_regexp ((char *) XSTR (def, 1)); DECL_RESERV (decl)->regexp = gen_regexp (XSTR (def, 1));
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
...@@ -2133,11 +2025,11 @@ gen_insn_reserv (rtx def) ...@@ -2133,11 +2025,11 @@ gen_insn_reserv (rtx def)
decl->mode = dm_insn_reserv; decl->mode = dm_insn_reserv;
decl->pos = 0; decl->pos = 0;
DECL_INSN_RESERV (decl)->name DECL_INSN_RESERV (decl)->name
= check_name ((char *) XSTR (def, 0), decl->pos); = check_name (XSTR (def, 0), decl->pos);
DECL_INSN_RESERV (decl)->default_latency = XINT (def, 1); DECL_INSN_RESERV (decl)->default_latency = XINT (def, 1);
DECL_INSN_RESERV (decl)->condexp = XEXP (def, 2); DECL_INSN_RESERV (decl)->condexp = XEXP (def, 2);
DECL_INSN_RESERV (decl)->regexp = gen_regexp ((char *) XSTR (def, 3)); DECL_INSN_RESERV (decl)->regexp = gen_regexp (XSTR (def, 3));
VLA_PTR_ADD (decls, decl); VEC_safe_push (decl_t,heap, decls, decl);
num_dfa_decls++; num_dfa_decls++;
} }
...@@ -2223,7 +2115,7 @@ static struct decl work_automaton_decl; ...@@ -2223,7 +2115,7 @@ static struct decl work_automaton_decl;
declaration. The function returns node found in the table, NULL if declaration. The function returns node found in the table, NULL if
such node does not exist in the table. */ such node does not exist in the table. */
static decl_t static decl_t
find_automaton_decl (char *name) find_automaton_decl (const char *name)
{ {
void *entry; void *entry;
...@@ -2322,7 +2214,7 @@ static struct decl work_insn_decl; ...@@ -2322,7 +2214,7 @@ static struct decl work_insn_decl;
declaration. The function returns node found in the table, NULL if declaration. The function returns node found in the table, NULL if
such node does not exist in the table. */ such node does not exist in the table. */
static decl_t static decl_t
find_insn_decl (char *name) find_insn_decl (const char *name)
{ {
void *entry; void *entry;
...@@ -2422,7 +2314,7 @@ static struct decl work_decl; ...@@ -2422,7 +2314,7 @@ static struct decl work_decl;
returns node found in the table, NULL if such node does not exist returns node found in the table, NULL if such node does not exist
in the table. */ in the table. */
static decl_t static decl_t
find_decl (char *name) find_decl (const char *name)
{ {
void *entry; void *entry;
...@@ -3537,7 +3429,7 @@ add_advance_cycle_insn_decl (void) ...@@ -3537,7 +3429,7 @@ add_advance_cycle_insn_decl (void)
advance_cycle_insn_decl->mode = dm_insn_reserv; advance_cycle_insn_decl->mode = dm_insn_reserv;
advance_cycle_insn_decl->pos = no_pos; advance_cycle_insn_decl->pos = no_pos;
DECL_INSN_RESERV (advance_cycle_insn_decl)->regexp = NULL; DECL_INSN_RESERV (advance_cycle_insn_decl)->regexp = NULL;
DECL_INSN_RESERV (advance_cycle_insn_decl)->name = (char *) "$advance_cycle"; DECL_INSN_RESERV (advance_cycle_insn_decl)->name = "$advance_cycle";
DECL_INSN_RESERV (advance_cycle_insn_decl)->insn_num DECL_INSN_RESERV (advance_cycle_insn_decl)->insn_num
= description->insns_num; = description->insns_num;
description->decls [description->decls_num] = advance_cycle_insn_decl; description->decls [description->decls_num] = advance_cycle_insn_decl;
...@@ -3628,47 +3520,50 @@ alt_state_cmp (const void *alt_state_ptr_1, const void *alt_state_ptr_2) ...@@ -3628,47 +3520,50 @@ alt_state_cmp (const void *alt_state_ptr_1, const void *alt_state_ptr_2)
/* The function sorts ALT_STATES_LIST and removes duplicated alt /* The function sorts ALT_STATES_LIST and removes duplicated alt
states from the list. The comparison key is alt state unique states from the list. The comparison key is alt state unique
number. */ number. */
static alt_state_t static alt_state_t
uniq_sort_alt_states (alt_state_t alt_states_list) uniq_sort_alt_states (alt_state_t alt_states_list)
{ {
alt_state_t curr_alt_state; alt_state_t curr_alt_state;
vla_ptr_t alt_states; VEC(alt_state_t,heap) *alt_states;
size_t i; size_t i;
size_t prev_unique_state_ind; size_t prev_unique_state_ind;
alt_state_t result; alt_state_t result;
alt_state_t *result_ptr;
VLA_PTR_CREATE (alt_states, 150, "alt_states"); if (alt_states_list == 0)
return 0;
if (alt_states_list->next_alt_state == 0)
return alt_states_list;
alt_states = VEC_alloc (alt_state_t,heap, 150);
for (curr_alt_state = alt_states_list; for (curr_alt_state = alt_states_list;
curr_alt_state != NULL; curr_alt_state != NULL;
curr_alt_state = curr_alt_state->next_alt_state) curr_alt_state = curr_alt_state->next_alt_state)
VLA_PTR_ADD (alt_states, curr_alt_state); VEC_safe_push (alt_state_t,heap, alt_states, curr_alt_state);
qsort (VLA_PTR_BEGIN (alt_states), VLA_PTR_LENGTH (alt_states),
qsort (VEC_address (alt_state_t, alt_states),
VEC_length (alt_state_t, alt_states),
sizeof (alt_state_t), alt_state_cmp); sizeof (alt_state_t), alt_state_cmp);
if (VLA_PTR_LENGTH (alt_states) == 0)
result = NULL;
else
{
result_ptr = VLA_PTR_BEGIN (alt_states);
prev_unique_state_ind = 0; prev_unique_state_ind = 0;
for (i = 1; i < VLA_PTR_LENGTH (alt_states); i++) for (i = 1; i < VEC_length (alt_state_t, alt_states); i++)
if (result_ptr [prev_unique_state_ind]->state != result_ptr [i]->state) if (VEC_index (alt_state_t, alt_states, prev_unique_state_ind)->state
!= VEC_index (alt_state_t, alt_states, i)->state)
{ {
prev_unique_state_ind++; prev_unique_state_ind++;
result_ptr [prev_unique_state_ind] = result_ptr [i]; VEC_replace (alt_state_t, alt_states, prev_unique_state_ind,
VEC_index (alt_state_t, alt_states, i));
} }
#if 0 VEC_truncate (alt_state_t, alt_states, prev_unique_state_ind + 1);
for (i = prev_unique_state_ind + 1; i < VLA_PTR_LENGTH (alt_states); i++)
free_alt_state (result_ptr [i]); for (i = 1; i < VEC_length (alt_state_t, alt_states); i++)
#endif VEC_index (alt_state_t, alt_states, i-1)->next_sorted_alt_state
VLA_PTR_SHORTEN (alt_states, i - prev_unique_state_ind - 1); = VEC_index (alt_state_t, alt_states, i);
result_ptr = VLA_PTR_BEGIN (alt_states); VEC_last (alt_state_t, alt_states)->next_sorted_alt_state = 0;
for (i = 1; i < VLA_PTR_LENGTH (alt_states); i++)
result_ptr [i - 1]->next_sorted_alt_state = result_ptr [i]; result = VEC_index (alt_state_t, alt_states, 0);
result_ptr [i - 1]->next_sorted_alt_state = NULL;
result = *result_ptr; VEC_free (alt_state_t,heap, alt_states);
}
VLA_PTR_DELETE (alt_states);
return result; return result;
} }
...@@ -3736,11 +3631,7 @@ static int els_in_cycle_reserv; ...@@ -3736,11 +3631,7 @@ static int els_in_cycle_reserv;
variable value * number of bits in set_el_t. */ variable value * number of bits in set_el_t. */
static int els_in_reservs; static int els_in_reservs;
/* VLA for representation of array of pointers to unit /* Array of pointers to unit declarations. */
declarations. */
static vla_ptr_t units_container;
/* The start address of the array. */
static unit_decl_t *units_array; static unit_decl_t *units_array;
/* Temporary reservation of maximal length. */ /* Temporary reservation of maximal length. */
...@@ -3749,9 +3640,9 @@ static reserv_sets_t temp_reserv; ...@@ -3749,9 +3640,9 @@ static reserv_sets_t temp_reserv;
/* The state table itself is represented by the following variable. */ /* The state table itself is represented by the following variable. */
static htab_t state_table; static htab_t state_table;
/* VLA for representation of array of pointers to free nodes /* Linked list of free 'state' structures to be recycled. The
`state'. */ next_equiv_class_state pointer is borrowed for a free list. */
static vla_ptr_t free_states; static state_t first_free_state;
static int curr_unique_state_num; static int curr_unique_state_num;
...@@ -4053,10 +3944,12 @@ get_free_state (int with_reservs, automaton_t automaton) ...@@ -4053,10 +3944,12 @@ get_free_state (int with_reservs, automaton_t automaton)
state_t result; state_t result;
gcc_assert (max_cycles_num > 0 && automaton); gcc_assert (max_cycles_num > 0 && automaton);
if (VLA_PTR_LENGTH (free_states) != 0) if (first_free_state)
{ {
result = VLA_PTR (free_states, VLA_PTR_LENGTH (free_states) - 1); result = first_free_state;
VLA_PTR_SHORTEN (free_states, 1); first_free_state = result->next_equiv_class_state;
result->next_equiv_class_state = NULL;
result->automaton = automaton; result->automaton = automaton;
result->first_out_arc = NULL; result->first_out_arc = NULL;
result->it_was_placed_in_stack_for_NDFA_forming = 0; result->it_was_placed_in_stack_for_NDFA_forming = 0;
...@@ -4091,7 +3984,8 @@ static void ...@@ -4091,7 +3984,8 @@ static void
free_state (state_t state) free_state (state_t state)
{ {
free_alt_states (state->component_states); free_alt_states (state->component_states);
VLA_PTR_ADD (free_states, state); state->next_equiv_class_state = first_free_state;
first_free_state = state;
} }
/* Hash value of STATE. If STATE represents deterministic state it is /* Hash value of STATE. If STATE represents deterministic state it is
...@@ -4232,10 +4126,11 @@ initiate_states (void) ...@@ -4232,10 +4126,11 @@ initiate_states (void)
decl_t decl; decl_t decl;
int i; int i;
VLA_PTR_CREATE (units_container, description->units_num, "units_container"); if (description->units_num)
units_array units_array = xmalloc (description->units_num * sizeof (unit_decl_t));
= (description->decls_num && description->units_num else
? VLA_PTR_BEGIN (units_container) : NULL); units_array = 0;
for (i = 0; i < description->decls_num; i++) for (i = 0; i < description->decls_num; i++)
{ {
decl = description->decls [i]; decl = description->decls [i];
...@@ -4249,7 +4144,6 @@ initiate_states (void) ...@@ -4249,7 +4144,6 @@ initiate_states (void)
els_in_reservs = els_in_cycle_reserv * max_cycles_num; els_in_reservs = els_in_cycle_reserv * max_cycles_num;
curr_unique_state_num = 0; curr_unique_state_num = 0;
initiate_alt_states (); initiate_alt_states ();
VLA_PTR_CREATE (free_states, 1500, "free states");
state_table = htab_create (1500, state_hash, state_eq_p, (htab_del) 0); state_table = htab_create (1500, state_hash, state_eq_p, (htab_del) 0);
temp_reserv = alloc_empty_reserv_sets (); temp_reserv = alloc_empty_reserv_sets ();
} }
...@@ -4258,9 +4152,10 @@ initiate_states (void) ...@@ -4258,9 +4152,10 @@ initiate_states (void)
static void static void
finish_states (void) finish_states (void)
{ {
VLA_PTR_DELETE (units_container); free (units_array);
units_array = 0;
htab_delete (state_table); htab_delete (state_table);
VLA_PTR_DELETE (free_states); first_free_state = NULL;
finish_alt_states (); finish_alt_states ();
} }
...@@ -5337,6 +5232,10 @@ struct unit_usage ...@@ -5337,6 +5232,10 @@ struct unit_usage
same alternative. */ same alternative. */
struct unit_usage *next; struct unit_usage *next;
}; };
typedef struct unit_usage *unit_usage_t;
DEF_VEC_P(unit_usage_t);
DEF_VEC_ALLOC_P(unit_usage_t,heap);
/* Obstack for unit_usage structures. */ /* Obstack for unit_usage structures. */
static struct obstack unit_usages; static struct obstack unit_usages;
...@@ -5347,7 +5246,7 @@ static struct obstack unit_usages; ...@@ -5347,7 +5246,7 @@ static struct obstack unit_usages;
alternative with given number are referred through element with alternative with given number are referred through element with
index equals to the cycle * number of all alternatives in the regexp index equals to the cycle * number of all alternatives in the regexp
+ the alternative number. */ + the alternative number. */
static vla_ptr_t cycle_alt_unit_usages; static VEC(unit_usage_t,heap) *cycle_alt_unit_usages;
/* The following function creates the structure unit_usage for UNIT on /* The following function creates the structure unit_usage for UNIT on
CYCLE in REGEXP alternative with ALT_NUM. The structure is made CYCLE in REGEXP alternative with ALT_NUM. The structure is made
...@@ -5356,29 +5255,26 @@ static void ...@@ -5356,29 +5255,26 @@ static void
store_alt_unit_usage (regexp_t regexp, regexp_t unit, int cycle, store_alt_unit_usage (regexp_t regexp, regexp_t unit, int cycle,
int alt_num) int alt_num)
{ {
size_t i, length, old_length; size_t length;
unit_decl_t unit_decl; unit_decl_t unit_decl;
struct unit_usage *unit_usage_ptr; unit_usage_t unit_usage_ptr;
int index; int index;
gcc_assert (regexp && regexp->mode == rm_oneof gcc_assert (regexp && regexp->mode == rm_oneof
&& alt_num < REGEXP_ONEOF (regexp)->regexps_num); && alt_num < REGEXP_ONEOF (regexp)->regexps_num);
unit_decl = REGEXP_UNIT (unit)->unit_decl; unit_decl = REGEXP_UNIT (unit)->unit_decl;
old_length = VLA_PTR_LENGTH (cycle_alt_unit_usages);
length = (cycle + 1) * REGEXP_ONEOF (regexp)->regexps_num; length = (cycle + 1) * REGEXP_ONEOF (regexp)->regexps_num;
if (old_length < length) while (VEC_length (unit_usage_t, cycle_alt_unit_usages) < length)
{ VEC_safe_push (unit_usage_t,heap, cycle_alt_unit_usages, 0);
VLA_PTR_EXPAND (cycle_alt_unit_usages, length - old_length);
for (i = old_length; i < length; i++)
VLA_PTR (cycle_alt_unit_usages, i) = NULL;
}
obstack_blank (&unit_usages, sizeof (struct unit_usage)); obstack_blank (&unit_usages, sizeof (struct unit_usage));
unit_usage_ptr = (struct unit_usage *) obstack_base (&unit_usages); unit_usage_ptr = (struct unit_usage *) obstack_base (&unit_usages);
obstack_finish (&unit_usages); obstack_finish (&unit_usages);
unit_usage_ptr->unit_decl = unit_decl; unit_usage_ptr->unit_decl = unit_decl;
index = cycle * REGEXP_ONEOF (regexp)->regexps_num + alt_num; index = cycle * REGEXP_ONEOF (regexp)->regexps_num + alt_num;
unit_usage_ptr->next = VLA_PTR (cycle_alt_unit_usages, index); unit_usage_ptr->next = VEC_index (unit_usage_t, cycle_alt_unit_usages, index);
VLA_PTR (cycle_alt_unit_usages, index) = unit_usage_ptr; VEC_replace (unit_usage_t, cycle_alt_unit_usages, index, unit_usage_ptr);
unit_decl->last_distribution_check_cycle = -1; /* undefined */ unit_decl->last_distribution_check_cycle = -1; /* undefined */
} }
...@@ -5396,7 +5292,8 @@ check_regexp_units_distribution (const char *insn_reserv_name, ...@@ -5396,7 +5292,8 @@ check_regexp_units_distribution (const char *insn_reserv_name,
return; return;
/* Store all unit usages in the regexp: */ /* Store all unit usages in the regexp: */
obstack_init (&unit_usages); obstack_init (&unit_usages);
VLA_PTR_CREATE (cycle_alt_unit_usages, 100, "unit usages on cycles"); cycle_alt_unit_usages = 0;
for (i = REGEXP_ONEOF (regexp)->regexps_num - 1; i >= 0; i--) for (i = REGEXP_ONEOF (regexp)->regexps_num - 1; i >= 0; i--)
{ {
seq = REGEXP_ONEOF (regexp)->regexps [i]; seq = REGEXP_ONEOF (regexp)->regexps [i];
...@@ -5463,31 +5360,33 @@ check_regexp_units_distribution (const char *insn_reserv_name, ...@@ -5463,31 +5360,33 @@ check_regexp_units_distribution (const char *insn_reserv_name,
} }
} }
/* Check distribution: */ /* Check distribution: */
for (i = 0; i < (int) VLA_PTR_LENGTH (cycle_alt_unit_usages); i++) for (i = 0; i < (int) VEC_length (unit_usage_t, cycle_alt_unit_usages); i++)
{ {
cycle = i / REGEXP_ONEOF (regexp)->regexps_num; cycle = i / REGEXP_ONEOF (regexp)->regexps_num;
for (unit_usage_ptr = VLA_PTR (cycle_alt_unit_usages, i); for (unit_usage_ptr = VEC_index (unit_usage_t, cycle_alt_unit_usages, i);
unit_usage_ptr != NULL; unit_usage_ptr != NULL;
unit_usage_ptr = unit_usage_ptr->next) unit_usage_ptr = unit_usage_ptr->next)
if (cycle != unit_usage_ptr->unit_decl->last_distribution_check_cycle) if (cycle != unit_usage_ptr->unit_decl->last_distribution_check_cycle)
{ {
unit_usage_ptr->unit_decl->last_distribution_check_cycle = cycle; unit_usage_ptr->unit_decl->last_distribution_check_cycle = cycle;
for (k = cycle * REGEXP_ONEOF (regexp)->regexps_num; for (k = cycle * REGEXP_ONEOF (regexp)->regexps_num;
k < (int) VLA_PTR_LENGTH (cycle_alt_unit_usages) k < (int) VEC_length (unit_usage_t, cycle_alt_unit_usages)
&& k == cycle * REGEXP_ONEOF (regexp)->regexps_num; && k == cycle * REGEXP_ONEOF (regexp)->regexps_num;
k++) k++)
{ {
for (other_unit_usage_ptr = VLA_PTR (cycle_alt_unit_usages, k); for (other_unit_usage_ptr
= VEC_index (unit_usage_t, cycle_alt_unit_usages, k);
other_unit_usage_ptr != NULL; other_unit_usage_ptr != NULL;
other_unit_usage_ptr = other_unit_usage_ptr->next) other_unit_usage_ptr = other_unit_usage_ptr->next)
if (unit_usage_ptr->unit_decl->automaton_decl if (unit_usage_ptr->unit_decl->automaton_decl
== other_unit_usage_ptr->unit_decl->automaton_decl) == other_unit_usage_ptr->unit_decl->automaton_decl)
break; break;
if (other_unit_usage_ptr == NULL if (other_unit_usage_ptr == NULL
&& VLA_PTR (cycle_alt_unit_usages, k) != NULL) && (VEC_index (unit_usage_t, cycle_alt_unit_usages, k)
!= NULL))
break; break;
} }
if (k < (int) VLA_PTR_LENGTH (cycle_alt_unit_usages) if (k < (int) VEC_length (unit_usage_t, cycle_alt_unit_usages)
&& k == cycle * REGEXP_ONEOF (regexp)->regexps_num) && k == cycle * REGEXP_ONEOF (regexp)->regexps_num)
{ {
if (!annotation_message_reported_p) if (!annotation_message_reported_p)
...@@ -5503,7 +5402,7 @@ check_regexp_units_distribution (const char *insn_reserv_name, ...@@ -5503,7 +5402,7 @@ check_regexp_units_distribution (const char *insn_reserv_name,
} }
} }
} }
VLA_PTR_DELETE (cycle_alt_unit_usages); VEC_free (unit_usage_t,heap, cycle_alt_unit_usages);
obstack_free (&unit_usages, NULL); obstack_free (&unit_usages, NULL);
} }
...@@ -5679,16 +5578,14 @@ create_alt_states (automaton_t automaton) ...@@ -5679,16 +5578,14 @@ create_alt_states (automaton_t automaton)
/* The function forms list of ainsns of AUTOMATON with the same /* The function forms list of ainsns of AUTOMATON with the same
reservation. */ reservation. */
static void static void
form_ainsn_with_same_reservs (automaton_t automaton) form_ainsn_with_same_reservs (automaton_t automaton)
{ {
ainsn_t curr_ainsn; ainsn_t curr_ainsn;
size_t i; size_t i;
vla_ptr_t first_insns; VEC(ainsn_t,heap) *last_insns = VEC_alloc (ainsn_t,heap, 150);
vla_ptr_t last_insns;
VLA_PTR_CREATE (first_insns, 150, "first insns with the same reservs");
VLA_PTR_CREATE (last_insns, 150, "last insns with the same reservs");
for (curr_ainsn = automaton->ainsn_list; for (curr_ainsn = automaton->ainsn_list;
curr_ainsn != NULL; curr_ainsn != NULL;
curr_ainsn = curr_ainsn->next_ainsn) curr_ainsn = curr_ainsn->next_ainsn)
...@@ -5700,28 +5597,26 @@ form_ainsn_with_same_reservs (automaton_t automaton) ...@@ -5700,28 +5597,26 @@ form_ainsn_with_same_reservs (automaton_t automaton)
} }
else else
{ {
for (i = 0; i < VLA_PTR_LENGTH (first_insns); i++) for (i = 0; i < VEC_length (ainsn_t, last_insns); i++)
if (alt_states_eq if (alt_states_eq
(curr_ainsn->sorted_alt_states, (curr_ainsn->sorted_alt_states,
((ainsn_t) VLA_PTR (first_insns, i))->sorted_alt_states)) VEC_index (ainsn_t, last_insns, i)->sorted_alt_states))
break; break;
curr_ainsn->next_same_reservs_insn = NULL; curr_ainsn->next_same_reservs_insn = NULL;
if (i < VLA_PTR_LENGTH (first_insns)) if (i < VEC_length (ainsn_t, last_insns))
{ {
curr_ainsn->first_insn_with_same_reservs = 0; curr_ainsn->first_insn_with_same_reservs = 0;
((ainsn_t) VLA_PTR (last_insns, i))->next_same_reservs_insn VEC_index (ainsn_t, last_insns, i)->next_same_reservs_insn
= curr_ainsn; = curr_ainsn;
VLA_PTR (last_insns, i) = curr_ainsn; VEC_replace (ainsn_t, last_insns, i, curr_ainsn);
} }
else else
{ {
VLA_PTR_ADD (first_insns, curr_ainsn); VEC_safe_push (ainsn_t, heap, last_insns, curr_ainsn);
VLA_PTR_ADD (last_insns, curr_ainsn);
curr_ainsn->first_insn_with_same_reservs = 1; curr_ainsn->first_insn_with_same_reservs = 1;
} }
} }
VLA_PTR_DELETE (first_insns); VEC_free (ainsn_t,heap, last_insns);
VLA_PTR_DELETE (last_insns);
} }
/* Forming unit reservations which can affect creating the automaton /* Forming unit reservations which can affect creating the automaton
...@@ -5753,8 +5648,7 @@ form_reservs_matter (automaton_t automaton) ...@@ -5753,8 +5648,7 @@ form_reservs_matter (automaton_t automaton)
return reservs_matter; return reservs_matter;
} }
/* The following function creates all states of nondeterministic (if /* The following function creates all states of nondeterministic AUTOMATON. */
NDFA_FLAG has nonzero value) or deterministic AUTOMATON. */
static void static void
make_automaton (automaton_t automaton) make_automaton (automaton_t automaton)
{ {
...@@ -5766,21 +5660,19 @@ make_automaton (automaton_t automaton) ...@@ -5766,21 +5660,19 @@ make_automaton (automaton_t automaton)
state_t state2; state_t state2;
ainsn_t advance_cycle_ainsn; ainsn_t advance_cycle_ainsn;
arc_t added_arc; arc_t added_arc;
vla_ptr_t state_stack; VEC(state_t,heap) *state_stack = VEC_alloc(state_t,heap, 150);
int states_n; int states_n;
reserv_sets_t reservs_matter = form_reservs_matter (automaton); reserv_sets_t reservs_matter = form_reservs_matter (automaton);
VLA_PTR_CREATE (state_stack, 150, "state stack");
/* Create the start state (empty state). */ /* Create the start state (empty state). */
start_state = insert_state (get_free_state (1, automaton)); start_state = insert_state (get_free_state (1, automaton));
automaton->start_state = start_state; automaton->start_state = start_state;
start_state->it_was_placed_in_stack_for_NDFA_forming = 1; start_state->it_was_placed_in_stack_for_NDFA_forming = 1;
VLA_PTR_ADD (state_stack, start_state); VEC_safe_push (state_t,heap, state_stack, start_state);
states_n = 1; states_n = 1;
while (VLA_PTR_LENGTH (state_stack) != 0) while (VEC_length (state_t, state_stack) != 0)
{ {
state = VLA_PTR (state_stack, VLA_PTR_LENGTH (state_stack) - 1); state = VEC_pop (state_t, state_stack);
VLA_PTR_SHORTEN (state_stack, 1);
advance_cycle_ainsn = NULL; advance_cycle_ainsn = NULL;
for (ainsn = automaton->ainsn_list; for (ainsn = automaton->ainsn_list;
ainsn != NULL; ainsn != NULL;
...@@ -5805,7 +5697,7 @@ make_automaton (automaton_t automaton) ...@@ -5805,7 +5697,7 @@ make_automaton (automaton_t automaton)
{ {
state2->it_was_placed_in_stack_for_NDFA_forming state2->it_was_placed_in_stack_for_NDFA_forming
= 1; = 1;
VLA_PTR_ADD (state_stack, state2); VEC_safe_push (state_t,heap, state_stack, state2);
states_n++; states_n++;
if (progress_flag && states_n % 100 == 0) if (progress_flag && states_n % 100 == 0)
fprintf (stderr, "."); fprintf (stderr, ".");
...@@ -5836,7 +5728,7 @@ make_automaton (automaton_t automaton) ...@@ -5836,7 +5728,7 @@ make_automaton (automaton_t automaton)
if (!state2->it_was_placed_in_stack_for_NDFA_forming) if (!state2->it_was_placed_in_stack_for_NDFA_forming)
{ {
state2->it_was_placed_in_stack_for_NDFA_forming = 1; state2->it_was_placed_in_stack_for_NDFA_forming = 1;
VLA_PTR_ADD (state_stack, state2); VEC_safe_push (state_t,heap, state_stack, state2);
states_n++; states_n++;
if (progress_flag && states_n % 100 == 0) if (progress_flag && states_n % 100 == 0)
fprintf (stderr, "."); fprintf (stderr, ".");
...@@ -5844,7 +5736,7 @@ make_automaton (automaton_t automaton) ...@@ -5844,7 +5736,7 @@ make_automaton (automaton_t automaton)
gcc_assert (advance_cycle_ainsn); gcc_assert (advance_cycle_ainsn);
add_arc (state, state2, advance_cycle_ainsn, 1); add_arc (state, state2, advance_cycle_ainsn, 1);
} }
VLA_PTR_DELETE (state_stack); VEC_free (state_t,heap, state_stack);
} }
/* Foms lists of all arcs of STATE marked by the same ainsn. */ /* Foms lists of all arcs of STATE marked by the same ainsn. */
...@@ -5874,9 +5766,10 @@ form_arcs_marked_by_insn (state_t state) ...@@ -5874,9 +5766,10 @@ form_arcs_marked_by_insn (state_t state)
ORIGINAL_STATE and list of arcs ARCS_MARKED_BY_INSN marked by the ORIGINAL_STATE and list of arcs ARCS_MARKED_BY_INSN marked by the
same insn. If the composed state is not in STATE_STACK yet, it is same insn. If the composed state is not in STATE_STACK yet, it is
pushed into STATE_STACK. */ pushed into STATE_STACK. */
static int static int
create_composed_state (state_t original_state, arc_t arcs_marked_by_insn, create_composed_state (state_t original_state, arc_t arcs_marked_by_insn,
vla_ptr_t *state_stack) VEC(state_t,heap) **state_stack)
{ {
state_t state; state_t state;
alt_state_t alt_state, curr_alt_state; alt_state_t alt_state, curr_alt_state;
...@@ -5967,33 +5860,34 @@ create_composed_state (state_t original_state, arc_t arcs_marked_by_insn, ...@@ -5967,33 +5860,34 @@ create_composed_state (state_t original_state, arc_t arcs_marked_by_insn,
if (!state->it_was_placed_in_stack_for_DFA_forming) if (!state->it_was_placed_in_stack_for_DFA_forming)
{ {
state->it_was_placed_in_stack_for_DFA_forming = 1; state->it_was_placed_in_stack_for_DFA_forming = 1;
VLA_PTR_ADD (*state_stack, state); VEC_safe_push (state_t,heap, *state_stack, state);
} }
return new_state_p; return new_state_p;
} }
/* The function transforms nondeterministic AUTOMATON into /* The function transforms nondeterministic AUTOMATON into
deterministic. */ deterministic. */
static void static void
NDFA_to_DFA (automaton_t automaton) NDFA_to_DFA (automaton_t automaton)
{ {
state_t start_state; state_t start_state;
state_t state; state_t state;
decl_t decl; decl_t decl;
vla_ptr_t state_stack; VEC(state_t,heap) *state_stack;
int i; int i;
int states_n; int states_n;
VLA_PTR_CREATE (state_stack, 150, "state stack"); state_stack = VEC_alloc (state_t,heap, 0);
/* Create the start state (empty state). */ /* Create the start state (empty state). */
start_state = automaton->start_state; start_state = automaton->start_state;
start_state->it_was_placed_in_stack_for_DFA_forming = 1; start_state->it_was_placed_in_stack_for_DFA_forming = 1;
VLA_PTR_ADD (state_stack, start_state); VEC_safe_push (state_t,heap, state_stack, start_state);
states_n = 1; states_n = 1;
while (VLA_PTR_LENGTH (state_stack) != 0) while (VEC_length (state_t, state_stack) != 0)
{ {
state = VLA_PTR (state_stack, VLA_PTR_LENGTH (state_stack) - 1); state = VEC_pop (state_t, state_stack);
VLA_PTR_SHORTEN (state_stack, 1);
form_arcs_marked_by_insn (state); form_arcs_marked_by_insn (state);
for (i = 0; i < description->decls_num; i++) for (i = 0; i < description->decls_num; i++)
{ {
...@@ -6009,7 +5903,7 @@ NDFA_to_DFA (automaton_t automaton) ...@@ -6009,7 +5903,7 @@ NDFA_to_DFA (automaton_t automaton)
} }
} }
} }
VLA_PTR_DELETE (state_stack); VEC_free (state_t,heap, state_stack);
} }
/* The following variable value is current number (1, 2, ...) of passing /* The following variable value is current number (1, 2, ...) of passing
...@@ -6051,14 +5945,14 @@ initiate_pass_states (void) ...@@ -6051,14 +5945,14 @@ initiate_pass_states (void)
/* The following vla is used for storing pointers to all achieved /* The following vla is used for storing pointers to all achieved
states. */ states. */
static vla_ptr_t all_achieved_states; static VEC(state_t,heap) *all_achieved_states;
/* This function is called by function pass_states to add an achieved /* This function is called by function pass_states to add an achieved
STATE. */ STATE. */
static void static void
add_achieved_state (state_t state) add_achieved_state (state_t state)
{ {
VLA_PTR_ADD (all_achieved_states, state); VEC_safe_push (state_t,heap, all_achieved_states, state);
} }
/* The function sets up equivalence numbers of insns which mark all /* The function sets up equivalence numbers of insns which mark all
...@@ -6102,19 +5996,6 @@ clear_arc_insns_equiv_num (state_t state) ...@@ -6102,19 +5996,6 @@ clear_arc_insns_equiv_num (state_t state)
} }
} }
/* The function copies pointers to equivalent states from vla FROM
into vla TO. */
static void
copy_equiv_class (vla_ptr_t *to, const vla_ptr_t *from)
{
state_t *class_ptr;
VLA_PTR_NULLIFY (*to);
for (class_ptr = VLA_PTR_BEGIN (*from);
class_ptr <= (state_t *) VLA_PTR_LAST (*from);
class_ptr++)
VLA_PTR_ADD (*to, *class_ptr);
}
/* The following function returns TRUE if STATE reserves the unit with /* The following function returns TRUE if STATE reserves the unit with
UNIT_NUM on the first cycle. */ UNIT_NUM on the first cycle. */
...@@ -6178,46 +6059,50 @@ state_is_differed (state_t state, state_t another_state, ...@@ -6178,46 +6059,50 @@ state_is_differed (state_t state, state_t another_state,
/* The function makes initial partition of STATES on equivalent /* The function makes initial partition of STATES on equivalent
classes. */ classes. */
static state_t static state_t
init_equiv_class (state_t *states, int states_num) init_equiv_class (VEC(state_t,heap) *states)
{ {
state_t *state_ptr; size_t i;
state_t result_equiv_class; state_t prev = 0;
result_equiv_class = NULL; for (i = 0; i < VEC_length (state_t, states); i++)
for (state_ptr = states; state_ptr < states + states_num; state_ptr++)
{ {
(*state_ptr)->equiv_class_num_1 = 1; VEC_index (state_t, states, i)->equiv_class_num_1 = 1;
(*state_ptr)->next_equiv_class_state = result_equiv_class; VEC_index (state_t, states, i)->next_equiv_class_state = prev;
result_equiv_class = *state_ptr; prev = VEC_index (state_t, states, i);
} }
return result_equiv_class; return prev;
} }
/* The function processes equivalence class given by its pointer /* The function copies pointers to equivalent states from vla FROM
EQUIV_CLASS_PTR on odd iteration if ODD_ITERATION_FLAG. If there into vla TO. */
static void
copy_equiv_class (VEC(state_t,heap) **to, VEC(state_t,heap) *from)
{
VEC_free (state_t,heap, *to);
*to = VEC_copy (state_t,heap, from);
}
/* The function processes equivalence class given by its first state,
FIRST_STATE, on odd iteration if ODD_ITERATION_FLAG. If there
are not equivalent states, the function partitions the class are not equivalent states, the function partitions the class
removing nonequivalent states and placing them in removing nonequivalent states and placing them in
*NEXT_ITERATION_CLASSES, increments *NEW_EQUIV_CLASS_NUM_PTR ans *NEXT_ITERATION_CLASSES, increments *NEW_EQUIV_CLASS_NUM_PTR ans
assigns it to the state equivalence number. If the class has been assigns it to the state equivalence number. If the class has been
partitioned, the function returns nonzero value. */ partitioned, the function returns nonzero value. */
static int static int
partition_equiv_class (state_t *equiv_class_ptr, int odd_iteration_flag, partition_equiv_class (state_t first_state, int odd_iteration_flag,
vla_ptr_t *next_iteration_classes, VEC(state_t,heap) **next_iteration_classes,
int *new_equiv_class_num_ptr) int *new_equiv_class_num_ptr)
{ {
state_t new_equiv_class; state_t new_equiv_class;
int partition_p; int partition_p;
state_t first_state;
state_t curr_state; state_t curr_state;
state_t prev_state; state_t prev_state;
state_t next_state; state_t next_state;
int out_arcs_num; int out_arcs_num;
partition_p = 0; partition_p = 0;
gcc_assert (*equiv_class_ptr);
for (first_state = *equiv_class_ptr; while (first_state != NULL)
first_state != NULL;
first_state = new_equiv_class)
{ {
new_equiv_class = NULL; new_equiv_class = NULL;
if (first_state->next_equiv_class_state != NULL) if (first_state->next_equiv_class_state != NULL)
...@@ -6253,62 +6138,64 @@ partition_equiv_class (state_t *equiv_class_ptr, int odd_iteration_flag, ...@@ -6253,62 +6138,64 @@ partition_equiv_class (state_t *equiv_class_ptr, int odd_iteration_flag,
clear_arc_insns_equiv_num (first_state); clear_arc_insns_equiv_num (first_state);
} }
if (new_equiv_class != NULL) if (new_equiv_class != NULL)
VLA_PTR_ADD (*next_iteration_classes, new_equiv_class); VEC_safe_push (state_t,heap, *next_iteration_classes, new_equiv_class);
first_state = new_equiv_class;
} }
return partition_p; return partition_p;
} }
/* The function finds equivalent states of AUTOMATON. */ /* The function finds equivalent states of AUTOMATON. */
static void static void
evaluate_equiv_classes (automaton_t automaton, vla_ptr_t *equiv_classes) evaluate_equiv_classes (automaton_t automaton,
VEC(state_t,heap) **equiv_classes)
{ {
state_t new_equiv_class; state_t new_equiv_class;
int new_equiv_class_num; int new_equiv_class_num;
int odd_iteration_flag; int odd_iteration_flag;
int finish_flag; int finish_flag;
vla_ptr_t next_iteration_classes; VEC (state_t,heap) *next_iteration_classes;
state_t *equiv_class_ptr; size_t i;
state_t *state_ptr;
VLA_PTR_CREATE (all_achieved_states, 1500, "all achieved states"); all_achieved_states = VEC_alloc (state_t,heap, 1500);
pass_states (automaton, add_achieved_state); pass_states (automaton, add_achieved_state);
new_equiv_class = init_equiv_class (VLA_PTR_BEGIN (all_achieved_states), new_equiv_class = init_equiv_class (all_achieved_states);
VLA_PTR_LENGTH (all_achieved_states));
odd_iteration_flag = 0; odd_iteration_flag = 0;
new_equiv_class_num = 1; new_equiv_class_num = 1;
VLA_PTR_CREATE (next_iteration_classes, 150, "next iteration classes");
VLA_PTR_ADD (next_iteration_classes, new_equiv_class); next_iteration_classes = VEC_alloc (state_t,heap, 150);
VEC_quick_push (state_t, next_iteration_classes, new_equiv_class);
do do
{ {
odd_iteration_flag = !odd_iteration_flag; odd_iteration_flag = !odd_iteration_flag;
finish_flag = 1; finish_flag = 1;
copy_equiv_class (equiv_classes, &next_iteration_classes); copy_equiv_class (equiv_classes, next_iteration_classes);
/* Transfer equiv numbers for the next iteration. */ /* Transfer equiv numbers for the next iteration. */
for (state_ptr = VLA_PTR_BEGIN (all_achieved_states); for (i = 0; i < VEC_length (state_t, all_achieved_states); i++)
state_ptr <= (state_t *) VLA_PTR_LAST (all_achieved_states);
state_ptr++)
if (odd_iteration_flag) if (odd_iteration_flag)
(*state_ptr)->equiv_class_num_2 = (*state_ptr)->equiv_class_num_1; VEC_index (state_t, all_achieved_states, i)->equiv_class_num_2
= VEC_index (state_t, all_achieved_states, i)->equiv_class_num_1;
else else
(*state_ptr)->equiv_class_num_1 = (*state_ptr)->equiv_class_num_2; VEC_index (state_t, all_achieved_states, i)->equiv_class_num_1
for (equiv_class_ptr = VLA_PTR_BEGIN (*equiv_classes); = VEC_index (state_t, all_achieved_states, i)->equiv_class_num_2;
equiv_class_ptr <= (state_t *) VLA_PTR_LAST (*equiv_classes);
equiv_class_ptr++) for (i = 0; i < VEC_length (state_t, *equiv_classes); i++)
if (partition_equiv_class (equiv_class_ptr, odd_iteration_flag, if (partition_equiv_class (VEC_index (state_t, *equiv_classes, i),
odd_iteration_flag,
&next_iteration_classes, &next_iteration_classes,
&new_equiv_class_num)) &new_equiv_class_num))
finish_flag = 0; finish_flag = 0;
} }
while (!finish_flag); while (!finish_flag);
VLA_PTR_DELETE (next_iteration_classes); VEC_free (state_t,heap, next_iteration_classes);
VLA_PTR_DELETE (all_achieved_states); VEC_free (state_t,heap, all_achieved_states);
} }
/* The function merges equivalent states of AUTOMATON. */ /* The function merges equivalent states of AUTOMATON. */
static void static void
merge_states (automaton_t automaton, vla_ptr_t *equiv_classes) merge_states (automaton_t automaton, VEC(state_t,heap) *equiv_classes)
{ {
state_t *equiv_class_ptr;
state_t curr_state; state_t curr_state;
state_t new_state; state_t new_state;
state_t first_class_state; state_t first_class_state;
...@@ -6316,19 +6203,20 @@ merge_states (automaton_t automaton, vla_ptr_t *equiv_classes) ...@@ -6316,19 +6203,20 @@ merge_states (automaton_t automaton, vla_ptr_t *equiv_classes)
alt_state_t alt_state, new_alt_state; alt_state_t alt_state, new_alt_state;
arc_t curr_arc; arc_t curr_arc;
arc_t next_arc; arc_t next_arc;
size_t i;
/* Create states corresponding to equivalence classes containing two /* Create states corresponding to equivalence classes containing two
or more states. */ or more states. */
for (equiv_class_ptr = VLA_PTR_BEGIN (*equiv_classes); for (i = 0; i < VEC_length (state_t, equiv_classes); i++)
equiv_class_ptr <= (state_t *) VLA_PTR_LAST (*equiv_classes); {
equiv_class_ptr++) curr_state = VEC_index (state_t, equiv_classes, i);
if ((*equiv_class_ptr)->next_equiv_class_state != NULL) if (curr_state->next_equiv_class_state != NULL)
{ {
/* There are more one states in the class equivalence. */ /* There are more one states in the class equivalence. */
/* Create new compound state. */ /* Create new compound state. */
new_state = get_free_state (0, automaton); new_state = get_free_state (0, automaton);
alt_states = NULL; alt_states = NULL;
first_class_state = *equiv_class_ptr; first_class_state = curr_state;
for (curr_state = first_class_state; for (curr_state = first_class_state;
curr_state != NULL; curr_state != NULL;
curr_state = curr_state->next_equiv_class_state) curr_state = curr_state->next_equiv_class_state)
...@@ -6357,13 +6245,15 @@ merge_states (automaton_t automaton, vla_ptr_t *equiv_classes) ...@@ -6357,13 +6245,15 @@ merge_states (automaton_t automaton, vla_ptr_t *equiv_classes)
new_state->component_states = uniq_sort_alt_states (alt_states); new_state->component_states = uniq_sort_alt_states (alt_states);
} }
else else
(*equiv_class_ptr)->equiv_class_state = *equiv_class_ptr; curr_state->equiv_class_state = curr_state;
for (equiv_class_ptr = VLA_PTR_BEGIN (*equiv_classes); }
equiv_class_ptr <= (state_t *) VLA_PTR_LAST (*equiv_classes);
equiv_class_ptr++) for (i = 0; i < VEC_length (state_t, equiv_classes); i++)
if ((*equiv_class_ptr)->next_equiv_class_state != NULL)
{ {
first_class_state = *equiv_class_ptr; curr_state = VEC_index (state_t, equiv_classes, i);
if (curr_state->next_equiv_class_state != NULL)
{
first_class_state = curr_state;
/* Create new arcs output from the state corresponding to /* Create new arcs output from the state corresponding to
equiv class. */ equiv class. */
for (curr_arc = first_out_arc (first_class_state); for (curr_arc = first_out_arc (first_class_state);
...@@ -6393,11 +6283,12 @@ merge_states (automaton_t automaton, vla_ptr_t *equiv_classes) ...@@ -6393,11 +6283,12 @@ merge_states (automaton_t automaton, vla_ptr_t *equiv_classes)
{ {
/* Change `to_state' of arcs output from the state of given /* Change `to_state' of arcs output from the state of given
equivalence class. */ equivalence class. */
for (curr_arc = first_out_arc (*equiv_class_ptr); for (curr_arc = first_out_arc (curr_state);
curr_arc != NULL; curr_arc != NULL;
curr_arc = next_out_arc (curr_arc)) curr_arc = next_out_arc (curr_arc))
curr_arc->to_state = curr_arc->to_state->equiv_class_state; curr_arc->to_state = curr_arc->to_state->equiv_class_state;
} }
}
} }
/* The function sets up new_cycle_p for states if there is arc to the /* The function sets up new_cycle_p for states if there is arc to the
...@@ -6418,13 +6309,13 @@ set_new_cycle_flags (state_t state) ...@@ -6418,13 +6309,13 @@ set_new_cycle_flags (state_t state)
static void static void
minimize_DFA (automaton_t automaton) minimize_DFA (automaton_t automaton)
{ {
vla_ptr_t equiv_classes; VEC(state_t,heap) *equiv_classes = 0;
VLA_PTR_CREATE (equiv_classes, 1500, "equivalence classes");
evaluate_equiv_classes (automaton, &equiv_classes); evaluate_equiv_classes (automaton, &equiv_classes);
merge_states (automaton, &equiv_classes); merge_states (automaton, equiv_classes);
pass_states (automaton, set_new_cycle_flags); pass_states (automaton, set_new_cycle_flags);
VLA_PTR_DELETE (equiv_classes);
VEC_free (state_t,heap, equiv_classes);
} }
/* Values of two variables are counted number of states and arcs in an /* Values of two variables are counted number of states and arcs in an
...@@ -6623,21 +6514,15 @@ static void ...@@ -6623,21 +6514,15 @@ static void
process_state_for_insn_equiv_partition (state_t state) process_state_for_insn_equiv_partition (state_t state)
{ {
arc_t arc; arc_t arc;
arc_t *insn_arcs_array; arc_t *insn_arcs_array = xmalloc (description->insns_num * sizeof(arc_t));
int i;
vla_ptr_t insn_arcs_vect;
VLA_PTR_CREATE (insn_arcs_vect, 500, "insn arcs vector");
VLA_PTR_EXPAND (insn_arcs_vect, description->insns_num);
insn_arcs_array = VLA_PTR_BEGIN (insn_arcs_vect);
/* Process insns of the arcs. */ /* Process insns of the arcs. */
for (i = 0; i < description->insns_num; i++)
insn_arcs_array [i] = NULL;
for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc)) for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc))
insn_arcs_array [arc->insn->insn_reserv_decl->insn_num] = arc; insn_arcs_array [arc->insn->insn_reserv_decl->insn_num] = arc;
for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc)) for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc))
process_insn_equiv_class (arc->insn, insn_arcs_array); process_insn_equiv_class (arc->insn, insn_arcs_array);
VLA_PTR_DELETE (insn_arcs_vect);
free (insn_arcs_array);
} }
/* The function searches for equivalent ainsns of AUTOMATON. */ /* The function searches for equivalent ainsns of AUTOMATON. */
...@@ -6745,56 +6630,53 @@ compare_max_occ_cycle_nums (const void *unit_decl_1, ...@@ -6745,56 +6630,53 @@ compare_max_occ_cycle_nums (const void *unit_decl_1,
/* The function makes heuristic assigning automata to units. Actually /* The function makes heuristic assigning automata to units. Actually
efficacy of the algorithm has been checked yet??? */ efficacy of the algorithm has been checked yet??? */
static void static void
units_to_automata_heuristic_distr (void) units_to_automata_heuristic_distr (void)
{ {
double estimation_bound; double estimation_bound;
decl_t decl;
decl_t *unit_decl_ptr;
int automaton_num; int automaton_num;
int rest_units_num; int rest_units_num;
double bound_value; double bound_value;
vla_ptr_t unit_decls; unit_decl_t *unit_decls;
int i; int i, j;
if (description->units_num == 0) if (description->units_num == 0)
return; return;
estimation_bound = estimate_one_automaton_bound (); estimation_bound = estimate_one_automaton_bound ();
VLA_PTR_CREATE (unit_decls, 150, "unit decls"); unit_decls = xmalloc (description->units_num * sizeof (unit_decl_t));
for (i = 0; i < description->decls_num; i++)
{ for (i = 0, j = 0; i < description->decls_num; i++)
decl = description->decls [i]; if (description->decls[i]->mode == dm_unit)
if (decl->mode == dm_unit) unit_decls[j++] = DECL_UNIT (description->decls[i]);
VLA_PTR_ADD (unit_decls, decl); gcc_assert (j == description->units_num);
}
qsort (VLA_PTR_BEGIN (unit_decls), VLA_PTR_LENGTH (unit_decls), qsort (unit_decls, description->units_num,
sizeof (decl_t), compare_max_occ_cycle_nums); sizeof (unit_decl_t), compare_max_occ_cycle_nums);
automaton_num = 0; automaton_num = 0;
unit_decl_ptr = VLA_PTR_BEGIN (unit_decls); bound_value = unit_decls[0]->max_occ_cycle_num;
bound_value = DECL_UNIT (*unit_decl_ptr)->max_occ_cycle_num; unit_decls[0]->corresponding_automaton_num = automaton_num;
DECL_UNIT (*unit_decl_ptr)->corresponding_automaton_num = automaton_num;
for (unit_decl_ptr++; for (i = 1; i < description->units_num; i++)
unit_decl_ptr <= (decl_t *) VLA_PTR_LAST (unit_decls); {
unit_decl_ptr++) rest_units_num = description->units_num - i + 1;
{
rest_units_num
= ((decl_t *) VLA_PTR_LAST (unit_decls) - unit_decl_ptr + 1);
gcc_assert (automata_num - automaton_num - 1 <= rest_units_num); gcc_assert (automata_num - automaton_num - 1 <= rest_units_num);
if (automaton_num < automata_num - 1 if (automaton_num < automata_num - 1
&& ((automata_num - automaton_num - 1 == rest_units_num) && ((automata_num - automaton_num - 1 == rest_units_num)
|| (bound_value || (bound_value
> (estimation_bound > (estimation_bound
/ (DECL_UNIT (*unit_decl_ptr)->max_occ_cycle_num))))) / unit_decls[i]->max_occ_cycle_num))))
{ {
bound_value = DECL_UNIT (*unit_decl_ptr)->max_occ_cycle_num; bound_value = unit_decls[i]->max_occ_cycle_num;
automaton_num++; automaton_num++;
} }
else else
bound_value *= DECL_UNIT (*unit_decl_ptr)->max_occ_cycle_num; bound_value *= unit_decls[i]->max_occ_cycle_num;
DECL_UNIT (*unit_decl_ptr)->corresponding_automaton_num = automaton_num; unit_decls[i]->corresponding_automaton_num = automaton_num;
} }
gcc_assert (automaton_num == automata_num - 1); gcc_assert (automaton_num == automata_num - 1);
VLA_PTR_DELETE (unit_decls); free (unit_decls);
} }
/* The functions creates automaton insns for each automata. Automaton /* The functions creates automaton insns for each automata. Automaton
...@@ -7174,34 +7056,29 @@ output_dfa_max_issue_rate (void) ...@@ -7174,34 +7056,29 @@ output_dfa_max_issue_rate (void)
MAX_DFA_ISSUE_RATE_VAR_NAME, max_dfa_issue_rate); MAX_DFA_ISSUE_RATE_VAR_NAME, max_dfa_issue_rate);
} }
/* The function outputs all initialization values of VECT with length /* The function outputs all initialization values of VECT. */
vect_length. */
static void static void
output_vect (vect_el_t *vect, int vect_length) output_vect (vla_hwint_t vect)
{ {
int els_on_line; int els_on_line;
size_t vect_length = VEC_length (vect_el_t, vect);
size_t i;
els_on_line = 1; els_on_line = 1;
if (vect_length == 0) if (vect_length == 0)
fprintf (output_file, fputs ("0 /* This is dummy el because the vect is empty */", output_file);
"0 /* This is dummy el because the vect is empty */");
else else
for (i = 0; i < vect_length; i++)
{ {
do fprintf (output_file, "%5ld", (long) VEC_index (vect_el_t, vect, i));
{
fprintf (output_file, "%5ld", (long) *vect);
vect_length--;
if (els_on_line == 10) if (els_on_line == 10)
{ {
els_on_line = 0; els_on_line = 0;
fprintf (output_file, ",\n"); fputs (",\n", output_file);
} }
else if (vect_length != 0) else if (i < vect_length-1)
fprintf (output_file, ", "); fputs (", ", output_file);
els_on_line++; els_on_line++;
vect++;
}
while (vect_length != 0);
} }
} }
...@@ -7514,14 +7391,18 @@ output_translate_vect (automaton_t automaton) ...@@ -7514,14 +7391,18 @@ output_translate_vect (automaton_t automaton)
int insn_value; int insn_value;
vla_hwint_t translate_vect; vla_hwint_t translate_vect;
VLA_HWINT_CREATE (translate_vect, 250, "translate vector"); translate_vect = VEC_alloc (vect_el_t,heap, description->insns_num);
VLA_HWINT_EXPAND (translate_vect, description->insns_num);
for (insn_value = 0; insn_value < description->insns_num; insn_value++) for (insn_value = 0; insn_value < description->insns_num; insn_value++)
/* Undefined value */ /* Undefined value */
VLA_HWINT (translate_vect, insn_value) = automaton->insn_equiv_classes_num; VEC_quick_push (vect_el_t, translate_vect,
automaton->insn_equiv_classes_num);
for (ainsn = automaton->ainsn_list; ainsn != NULL; ainsn = ainsn->next_ainsn) for (ainsn = automaton->ainsn_list; ainsn != NULL; ainsn = ainsn->next_ainsn)
VLA_HWINT (translate_vect, ainsn->insn_reserv_decl->insn_num) VEC_replace (vect_el_t, translate_vect,
= ainsn->insn_equiv_class_num; ainsn->insn_reserv_decl->insn_num,
ainsn->insn_equiv_class_num);
fprintf (output_file, fprintf (output_file,
"/* Vector translating external insn codes to internal ones.*/\n"); "/* Vector translating external insn codes to internal ones.*/\n");
fprintf (output_file, "static const "); fprintf (output_file, "static const ");
...@@ -7529,10 +7410,9 @@ output_translate_vect (automaton_t automaton) ...@@ -7529,10 +7410,9 @@ output_translate_vect (automaton_t automaton)
fprintf (output_file, " "); fprintf (output_file, " ");
output_translate_vect_name (output_file, automaton); output_translate_vect_name (output_file, automaton);
fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n"); fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n");
output_vect (VLA_HWINT_BEGIN (translate_vect), output_vect (translate_vect);
VLA_HWINT_LENGTH (translate_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
VLA_HWINT_DELETE (translate_vect); VEC_free (vect_el_t,heap, translate_vect);
} }
/* The value in a table state x ainsn -> something which represents /* The value in a table state x ainsn -> something which represents
...@@ -7544,8 +7424,8 @@ static int undefined_vect_el_value; ...@@ -7544,8 +7424,8 @@ static int undefined_vect_el_value;
static int static int
comb_vect_p (state_ainsn_table_t tab) comb_vect_p (state_ainsn_table_t tab)
{ {
return (2 * VLA_HWINT_LENGTH (tab->full_vect) return (2 * VEC_length (vect_el_t, tab->full_vect)
> 5 * VLA_HWINT_LENGTH (tab->comb_vect)); > 5 * VEC_length (vect_el_t, tab->comb_vect));
} }
/* The following function creates new table for AUTOMATON. */ /* The following function creates new table for AUTOMATON. */
...@@ -7558,16 +7438,20 @@ create_state_ainsn_table (automaton_t automaton) ...@@ -7558,16 +7438,20 @@ create_state_ainsn_table (automaton_t automaton)
tab = create_node (sizeof (struct state_ainsn_table)); tab = create_node (sizeof (struct state_ainsn_table));
tab->automaton = automaton; tab->automaton = automaton;
VLA_HWINT_CREATE (tab->comb_vect, 10000, "comb vector");
VLA_HWINT_CREATE (tab->check_vect, 10000, "check vector"); tab->comb_vect = VEC_alloc (vect_el_t,heap, 10000);
VLA_HWINT_CREATE (tab->base_vect, 1000, "base vector"); tab->check_vect = VEC_alloc (vect_el_t,heap, 10000);
VLA_HWINT_EXPAND (tab->base_vect, automaton->achieved_states_num);
VLA_HWINT_CREATE (tab->full_vect, 10000, "full vector"); tab->base_vect = 0;
VEC_safe_grow (vect_el_t,heap, tab->base_vect,
automaton->achieved_states_num);
full_vect_length = (automaton->insn_equiv_classes_num full_vect_length = (automaton->insn_equiv_classes_num
* automaton->achieved_states_num); * automaton->achieved_states_num);
VLA_HWINT_EXPAND (tab->full_vect, full_vect_length); tab->full_vect = VEC_alloc (vect_el_t,heap, full_vect_length);
for (i = 0; i < full_vect_length; i++) for (i = 0; i < full_vect_length; i++)
VLA_HWINT (tab->full_vect, i) = undefined_vect_el_value; VEC_quick_push (vect_el_t, tab->full_vect, undefined_vect_el_value);
tab->min_base_vect_el_value = 0; tab->min_base_vect_el_value = 0;
tab->max_base_vect_el_value = 0; tab->max_base_vect_el_value = 0;
tab->min_comb_vect_el_value = 0; tab->min_comb_vect_el_value = 0;
...@@ -7578,7 +7462,7 @@ create_state_ainsn_table (automaton_t automaton) ...@@ -7578,7 +7462,7 @@ create_state_ainsn_table (automaton_t automaton)
/* The following function outputs the best C representation of the /* The following function outputs the best C representation of the
table TAB of given TABLE_NAME. */ table TAB of given TABLE_NAME. */
static void static void
output_state_ainsn_table (state_ainsn_table_t tab, char *table_name, output_state_ainsn_table (state_ainsn_table_t tab, const char *table_name,
void (*output_full_vect_name_func) (FILE *, automaton_t), void (*output_full_vect_name_func) (FILE *, automaton_t),
void (*output_comb_vect_name_func) (FILE *, automaton_t), void (*output_comb_vect_name_func) (FILE *, automaton_t),
void (*output_check_vect_name_func) (FILE *, automaton_t), void (*output_check_vect_name_func) (FILE *, automaton_t),
...@@ -7593,8 +7477,7 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name, ...@@ -7593,8 +7477,7 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name,
fprintf (output_file, " "); fprintf (output_file, " ");
(*output_full_vect_name_func) (output_file, tab->automaton); (*output_full_vect_name_func) (output_file, tab->automaton);
fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n"); fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n");
output_vect (VLA_HWINT_BEGIN (tab->full_vect), output_vect (tab->full_vect);
VLA_HWINT_LENGTH (tab->full_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
} }
else else
...@@ -7606,8 +7489,7 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name, ...@@ -7606,8 +7489,7 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name,
fprintf (output_file, " "); fprintf (output_file, " ");
(*output_comb_vect_name_func) (output_file, tab->automaton); (*output_comb_vect_name_func) (output_file, tab->automaton);
fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n"); fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n");
output_vect (VLA_HWINT_BEGIN (tab->comb_vect), output_vect (tab->comb_vect);
VLA_HWINT_LENGTH (tab->comb_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
fprintf (output_file, "/* Check vector for %s. */\n", table_name); fprintf (output_file, "/* Check vector for %s. */\n", table_name);
fprintf (output_file, "static const "); fprintf (output_file, "static const ");
...@@ -7615,8 +7497,7 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name, ...@@ -7615,8 +7497,7 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name,
fprintf (output_file, " "); fprintf (output_file, " ");
(*output_check_vect_name_func) (output_file, tab->automaton); (*output_check_vect_name_func) (output_file, tab->automaton);
fprintf (output_file, "[] = {\n"); fprintf (output_file, "[] = {\n");
output_vect (VLA_HWINT_BEGIN (tab->check_vect), output_vect (tab->check_vect);
VLA_HWINT_LENGTH (tab->check_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
fprintf (output_file, "/* Base vector for %s. */\n", table_name); fprintf (output_file, "/* Base vector for %s. */\n", table_name);
fprintf (output_file, "static const "); fprintf (output_file, "static const ");
...@@ -7625,22 +7506,18 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name, ...@@ -7625,22 +7506,18 @@ output_state_ainsn_table (state_ainsn_table_t tab, char *table_name,
fprintf (output_file, " "); fprintf (output_file, " ");
(*output_base_vect_name_func) (output_file, tab->automaton); (*output_base_vect_name_func) (output_file, tab->automaton);
fprintf (output_file, "[] = {\n"); fprintf (output_file, "[] = {\n");
output_vect (VLA_HWINT_BEGIN (tab->base_vect), output_vect (tab->base_vect);
VLA_HWINT_LENGTH (tab->base_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
} }
} }
/* The following function adds vector with length VECT_LENGTH and /* The following function adds vector VECT to table TAB as its line
elements pointed to by VECT to table TAB as its line with number with number VECT_NUM. */
VECT_NUM. */
static void static void
add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, add_vect (state_ainsn_table_t tab, int vect_num, vla_hwint_t vect)
int vect_length)
{ {
int real_vect_length; int vect_length;
vect_el_t *comb_vect_start; size_t real_vect_length;
vect_el_t *check_vect_start;
int comb_vect_index; int comb_vect_index;
int comb_vect_els_num; int comb_vect_els_num;
int vect_index; int vect_index;
...@@ -7651,23 +7528,30 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7651,23 +7528,30 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
int i; int i;
unsigned long vect_mask, comb_vect_mask; unsigned long vect_mask, comb_vect_mask;
vect_length = VEC_length (vect_el_t, vect);
gcc_assert (vect_length); gcc_assert (vect_length);
gcc_assert (VEC_last (vect_el_t, vect) != undefined_vect_el_value);
real_vect_length = tab->automaton->insn_equiv_classes_num; real_vect_length = tab->automaton->insn_equiv_classes_num;
gcc_assert (vect [vect_length - 1] != undefined_vect_el_value);
/* Form full vector in the table: */ /* Form full vector in the table: */
{
size_t full_base = tab->automaton->insn_equiv_classes_num * vect_num;
if (VEC_length (vect_el_t, tab->full_vect) < full_base + vect_length)
VEC_safe_grow (vect_el_t,heap, tab->full_vect,
full_base + vect_length);
for (i = 0; i < vect_length; i++) for (i = 0; i < vect_length; i++)
VLA_HWINT (tab->full_vect, VEC_replace (vect_el_t, tab->full_vect, full_base + i,
i + tab->automaton->insn_equiv_classes_num * vect_num) VEC_index (vect_el_t, vect, i));
= vect [i]; }
/* Form comb vector in the table: */ /* Form comb vector in the table: */
gcc_assert (VLA_HWINT_LENGTH (tab->comb_vect) gcc_assert (VEC_length (vect_el_t, tab->comb_vect)
== VLA_HWINT_LENGTH (tab->check_vect)); == VEC_length (vect_el_t, tab->check_vect));
comb_vect_start = VLA_HWINT_BEGIN (tab->comb_vect);
comb_vect_els_num = VLA_HWINT_LENGTH (tab->comb_vect); comb_vect_els_num = VEC_length (vect_el_t, tab->comb_vect);
for (first_unempty_vect_index = 0; for (first_unempty_vect_index = 0;
first_unempty_vect_index < vect_length; first_unempty_vect_index < vect_length;
first_unempty_vect_index++) first_unempty_vect_index++)
if (vect [first_unempty_vect_index] != undefined_vect_el_value) if (VEC_index (vect_el_t, vect, first_unempty_vect_index)
!= undefined_vect_el_value)
break; break;
/* Search for the place in comb vect for the inserted vect. */ /* Search for the place in comb vect for the inserted vect. */
...@@ -7683,8 +7567,10 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7683,8 +7567,10 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
vect_index < vect_length vect_index < vect_length
&& vect_index + comb_vect_index < comb_vect_els_num; && vect_index + comb_vect_index < comb_vect_els_num;
vect_index++) vect_index++)
if (vect [vect_index] != undefined_vect_el_value if (VEC_index (vect_el_t, vect, vect_index)
&& (comb_vect_start [vect_index + comb_vect_index] != undefined_vect_el_value
&& (VEC_index (vect_el_t, tab->comb_vect,
vect_index + comb_vect_index)
!= undefined_vect_el_value)) != undefined_vect_el_value))
break; break;
if (vect_index >= vect_length if (vect_index >= vect_length
...@@ -7701,7 +7587,7 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7701,7 +7587,7 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
vect_index++) vect_index++)
{ {
vect_mask = vect_mask << 1; vect_mask = vect_mask << 1;
if (vect [vect_index] != undefined_vect_el_value) if (VEC_index (vect_el_t, vect, vect_index) != undefined_vect_el_value)
vect_mask |= 1; vect_mask |= 1;
} }
...@@ -7717,7 +7603,7 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7717,7 +7603,7 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
{ {
comb_vect_mask <<= 1; comb_vect_mask <<= 1;
if (vect_index + comb_vect_index < comb_vect_els_num if (vect_index + comb_vect_index < comb_vect_els_num
&& comb_vect_start [vect_index + comb_vect_index] && VEC_index (vect_el_t, tab->comb_vect, vect_index + comb_vect_index)
!= undefined_vect_el_value) != undefined_vect_el_value)
comb_vect_mask |= 1; comb_vect_mask |= 1;
} }
...@@ -7728,7 +7614,8 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7728,7 +7614,8 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
comb_vect_index++, i++) comb_vect_index++, i++)
{ {
comb_vect_mask = (comb_vect_mask << 1) | 1; comb_vect_mask = (comb_vect_mask << 1) | 1;
comb_vect_mask ^= comb_vect_start [i] == undefined_vect_el_value; comb_vect_mask ^= (VEC_index (vect_el_t, tab->comb_vect, i)
== undefined_vect_el_value);
if ((vect_mask & comb_vect_mask) == 0) if ((vect_mask & comb_vect_mask) == 0)
goto found; goto found;
} }
...@@ -7749,27 +7636,29 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7749,27 +7636,29 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
no_state_value = tab->automaton->achieved_states_num; no_state_value = tab->automaton->achieved_states_num;
while (additional_els_num > 0) while (additional_els_num > 0)
{ {
VLA_HWINT_ADD (tab->comb_vect, vect_el); VEC_safe_push (vect_el_t,heap, tab->comb_vect, vect_el);
VLA_HWINT_ADD (tab->check_vect, no_state_value); VEC_safe_push (vect_el_t,heap, tab->check_vect, no_state_value);
additional_els_num--; additional_els_num--;
} }
comb_vect_start = VLA_HWINT_BEGIN (tab->comb_vect); gcc_assert (VEC_length (vect_el_t, tab->comb_vect)
check_vect_start = VLA_HWINT_BEGIN (tab->check_vect); >= comb_vect_index + real_vect_length);
gcc_assert (VLA_HWINT_LENGTH (tab->comb_vect)
>= (size_t) (comb_vect_index + real_vect_length));
/* Fill comb and check vectors. */ /* Fill comb and check vectors. */
for (vect_index = 0; vect_index < vect_length; vect_index++) for (vect_index = 0; vect_index < vect_length; vect_index++)
if (vect [vect_index] != undefined_vect_el_value) if (VEC_index (vect_el_t, vect, vect_index) != undefined_vect_el_value)
{ {
gcc_assert (comb_vect_start [comb_vect_index + vect_index] vect_el_t x = VEC_index (vect_el_t, vect, vect_index);
gcc_assert (VEC_index (vect_el_t, tab->comb_vect,
comb_vect_index + vect_index)
== undefined_vect_el_value); == undefined_vect_el_value);
comb_vect_start [comb_vect_index + vect_index] = vect [vect_index]; gcc_assert (x >= 0);
gcc_assert (vect [vect_index] >= 0); if (tab->max_comb_vect_el_value < x)
if (tab->max_comb_vect_el_value < vect [vect_index]) tab->max_comb_vect_el_value = x;
tab->max_comb_vect_el_value = vect [vect_index]; if (tab->min_comb_vect_el_value > x)
if (tab->min_comb_vect_el_value > vect [vect_index]) tab->min_comb_vect_el_value = x;
tab->min_comb_vect_el_value = vect [vect_index]; VEC_replace (vect_el_t, tab->comb_vect,
check_vect_start [comb_vect_index + vect_index] = vect_num; comb_vect_index + vect_index, x);
VEC_replace (vect_el_t, tab->check_vect,
comb_vect_index + vect_index, vect_num);
} }
if (tab->max_comb_vect_el_value < undefined_vect_el_value) if (tab->max_comb_vect_el_value < undefined_vect_el_value)
tab->max_comb_vect_el_value = undefined_vect_el_value; tab->max_comb_vect_el_value = undefined_vect_el_value;
...@@ -7779,7 +7668,8 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect, ...@@ -7779,7 +7668,8 @@ add_vect (state_ainsn_table_t tab, int vect_num, vect_el_t *vect,
tab->max_base_vect_el_value = comb_vect_index; tab->max_base_vect_el_value = comb_vect_index;
if (tab->min_base_vect_el_value > comb_vect_index) if (tab->min_base_vect_el_value > comb_vect_index)
tab->min_base_vect_el_value = comb_vect_index; tab->min_base_vect_el_value = comb_vect_index;
VLA_HWINT (tab->base_vect, vect_num) = comb_vect_index;
VEC_replace (vect_el_t, tab->base_vect, vect_num, comb_vect_index);
} }
/* Return number of out arcs of STATE. */ /* Return number of out arcs of STATE. */
...@@ -7827,22 +7717,22 @@ add_vect_el (vla_hwint_t *vect, ainsn_t ainsn, int el_value) ...@@ -7827,22 +7717,22 @@ add_vect_el (vla_hwint_t *vect, ainsn_t ainsn, int el_value)
gcc_assert (ainsn); gcc_assert (ainsn);
equiv_class_num = ainsn->insn_equiv_class_num; equiv_class_num = ainsn->insn_equiv_class_num;
for (vect_index = VLA_HWINT_LENGTH (*vect); for (vect_index = VEC_length (vect_el_t, *vect);
vect_index <= equiv_class_num; vect_index <= equiv_class_num;
vect_index++) vect_index++)
VLA_HWINT_ADD (*vect, undefined_vect_el_value); VEC_safe_push (vect_el_t,heap, *vect, undefined_vect_el_value);
VLA_HWINT (*vect, equiv_class_num) = el_value; VEC_replace (vect_el_t, *vect, equiv_class_num, el_value);
} }
/* This is for forming vector of states of an automaton. */ /* This is for forming vector of states of an automaton. */
static vla_ptr_t output_states_vect; static VEC(state_t,heap) *output_states_vect;
/* The function is called by function pass_states. The function adds /* The function is called by function pass_states. The function adds
STATE to `output_states_vect'. */ STATE to `output_states_vect'. */
static void static void
add_states_vect_el (state_t state) add_states_vect_el (state_t state)
{ {
VLA_PTR_ADD (output_states_vect, state); VEC_safe_push (state_t,heap, output_states_vect, state);
} }
/* Form and output vectors (comb, check, base or full vector) /* Form and output vectors (comb, check, base or full vector)
...@@ -7850,26 +7740,24 @@ add_states_vect_el (state_t state) ...@@ -7850,26 +7740,24 @@ add_states_vect_el (state_t state)
static void static void
output_trans_table (automaton_t automaton) output_trans_table (automaton_t automaton)
{ {
state_t *state_ptr; size_t i;
arc_t arc; arc_t arc;
vla_hwint_t transition_vect; vla_hwint_t transition_vect = 0;
undefined_vect_el_value = automaton->achieved_states_num; undefined_vect_el_value = automaton->achieved_states_num;
automaton->trans_table = create_state_ainsn_table (automaton); automaton->trans_table = create_state_ainsn_table (automaton);
/* Create vect of pointers to states ordered by num of transitions /* Create vect of pointers to states ordered by num of transitions
from the state (state with the maximum num is the first). */ from the state (state with the maximum num is the first). */
VLA_PTR_CREATE (output_states_vect, 1500, "output states vector"); output_states_vect = 0;
pass_states (automaton, add_states_vect_el); pass_states (automaton, add_states_vect_el);
qsort (VLA_PTR_BEGIN (output_states_vect), qsort (VEC_address (state_t, output_states_vect),
VLA_PTR_LENGTH (output_states_vect), VEC_length (state_t, output_states_vect),
sizeof (state_t), compare_transition_els_num); sizeof (state_t), compare_transition_els_num);
VLA_HWINT_CREATE (transition_vect, 500, "transition vector");
for (state_ptr = VLA_PTR_BEGIN (output_states_vect); for (i = 0; i < VEC_length (state_t, output_states_vect); i++)
state_ptr <= (state_t *) VLA_PTR_LAST (output_states_vect);
state_ptr++)
{ {
VLA_HWINT_NULLIFY (transition_vect); VEC_truncate (vect_el_t, transition_vect, 0);
for (arc = first_out_arc (*state_ptr); for (arc = first_out_arc (VEC_index (state_t, output_states_vect, i));
arc != NULL; arc != NULL;
arc = next_out_arc (arc)) arc = next_out_arc (arc))
{ {
...@@ -7878,16 +7766,17 @@ output_trans_table (automaton_t automaton) ...@@ -7878,16 +7766,17 @@ output_trans_table (automaton_t automaton)
add_vect_el (&transition_vect, arc->insn, add_vect_el (&transition_vect, arc->insn,
arc->to_state->order_state_num); arc->to_state->order_state_num);
} }
add_vect (automaton->trans_table, (*state_ptr)->order_state_num, add_vect (automaton->trans_table,
VLA_HWINT_BEGIN (transition_vect), VEC_index (state_t, output_states_vect, i)->order_state_num,
VLA_HWINT_LENGTH (transition_vect)); transition_vect);
} }
output_state_ainsn_table output_state_ainsn_table
(automaton->trans_table, (char *) "state transitions", (automaton->trans_table, "state transitions",
output_trans_full_vect_name, output_trans_comb_vect_name, output_trans_full_vect_name, output_trans_comb_vect_name,
output_trans_check_vect_name, output_trans_base_vect_name); output_trans_check_vect_name, output_trans_base_vect_name);
VLA_PTR_DELETE (output_states_vect);
VLA_HWINT_DELETE (transition_vect); VEC_free (state_t,heap, output_states_vect);
VEC_free (vect_el_t,heap, transition_vect);
} }
/* Form and output vectors (comb, check, base or simple vect) /* Form and output vectors (comb, check, base or simple vect)
...@@ -7897,7 +7786,7 @@ output_trans_table (automaton_t automaton) ...@@ -7897,7 +7786,7 @@ output_trans_table (automaton_t automaton)
static void static void
output_state_alts_table (automaton_t automaton) output_state_alts_table (automaton_t automaton)
{ {
state_t *state_ptr; size_t i;
arc_t arc; arc_t arc;
vla_hwint_t state_alts_vect; vla_hwint_t state_alts_vect;
...@@ -7905,19 +7794,19 @@ output_state_alts_table (automaton_t automaton) ...@@ -7905,19 +7794,19 @@ output_state_alts_table (automaton_t automaton)
automaton->state_alts_table = create_state_ainsn_table (automaton); automaton->state_alts_table = create_state_ainsn_table (automaton);
/* Create vect of pointers to states ordered by num of transitions /* Create vect of pointers to states ordered by num of transitions
from the state (state with the maximum num is the first). */ from the state (state with the maximum num is the first). */
VLA_PTR_CREATE (output_states_vect, 1500, "output states vector"); output_states_vect = 0;
pass_states (automaton, add_states_vect_el); pass_states (automaton, add_states_vect_el);
qsort (VLA_PTR_BEGIN (output_states_vect), qsort (VEC_address (state_t, output_states_vect),
VLA_PTR_LENGTH (output_states_vect), VEC_length (state_t, output_states_vect),
sizeof (state_t), compare_transition_els_num); sizeof (state_t), compare_transition_els_num);
/* Create base, comb, and check vectors. */ /* Create base, comb, and check vectors. */
VLA_HWINT_CREATE (state_alts_vect, 500, "state alts vector"); state_alts_vect = 0;
for (state_ptr = VLA_PTR_BEGIN (output_states_vect);
state_ptr <= (state_t *) VLA_PTR_LAST (output_states_vect); for (i = 0; i < VEC_length (state_t, output_states_vect); i++)
state_ptr++)
{ {
VLA_HWINT_NULLIFY (state_alts_vect); VEC_truncate (vect_el_t, state_alts_vect, 0);
for (arc = first_out_arc (*state_ptr); for (arc = first_out_arc (VEC_index (state_t, output_states_vect, i));
arc != NULL; arc != NULL;
arc = next_out_arc (arc)) arc = next_out_arc (arc))
{ {
...@@ -7925,16 +7814,17 @@ output_state_alts_table (automaton_t automaton) ...@@ -7925,16 +7814,17 @@ output_state_alts_table (automaton_t automaton)
if (arc->insn->first_ainsn_with_given_equivalence_num) if (arc->insn->first_ainsn_with_given_equivalence_num)
add_vect_el (&state_alts_vect, arc->insn, arc->state_alts); add_vect_el (&state_alts_vect, arc->insn, arc->state_alts);
} }
add_vect (automaton->state_alts_table, (*state_ptr)->order_state_num, add_vect (automaton->state_alts_table,
VLA_HWINT_BEGIN (state_alts_vect), VEC_index (state_t, output_states_vect, i)->order_state_num,
VLA_HWINT_LENGTH (state_alts_vect)); state_alts_vect);
} }
output_state_ainsn_table output_state_ainsn_table
(automaton->state_alts_table, (char *) "state insn alternatives", (automaton->state_alts_table, "state insn alternatives",
output_state_alts_full_vect_name, output_state_alts_comb_vect_name, output_state_alts_full_vect_name, output_state_alts_comb_vect_name,
output_state_alts_check_vect_name, output_state_alts_base_vect_name); output_state_alts_check_vect_name, output_state_alts_base_vect_name);
VLA_PTR_DELETE (output_states_vect);
VLA_HWINT_DELETE (state_alts_vect); VEC_free (state_t,heap, output_states_vect);
VEC_free (vect_el_t,heap, state_alts_vect);
} }
/* The current number of passing states to find minimal issue delay /* The current number of passing states to find minimal issue delay
...@@ -8013,41 +7903,38 @@ output_min_issue_delay_table (automaton_t automaton) ...@@ -8013,41 +7903,38 @@ output_min_issue_delay_table (automaton_t automaton)
vla_hwint_t compressed_min_issue_delay_vect; vla_hwint_t compressed_min_issue_delay_vect;
vect_el_t min_delay; vect_el_t min_delay;
ainsn_t ainsn; ainsn_t ainsn;
state_t *state_ptr; size_t i, min_issue_delay_len;
int i; size_t compressed_min_issue_delay_len;
size_t cfactor;
/* Create vect of pointers to states ordered by num of transitions /* Create vect of pointers to states ordered by num of transitions
from the state (state with the maximum num is the first). */ from the state (state with the maximum num is the first). */
VLA_PTR_CREATE (output_states_vect, 1500, "output states vector"); output_states_vect = 0;
pass_states (automaton, add_states_vect_el); pass_states (automaton, add_states_vect_el);
VLA_HWINT_CREATE (min_issue_delay_vect, 1500, "min issue delay vector");
VLA_HWINT_EXPAND (min_issue_delay_vect, min_issue_delay_len = (VEC_length (state_t, output_states_vect)
VLA_HWINT_LENGTH (output_states_vect)
* automaton->insn_equiv_classes_num);
for (i = 0;
i < ((int) VLA_HWINT_LENGTH (output_states_vect)
* automaton->insn_equiv_classes_num); * automaton->insn_equiv_classes_num);
i++) min_issue_delay_vect = VEC_alloc (vect_el_t,heap, min_issue_delay_len);
VLA_HWINT (min_issue_delay_vect, i) = 0; for (i = 0; i < min_issue_delay_len; i++)
VEC_quick_push (vect_el_t, min_issue_delay_vect, 0);
automaton->max_min_delay = 0; automaton->max_min_delay = 0;
for (ainsn = automaton->ainsn_list; ainsn != NULL; ainsn = ainsn->next_ainsn) for (ainsn = automaton->ainsn_list; ainsn != NULL; ainsn = ainsn->next_ainsn)
if (ainsn->first_ainsn_with_given_equivalence_num) if (ainsn->first_ainsn_with_given_equivalence_num)
{ {
for (state_ptr = VLA_PTR_BEGIN (output_states_vect); for (i = 0; i < VEC_length (state_t, output_states_vect); i++)
state_ptr <= (state_t *) VLA_PTR_LAST (output_states_vect); VEC_index (state_t, output_states_vect, i)->min_insn_issue_delay = -1;
state_ptr++) for (i = 0; i < VEC_length (state_t, output_states_vect); i++)
(*state_ptr)->min_insn_issue_delay = -1;
for (state_ptr = VLA_PTR_BEGIN (output_states_vect);
state_ptr <= (state_t *) VLA_PTR_LAST (output_states_vect);
state_ptr++)
{ {
min_delay = min_issue_delay (*state_ptr, ainsn); state_t s = VEC_index (state_t, output_states_vect, i);
min_delay = min_issue_delay (s, ainsn);
if (automaton->max_min_delay < min_delay) if (automaton->max_min_delay < min_delay)
automaton->max_min_delay = min_delay; automaton->max_min_delay = min_delay;
VLA_HWINT (min_issue_delay_vect, VEC_replace (vect_el_t, min_issue_delay_vect,
(*state_ptr)->order_state_num s->order_state_num
* automaton->insn_equiv_classes_num * automaton->insn_equiv_classes_num
+ ainsn->insn_equiv_class_num) = min_delay; + ainsn->insn_equiv_class_num,
min_delay);
} }
} }
fprintf (output_file, "/* Vector of min issue delay of insns. */\n"); fprintf (output_file, "/* Vector of min issue delay of insns. */\n");
...@@ -8058,37 +7945,36 @@ output_min_issue_delay_table (automaton_t automaton) ...@@ -8058,37 +7945,36 @@ output_min_issue_delay_table (automaton_t automaton)
fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n"); fprintf (output_file, "[] ATTRIBUTE_UNUSED = {\n");
/* Compress the vector. */ /* Compress the vector. */
if (automaton->max_min_delay < 2) if (automaton->max_min_delay < 2)
automaton->min_issue_delay_table_compression_factor = 8; cfactor = 8;
else if (automaton->max_min_delay < 4) else if (automaton->max_min_delay < 4)
automaton->min_issue_delay_table_compression_factor = 4; cfactor = 4;
else if (automaton->max_min_delay < 16) else if (automaton->max_min_delay < 16)
automaton->min_issue_delay_table_compression_factor = 2; cfactor = 2;
else else
automaton->min_issue_delay_table_compression_factor = 1; cfactor = 1;
VLA_HWINT_CREATE (compressed_min_issue_delay_vect, 1500, automaton->min_issue_delay_table_compression_factor = cfactor;
"compressed min issue delay vector");
VLA_HWINT_EXPAND (compressed_min_issue_delay_vect, compressed_min_issue_delay_len = (min_issue_delay_len+cfactor-1) / cfactor;
(VLA_HWINT_LENGTH (min_issue_delay_vect) compressed_min_issue_delay_vect
+ automaton->min_issue_delay_table_compression_factor = VEC_alloc (vect_el_t,heap, compressed_min_issue_delay_len);
- 1)
/ automaton->min_issue_delay_table_compression_factor); for (i = 0; i < compressed_min_issue_delay_len; i++)
for (i = 0; VEC_quick_push (vect_el_t, compressed_min_issue_delay_vect, 0);
i < (int) VLA_HWINT_LENGTH (compressed_min_issue_delay_vect);
i++) for (i = 0; i < min_issue_delay_len; i++)
VLA_HWINT (compressed_min_issue_delay_vect, i) = 0; {
for (i = 0; i < (int) VLA_HWINT_LENGTH (min_issue_delay_vect); i++) size_t ci = i / cfactor;
VLA_HWINT (compressed_min_issue_delay_vect, vect_el_t x = VEC_index (vect_el_t, min_issue_delay_vect, i);
i / automaton->min_issue_delay_table_compression_factor) vect_el_t cx = VEC_index (vect_el_t, compressed_min_issue_delay_vect, ci);
|= (VLA_HWINT (min_issue_delay_vect, i)
<< (8 - (i % automaton->min_issue_delay_table_compression_factor cx |= x << (8 - (i % cfactor + 1) * (8 / cfactor));
+ 1) VEC_replace (vect_el_t, compressed_min_issue_delay_vect, ci, cx);
* (8 / automaton->min_issue_delay_table_compression_factor))); }
output_vect (VLA_HWINT_BEGIN (compressed_min_issue_delay_vect), output_vect (compressed_min_issue_delay_vect);
VLA_HWINT_LENGTH (compressed_min_issue_delay_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
VLA_PTR_DELETE (output_states_vect); VEC_free (state_t,heap, output_states_vect);
VLA_HWINT_DELETE (min_issue_delay_vect); VEC_free (vect_el_t,heap, min_issue_delay_vect);
VLA_HWINT_DELETE (compressed_min_issue_delay_vect); VEC_free (vect_el_t,heap, compressed_min_issue_delay_vect);
} }
#ifndef NDEBUG #ifndef NDEBUG
...@@ -8102,29 +7988,30 @@ static int locked_states_num; ...@@ -8102,29 +7988,30 @@ static int locked_states_num;
static void static void
output_dead_lock_vect (automaton_t automaton) output_dead_lock_vect (automaton_t automaton)
{ {
state_t *state_ptr; size_t i;
arc_t arc; arc_t arc;
vla_hwint_t dead_lock_vect; vla_hwint_t dead_lock_vect = 0;
/* Create vect of pointers to states ordered by num of /* Create vect of pointers to states ordered by num of
transitions from the state (state with the maximum num is the transitions from the state (state with the maximum num is the
first). */ first). */
VLA_PTR_CREATE (output_states_vect, 1500, "output states vector"); output_states_vect = 0;
pass_states (automaton, add_states_vect_el); pass_states (automaton, add_states_vect_el);
VLA_HWINT_CREATE (dead_lock_vect, 1500, "is dead locked vector");
VLA_HWINT_EXPAND (dead_lock_vect, VLA_HWINT_LENGTH (output_states_vect)); VEC_safe_grow (vect_el_t,heap, dead_lock_vect,
for (state_ptr = VLA_PTR_BEGIN (output_states_vect); VEC_length (state_t, output_states_vect));
state_ptr <= (state_t *) VLA_PTR_LAST (output_states_vect); for (i = 0; i < VEC_length (state_t, output_states_vect); i++)
state_ptr++)
{ {
arc = first_out_arc (*state_ptr); state_t s = VEC_index (state_t, output_states_vect, i);
arc = first_out_arc (s);
gcc_assert (arc); gcc_assert (arc);
VLA_HWINT (dead_lock_vect, (*state_ptr)->order_state_num) VEC_replace (vect_el_t, dead_lock_vect, s->order_state_num,
= (next_out_arc (arc) == NULL (next_out_arc (arc) == NULL
&& (arc->insn->insn_reserv_decl && (arc->insn->insn_reserv_decl
== DECL_INSN_RESERV (advance_cycle_insn_decl)) ? 1 : 0); == DECL_INSN_RESERV (advance_cycle_insn_decl))
? 1 : 0));
#ifndef NDEBUG #ifndef NDEBUG
if (VLA_HWINT (dead_lock_vect, (*state_ptr)->order_state_num)) if (VEC_index (vect_el_t,dead_lock_vect, s->order_state_num))
locked_states_num++; locked_states_num++;
#endif #endif
} }
...@@ -8134,11 +8021,10 @@ output_dead_lock_vect (automaton_t automaton) ...@@ -8134,11 +8021,10 @@ output_dead_lock_vect (automaton_t automaton)
fprintf (output_file, " "); fprintf (output_file, " ");
output_dead_lock_vect_name (output_file, automaton); output_dead_lock_vect_name (output_file, automaton);
fprintf (output_file, "[] = {\n"); fprintf (output_file, "[] = {\n");
output_vect (VLA_HWINT_BEGIN (dead_lock_vect), output_vect (dead_lock_vect);
VLA_HWINT_LENGTH (dead_lock_vect));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
VLA_HWINT_DELETE (dead_lock_vect); VEC_free (state_t,heap, output_states_vect);
VLA_PTR_DELETE (output_states_vect); VEC_free (vect_el_t,heap, dead_lock_vect);
} }
/* Form and output vector representing reserved units of the states of /* Form and output vector representing reserved units of the states of
...@@ -8146,34 +8032,38 @@ output_dead_lock_vect (automaton_t automaton) ...@@ -8146,34 +8032,38 @@ output_dead_lock_vect (automaton_t automaton)
static void static void
output_reserved_units_table (automaton_t automaton) output_reserved_units_table (automaton_t automaton)
{ {
state_t *curr_state_ptr; vla_hwint_t reserved_units_table = 0;
vla_hwint_t reserved_units_table; int state_byte_size;
size_t state_byte_size; int reserved_units_size;
size_t n;
int i; int i;
/* Create vect of pointers to states. */ /* Create vect of pointers to states. */
VLA_PTR_CREATE (output_states_vect, 1500, "output states vector"); output_states_vect = 0;
pass_states (automaton, add_states_vect_el); pass_states (automaton, add_states_vect_el);
/* Create vector. */ /* Create vector. */
VLA_HWINT_CREATE (reserved_units_table, 1500, "reserved units vector");
state_byte_size = (description->query_units_num + 7) / 8; state_byte_size = (description->query_units_num + 7) / 8;
VLA_HWINT_EXPAND (reserved_units_table, reserved_units_size = (VEC_length (state_t, output_states_vect)
VLA_HWINT_LENGTH (output_states_vect) * state_byte_size); * state_byte_size);
for (i = 0;
i < (int) (VLA_HWINT_LENGTH (output_states_vect) * state_byte_size); reserved_units_table = VEC_alloc (vect_el_t,heap, reserved_units_size);
i++)
VLA_HWINT (reserved_units_table, i) = 0; for (i = 0; i < reserved_units_size; i++)
for (curr_state_ptr = VLA_PTR_BEGIN (output_states_vect); VEC_quick_push (vect_el_t, reserved_units_table, 0);
curr_state_ptr <= (state_t *) VLA_PTR_LAST (output_states_vect); for (n = 0; n < VEC_length (state_t, output_states_vect); n++)
curr_state_ptr++)
{ {
state_t s = VEC_index (state_t, output_states_vect, n);
for (i = 0; i < description->units_num; i++) for (i = 0; i < description->units_num; i++)
if (units_array [i]->query_p if (units_array [i]->query_p
&& first_cycle_unit_presence (*curr_state_ptr, i)) && first_cycle_unit_presence (s, i))
VLA_HWINT (reserved_units_table, {
(*curr_state_ptr)->order_state_num * state_byte_size int ri = (s->order_state_num * state_byte_size
+ units_array [i]->query_num / 8) + units_array [i]->query_num / 8);
+= (1 << (units_array [i]->query_num % 8)); vect_el_t x = VEC_index (vect_el_t, reserved_units_table, ri);
x += 1 << (units_array [i]->query_num % 8);
VEC_replace (vect_el_t, reserved_units_table, ri, x);
}
} }
fprintf (output_file, "/* Vector for reserved units of states. */\n"); fprintf (output_file, "/* Vector for reserved units of states. */\n");
fprintf (output_file, "static const "); fprintf (output_file, "static const ");
...@@ -8181,11 +8071,11 @@ output_reserved_units_table (automaton_t automaton) ...@@ -8181,11 +8071,11 @@ output_reserved_units_table (automaton_t automaton)
fprintf (output_file, " "); fprintf (output_file, " ");
output_reserved_units_table_name (output_file, automaton); output_reserved_units_table_name (output_file, automaton);
fprintf (output_file, "[] = {\n"); fprintf (output_file, "[] = {\n");
output_vect (VLA_HWINT_BEGIN (reserved_units_table), output_vect (reserved_units_table);
VLA_HWINT_LENGTH (reserved_units_table));
fprintf (output_file, "};\n\n"); fprintf (output_file, "};\n\n");
VLA_HWINT_DELETE (reserved_units_table);
VLA_PTR_DELETE (output_states_vect); VEC_free (state_t,heap, output_states_vect);
VEC_free (vect_el_t,heap, reserved_units_table);
} }
/* The function outputs all tables representing DFA(s) used for fast /* The function outputs all tables representing DFA(s) used for fast
...@@ -9225,7 +9115,7 @@ static void ...@@ -9225,7 +9115,7 @@ static void
output_automaton_units (automaton_t automaton) output_automaton_units (automaton_t automaton)
{ {
decl_t decl; decl_t decl;
char *name; const char *name;
int curr_line_length; int curr_line_length;
int there_is_an_automaton_unit; int there_is_an_automaton_unit;
int i; int i;
...@@ -9263,14 +9153,13 @@ output_automaton_units (automaton_t automaton) ...@@ -9263,14 +9153,13 @@ output_automaton_units (automaton_t automaton)
/* The following variable is used for forming array of all possible cpu unit /* The following variable is used for forming array of all possible cpu unit
reservations described by the current DFA state. */ reservations described by the current DFA state. */
static vla_ptr_t state_reservs; static VEC(reserv_sets_t,heap) *state_reservs;
/* The function forms `state_reservs' for STATE. */ /* The function forms `state_reservs' for STATE. */
static void static void
add_state_reservs (state_t state) add_state_reservs (state_t state)
{ {
alt_state_t curr_alt_state; alt_state_t curr_alt_state;
reserv_sets_t reservs;
if (state->component_states != NULL) if (state->component_states != NULL)
for (curr_alt_state = state->component_states; for (curr_alt_state = state->component_states;
...@@ -9278,10 +9167,7 @@ add_state_reservs (state_t state) ...@@ -9278,10 +9167,7 @@ add_state_reservs (state_t state)
curr_alt_state = curr_alt_state->next_sorted_alt_state) curr_alt_state = curr_alt_state->next_sorted_alt_state)
add_state_reservs (curr_alt_state->state); add_state_reservs (curr_alt_state->state);
else else
{ VEC_safe_push (reserv_sets_t,heap, state_reservs, state->reservs);
reservs = state->reservs;
VLA_PTR_ADD (state_reservs, reservs);
}
} }
/* The function outputs readable representation of all out arcs of /* The function outputs readable representation of all out arcs of
...@@ -9291,7 +9177,7 @@ output_state_arcs (state_t state) ...@@ -9291,7 +9177,7 @@ output_state_arcs (state_t state)
{ {
arc_t arc; arc_t arc;
ainsn_t ainsn; ainsn_t ainsn;
char *insn_name; const char *insn_name;
int curr_line_length; int curr_line_length;
for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc)) for (arc = first_out_arc (state); arc != NULL; arc = next_out_arc (arc))
...@@ -9347,21 +9233,17 @@ state_reservs_cmp (const void *reservs_ptr_1, const void *reservs_ptr_2) ...@@ -9347,21 +9233,17 @@ state_reservs_cmp (const void *reservs_ptr_1, const void *reservs_ptr_2)
static void static void
remove_state_duplicate_reservs (void) remove_state_duplicate_reservs (void)
{ {
reserv_sets_t *reservs_ptr; size_t i, j;
reserv_sets_t *last_formed_reservs_ptr;
last_formed_reservs_ptr = NULL; for (i = 1, j = 0; i < VEC_length (reserv_sets_t, state_reservs); i++)
for (reservs_ptr = VLA_PTR_BEGIN (state_reservs); if (reserv_sets_cmp (VEC_index (reserv_sets_t, state_reservs, j),
reservs_ptr <= (reserv_sets_t *) VLA_PTR_LAST (state_reservs); VEC_index (reserv_sets_t, state_reservs, i)))
reservs_ptr++)
if (last_formed_reservs_ptr == NULL)
last_formed_reservs_ptr = reservs_ptr;
else if (reserv_sets_cmp (*last_formed_reservs_ptr, *reservs_ptr) != 0)
{ {
++last_formed_reservs_ptr; j++;
*last_formed_reservs_ptr = *reservs_ptr; VEC_replace (reserv_sets_t, state_reservs, j,
VEC_index (reserv_sets_t, state_reservs, i));
} }
VLA_PTR_SHORTEN (state_reservs, reservs_ptr - last_formed_reservs_ptr - 1); VEC_truncate (reserv_sets_t, state_reservs, j + 1);
} }
/* The following function output readable representation of DFA(s) /* The following function output readable representation of DFA(s)
...@@ -9371,27 +9253,28 @@ remove_state_duplicate_reservs (void) ...@@ -9371,27 +9253,28 @@ remove_state_duplicate_reservs (void)
static void static void
output_state (state_t state) output_state (state_t state)
{ {
reserv_sets_t *reservs_ptr; size_t i;
state_reservs = 0;
VLA_PTR_CREATE (state_reservs, 150, "state reservations");
fprintf (output_description_file, " State #%d", state->order_state_num); fprintf (output_description_file, " State #%d", state->order_state_num);
fprintf (output_description_file, fprintf (output_description_file,
state->new_cycle_p ? " (new cycle)\n" : "\n"); state->new_cycle_p ? " (new cycle)\n" : "\n");
add_state_reservs (state); add_state_reservs (state);
qsort (VLA_PTR_BEGIN (state_reservs), VLA_PTR_LENGTH (state_reservs), qsort (VEC_address (reserv_sets_t, state_reservs),
VEC_length (reserv_sets_t, state_reservs),
sizeof (reserv_sets_t), state_reservs_cmp); sizeof (reserv_sets_t), state_reservs_cmp);
remove_state_duplicate_reservs (); remove_state_duplicate_reservs ();
for (reservs_ptr = VLA_PTR_BEGIN (state_reservs); for (i = 1; i < VEC_length (reserv_sets_t, state_reservs); i++)
reservs_ptr <= (reserv_sets_t *) VLA_PTR_LAST (state_reservs);
reservs_ptr++)
{ {
fprintf (output_description_file, " "); fprintf (output_description_file, " ");
output_reserv_sets (output_description_file, *reservs_ptr); output_reserv_sets (output_description_file,
VEC_index (reserv_sets_t, state_reservs, i));
fprintf (output_description_file, "\n"); fprintf (output_description_file, "\n");
} }
fprintf (output_description_file, "\n"); fprintf (output_description_file, "\n");
output_state_arcs (state); output_state_arcs (state);
VLA_PTR_DELETE (state_reservs); VEC_free (reserv_sets_t,heap, state_reservs);
} }
/* The following function output readable representation of /* The following function output readable representation of
...@@ -9456,14 +9339,14 @@ output_statistics (FILE *f) ...@@ -9456,14 +9339,14 @@ output_statistics (FILE *f)
#ifndef NDEBUG #ifndef NDEBUG
fprintf fprintf
(f, "%5ld transition comb vector els, %5ld trans table els: %s\n", (f, "%5ld transition comb vector els, %5ld trans table els: %s\n",
(long) VLA_HWINT_LENGTH (automaton->trans_table->comb_vect), (long) VEC_length (vect_el_t, automaton->trans_table->comb_vect),
(long) VLA_HWINT_LENGTH (automaton->trans_table->full_vect), (long) VEC_length (vect_el_t, automaton->trans_table->full_vect),
(comb_vect_p (automaton->trans_table) (comb_vect_p (automaton->trans_table)
? "use comb vect" : "use simple vect")); ? "use comb vect" : "use simple vect"));
fprintf fprintf
(f, "%5ld state alts comb vector els, %5ld state alts table els: %s\n", (f, "%5ld state alts comb vector els, %5ld state alts table els: %s\n",
(long) VLA_HWINT_LENGTH (automaton->state_alts_table->comb_vect), (long) VEC_length (vect_el_t, automaton->state_alts_table->comb_vect),
(long) VLA_HWINT_LENGTH (automaton->state_alts_table->full_vect), (long) VEC_length (vect_el_t, automaton->state_alts_table->full_vect),
(comb_vect_p (automaton->state_alts_table) (comb_vect_p (automaton->state_alts_table)
? "use comb vect" : "use simple vect")); ? "use comb vect" : "use simple vect"));
fprintf fprintf
...@@ -9471,13 +9354,13 @@ output_statistics (FILE *f) ...@@ -9471,13 +9354,13 @@ output_statistics (FILE *f)
(long) states_num * automaton->insn_equiv_classes_num, (long) states_num * automaton->insn_equiv_classes_num,
automaton->min_issue_delay_table_compression_factor); automaton->min_issue_delay_table_compression_factor);
transition_comb_vect_els transition_comb_vect_els
+= VLA_HWINT_LENGTH (automaton->trans_table->comb_vect); += VEC_length (vect_el_t, automaton->trans_table->comb_vect);
transition_full_vect_els transition_full_vect_els
+= VLA_HWINT_LENGTH (automaton->trans_table->full_vect); += VEC_length (vect_el_t, automaton->trans_table->full_vect);
state_alts_comb_vect_els state_alts_comb_vect_els
+= VLA_HWINT_LENGTH (automaton->state_alts_table->comb_vect); += VEC_length (vect_el_t, automaton->state_alts_table->comb_vect);
state_alts_full_vect_els state_alts_full_vect_els
+= VLA_HWINT_LENGTH (automaton->state_alts_table->full_vect); += VEC_length (vect_el_t, automaton->state_alts_table->full_vect);
min_issue_delay_vect_els min_issue_delay_vect_els
+= states_num * automaton->insn_equiv_classes_num; += states_num * automaton->insn_equiv_classes_num;
#endif #endif
...@@ -9773,7 +9656,7 @@ initiate_automaton_gen (int argc, char **argv) ...@@ -9773,7 +9656,7 @@ initiate_automaton_gen (int argc, char **argv)
fatal ("option `-split' has not been implemented yet\n"); fatal ("option `-split' has not been implemented yet\n");
/* split_argument = atoi (argument_vect [i + 1]); */ /* split_argument = atoi (argument_vect [i + 1]); */
} }
VLA_PTR_CREATE (decls, 150, "decls");
/* Initialize IR storage. */ /* Initialize IR storage. */
obstack_init (&irp); obstack_init (&irp);
initiate_automaton_decl_table (); initiate_automaton_decl_table ();
...@@ -9838,14 +9721,14 @@ check_automata_insn_issues (void) ...@@ -9838,14 +9721,14 @@ check_automata_insn_issues (void)
/* The following vla is used for storing pointers to all achieved /* The following vla is used for storing pointers to all achieved
states. */ states. */
static vla_ptr_t automaton_states; static VEC(state_t,heap) *automaton_states;
/* This function is called by function pass_states to add an achieved /* This function is called by function pass_states to add an achieved
STATE. */ STATE. */
static void static void
add_automaton_state (state_t state) add_automaton_state (state_t state)
{ {
VLA_PTR_ADD (automaton_states, state); VEC_safe_push (state_t,heap, automaton_states, state);
} }
/* The following function forms list of important automata (whose /* The following function forms list of important automata (whose
...@@ -9854,29 +9737,27 @@ static void ...@@ -9854,29 +9737,27 @@ static void
form_important_insn_automata_lists (void) form_important_insn_automata_lists (void)
{ {
automaton_t automaton; automaton_t automaton;
state_t *state_ptr;
decl_t decl; decl_t decl;
ainsn_t ainsn; ainsn_t ainsn;
arc_t arc; arc_t arc;
int i; int i;
size_t n;
VLA_PTR_CREATE (automaton_states, 1500, automaton_states = 0;
"automaton states for forming important insn automata sets");
/* Mark important ainsns. */ /* Mark important ainsns. */
for (automaton = description->first_automaton; for (automaton = description->first_automaton;
automaton != NULL; automaton != NULL;
automaton = automaton->next_automaton) automaton = automaton->next_automaton)
{ {
VLA_PTR_NULLIFY (automaton_states); VEC_truncate (state_t, automaton_states, 0);
pass_states (automaton, add_automaton_state); pass_states (automaton, add_automaton_state);
for (state_ptr = VLA_PTR_BEGIN (automaton_states); for (n = 0; n < VEC_length (state_t, automaton_states); n++)
state_ptr <= (state_t *) VLA_PTR_LAST (automaton_states);
state_ptr++)
{ {
for (arc = first_out_arc (*state_ptr); state_t s = VEC_index (state_t, automaton_states, n);
for (arc = first_out_arc (s);
arc != NULL; arc != NULL;
arc = next_out_arc (arc)) arc = next_out_arc (arc))
if (arc->to_state != *state_ptr) if (arc->to_state != s)
{ {
gcc_assert (arc->insn->first_insn_with_same_reservs); gcc_assert (arc->insn->first_insn_with_same_reservs);
for (ainsn = arc->insn; for (ainsn = arc->insn;
...@@ -9886,7 +9767,8 @@ form_important_insn_automata_lists (void) ...@@ -9886,7 +9767,8 @@ form_important_insn_automata_lists (void)
} }
} }
} }
VLA_PTR_DELETE (automaton_states); VEC_free (state_t,heap, automaton_states);
/* Create automata sets for the insns. */ /* Create automata sets for the insns. */
for (i = 0; i < description->decls_num; i++) for (i = 0; i < description->decls_num; i++)
{ {
...@@ -9922,12 +9804,12 @@ expand_automata (void) ...@@ -9922,12 +9804,12 @@ expand_automata (void)
description = create_node (sizeof (struct description) description = create_node (sizeof (struct description)
/* One entry for cycle advancing insn. */ /* One entry for cycle advancing insn. */
+ sizeof (decl_t) * VLA_PTR_LENGTH (decls)); + sizeof (decl_t) * VEC_length (decl_t, decls));
description->decls_num = VLA_PTR_LENGTH (decls); description->decls_num = VEC_length (decl_t, decls);
description->query_units_num = 0; description->query_units_num = 0;
for (i = 0; i < description->decls_num; i++) for (i = 0; i < description->decls_num; i++)
{ {
description->decls [i] = VLA_PTR (decls, i); description->decls [i] = VEC_index (decl_t, decls, i);
if (description->decls [i]->mode == dm_unit if (description->decls [i]->mode == dm_unit
&& DECL_UNIT (description->decls [i])->query_p) && DECL_UNIT (description->decls [i])->query_p)
DECL_UNIT (description->decls [i])->query_num DECL_UNIT (description->decls [i])->query_num
......
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