From ba42e045f7da0362ac1ff19ce0a2210999f7f1f8 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Sun, 26 Mar 2006 22:48:05 +0200 Subject: tree-data-ref.c: Rename DDR_SIZE_VECT to DDR_NB_LOOPS. * tree-data-ref.c: Rename DDR_SIZE_VECT to DDR_NB_LOOPS. (subscript_dependence_tester_1): Declared. (print_dir_vectors, print_dist_vectors): New. (debug_data_dependence_relation): New. (dump_data_dependence_relation): Print more details. (initialize_data_dependence_relation): Initialize DDR_LOOP_NEST. (analyze_subscript_affine_affine): Don't ICE when gcd_alpha_beta is 0. (save_dist_v, save_dir_v, add_outer_distances, build_classic_dist_vector_1): New. (build_classic_dist_vector): Rewrite to work on DDR_LOOP_NEST. Don't test for lambda_vector_lexico_pos. (same_access_functions, add_multivariate_self_dist, add_other_self_distances, dir_from_dist): New. (build_classic_dir_vector): Replace implementation almost identical to build_classic_dist_vector with a walk of DDR_DIST_VECTS with a call to dir_from_dist. (subscript_dependence_tester_1): New. (subscript_dependence_tester): Handle the lexicographically negative distance vectors by recomputing the dependence relation. (compute_affine_dependence): Remove parameter loop_nest_depth. (compute_self_dependence): Don't call compute_subscript_distance. (compute_all_dependences): Remove parameters nb_loops, loop_nest_depth. Add a parameter for the loop_nest. (find_loop_nest_1, find_loop_nest): New. (compute_data_dependences_for_loop): Compute the loop nest, and give up if the nest is not well formed. * tree-data-ref.h (loop_p): New. (struct data_dependence_relation): Replace size_vect field with loop_nest, a vec of loops. (DDR_SIZE_VECT): Renamed DDR_NB_LOOPS. (DDR_LOOP_NEST): New. (print_dir_vectors, print_dist_vectors, debug_data_dependence_relation): Declared. (index_in_loop_nest): New. * tree-vect-analyze.c (vect_analyze_data_ref_dependence): Use DDR_LOOP_NEST and index_in_loop_nest to determine the dependence distance. From-SVN: r112399 --- gcc/tree-data-ref.h | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) (limited to 'gcc/tree-data-ref.h') diff --git a/gcc/tree-data-ref.h b/gcc/tree-data-ref.h index 2c246df0660..1f996f43097 100644 --- a/gcc/tree-data-ref.h +++ b/gcc/tree-data-ref.h @@ -186,6 +186,10 @@ struct subscript #define SUB_LAST_CONFLICT(SUB) SUB->last_conflict #define SUB_DISTANCE(SUB) SUB->distance +typedef struct loop *loop_p; +DEF_VEC_P(loop_p); +DEF_VEC_ALLOC_P (loop_p, heap); + /* A data_dependence_relation represents a relation between two data_references A and B. */ @@ -217,9 +221,8 @@ struct data_dependence_relation the data_dependence_relation. */ varray_type subscripts; - /* The size of the direction/distance vectors: the depth of the - analyzed loop nest. */ - int size_vect; + /* The analyzed loop nest. */ + VEC (loop_p, heap) *loop_nest; /* The classic direction vector. */ VEC(lambda_vector,heap) *dir_vects; @@ -241,7 +244,11 @@ DEF_VEC_ALLOC_P(ddr_p,heap); VARRAY_GENERIC_PTR_INIT (DDR_SUBSCRIPTS (DDR), N, "subscripts_vector"); #define DDR_SUBSCRIPT(DDR, I) VARRAY_GENERIC_PTR (DDR_SUBSCRIPTS (DDR), I) #define DDR_NUM_SUBSCRIPTS(DDR) VARRAY_ACTIVE_SIZE (DDR_SUBSCRIPTS (DDR)) -#define DDR_SIZE_VECT(DDR) DDR->size_vect + +#define DDR_LOOP_NEST(DDR) DDR->loop_nest +/* The size of the direction/distance vectors: the number of loops in + the loop nest. */ +#define DDR_NB_LOOPS(DDR) (VEC_length (loop_p, DDR_LOOP_NEST (DDR))) #define DDR_DIST_VECTS(DDR) ((DDR)->dist_vects) #define DDR_DIR_VECTS(DDR) ((DDR)->dir_vects) @@ -260,11 +267,14 @@ extern tree find_data_references_in_loop (struct loop *, varray_type *); extern void compute_data_dependences_for_loop (struct loop *, bool, varray_type *, varray_type *); extern void print_direction_vector (FILE *, lambda_vector, int); +extern void print_dir_vectors (FILE *, VEC (lambda_vector, heap) *, int); +extern void print_dist_vectors (FILE *, VEC (lambda_vector, heap) *, int); extern void dump_subscript (FILE *, struct subscript *); extern void dump_ddrs (FILE *, varray_type); extern void dump_dist_dir_vectors (FILE *, varray_type); extern void dump_data_reference (FILE *, struct data_reference *); extern void dump_data_references (FILE *, varray_type); +extern void debug_data_dependence_relation (struct data_dependence_relation *); extern void dump_data_dependence_relation (FILE *, struct data_dependence_relation *); extern void dump_data_dependence_relations (FILE *, varray_type); @@ -276,6 +286,22 @@ extern void free_data_refs (varray_type); extern struct data_reference *analyze_array (tree, tree, bool); extern void estimate_iters_using_array (tree, tree); +/* Return the index of the variable VAR in the LOOP_NEST array. */ + +static inline int +index_in_loop_nest (int var, VEC (loop_p, heap) *loop_nest) +{ + struct loop *loopi; + int var_index; + + for (var_index = 0; VEC_iterate (loop_p, loop_nest, var_index, loopi); + var_index++) + if (loopi->num == var) + break; + + return var_index; +} + #endif /* GCC_TREE_DATA_REF_H */ -- cgit v1.2.1