GCC Middle and Back End API Reference
|
Go to the source code of this file.
Data Structures | |
struct | innermost_loop_behavior |
struct | indices |
struct | dr_alias |
struct | access_matrix |
struct | data_reference |
struct | conflict_function |
struct | subscript |
struct | data_dependence_relation |
struct | rdg_vertex |
struct | rdg_edge |
struct | rdg_component |
Macros | |
#define | AM_LOOP_NEST(M) (M)->loop_nest |
#define | AM_NB_INDUCTION_VARS(M) (M)->nb_induction_vars |
#define | AM_PARAMETERS(M) (M)->parameters |
#define | AM_MATRIX(M) (M)->matrix |
#define | AM_NB_PARAMETERS(M) (AM_PARAMETERS(M)).length () |
#define | AM_CONST_COLUMN_INDEX(M) (AM_NB_INDUCTION_VARS (M) + AM_NB_PARAMETERS (M)) |
#define | AM_NB_COLUMNS(M) (AM_NB_INDUCTION_VARS (M) + AM_NB_PARAMETERS (M) + 1) |
#define | AM_GET_SUBSCRIPT_ACCESS_VECTOR(M, I) AM_MATRIX (M)[I] |
#define | AM_GET_ACCESS_MATRIX_ELEMENT(M, I, J) AM_GET_SUBSCRIPT_ACCESS_VECTOR (M, I)[J] |
#define | DR_STMT(DR) (DR)->stmt |
#define | DR_REF(DR) (DR)->ref |
#define | DR_BASE_OBJECT(DR) (DR)->indices.base_object |
#define | DR_UNCONSTRAINED_BASE(DR) (DR)->indices.unconstrained_base |
#define | DR_ACCESS_FNS(DR) (DR)->indices.access_fns |
#define | DR_ACCESS_FN(DR, I) DR_ACCESS_FNS (DR)[I] |
#define | DR_NUM_DIMENSIONS(DR) DR_ACCESS_FNS (DR).length () |
#define | DR_IS_READ(DR) (DR)->is_read |
#define | DR_IS_WRITE(DR) (!DR_IS_READ (DR)) |
#define | DR_BASE_ADDRESS(DR) (DR)->innermost.base_address |
#define | DR_OFFSET(DR) (DR)->innermost.offset |
#define | DR_INIT(DR) (DR)->innermost.init |
#define | DR_STEP(DR) (DR)->innermost.step |
#define | DR_PTR_INFO(DR) (DR)->alias.ptr_info |
#define | DR_ALIGNED_TO(DR) (DR)->innermost.aligned_to |
#define | DR_ACCESS_MATRIX(DR) (DR)->access_matrix |
#define | MAX_DIM 2 |
#define | NO_DEPENDENCE 0 |
#define | NOT_KNOWN (MAX_DIM + 1) |
#define | CF_NONTRIVIAL_P(CF) ((CF)->n != NO_DEPENDENCE && (CF)->n != NOT_KNOWN) |
#define | CF_NOT_KNOWN_P(CF) ((CF)->n == NOT_KNOWN) |
#define | CF_NO_DEPENDENCE_P(CF) ((CF)->n == NO_DEPENDENCE) |
#define | SUB_CONFLICTS_IN_A(SUB) SUB->conflicting_iterations_in_a |
#define | SUB_CONFLICTS_IN_B(SUB) SUB->conflicting_iterations_in_b |
#define | SUB_LAST_CONFLICT(SUB) SUB->last_conflict |
#define | SUB_DISTANCE(SUB) SUB->distance |
#define | DDR_A(DDR) DDR->a |
#define | DDR_B(DDR) DDR->b |
#define | DDR_AFFINE_P(DDR) DDR->affine_p |
#define | DDR_ARE_DEPENDENT(DDR) DDR->are_dependent |
#define | DDR_SUBSCRIPTS(DDR) DDR->subscripts |
#define | DDR_SUBSCRIPT(DDR, I) DDR_SUBSCRIPTS (DDR)[I] |
#define | DDR_NUM_SUBSCRIPTS(DDR) DDR_SUBSCRIPTS (DDR).length () |
#define | DDR_LOOP_NEST(DDR) DDR->loop_nest |
#define | DDR_NB_LOOPS(DDR) (DDR_LOOP_NEST (DDR).length ()) |
#define | DDR_INNER_LOOP(DDR) DDR->inner_loop |
#define | DDR_SELF_REFERENCE(DDR) DDR->self_reference_p |
#define | DDR_DIST_VECTS(DDR) ((DDR)->dist_vects) |
#define | DDR_DIR_VECTS(DDR) ((DDR)->dir_vects) |
#define | DDR_NUM_DIST_VECTS(DDR) (DDR_DIST_VECTS (DDR).length ()) |
#define | DDR_NUM_DIR_VECTS(DDR) (DDR_DIR_VECTS (DDR).length ()) |
#define | DDR_DIR_VECT(DDR, I) DDR_DIR_VECTS (DDR)[I] |
#define | DDR_DIST_VECT(DDR, I) DDR_DIST_VECTS (DDR)[I] |
#define | DDR_REVERSED_P(DDR) DDR->reversed_p |
#define | RDGV_STMT(V) ((struct rdg_vertex *) ((V)->data))->stmt |
#define | RDGV_DATAREFS(V) ((struct rdg_vertex *) ((V)->data))->datarefs |
#define | RDGV_HAS_MEM_WRITE(V) ((struct rdg_vertex *) ((V)->data))->has_mem_write |
#define | RDGV_HAS_MEM_READS(V) ((struct rdg_vertex *) ((V)->data))->has_mem_reads |
#define | RDG_STMT(RDG, I) RDGV_STMT (&(RDG->vertices[I])) |
#define | RDG_DATAREFS(RDG, I) RDGV_DATAREFS (&(RDG->vertices[I])) |
#define | RDG_MEM_WRITE_STMT(RDG, I) RDGV_HAS_MEM_WRITE (&(RDG->vertices[I])) |
#define | RDG_MEM_READS_STMT(RDG, I) RDGV_HAS_MEM_READS (&(RDG->vertices[I])) |
#define | RDGE_TYPE(E) ((struct rdg_edge *) ((E)->data))->type |
#define | RDGE_LEVEL(E) ((struct rdg_edge *) ((E)->data))->level |
#define | RDGE_RELATION(E) ((struct rdg_edge *) ((E)->data))->relation |
Typedefs | |
typedef int * | lambda_vector |
typedef lambda_vector * | lambda_matrix |
typedef struct data_reference * | data_reference_p |
typedef vec< tree > | affine_fn |
typedef struct subscript * | subscript_p |
typedef struct data_dependence_relation * | ddr_p |
typedef struct rdg_vertex * | rdg_vertex_p |
typedef struct rdg_edge * | rdg_edge_p |
typedef struct rdg_component * | rdgc |
Enumerations | |
enum | data_dependence_direction { dir_positive, dir_negative, dir_equal, dir_positive_or_negative, dir_positive_or_equal, dir_negative_or_equal, dir_star, dir_independent } |
enum | rdg_dep_type { flow_dd = 'f', anti_dd = 'a', output_dd = 'o', input_dd = 'i' } |
#define AM_CONST_COLUMN_INDEX | ( | M | ) | (AM_NB_INDUCTION_VARS (M) + AM_NB_PARAMETERS (M)) |
#define AM_GET_ACCESS_MATRIX_ELEMENT | ( | M, | |
I, | |||
J | |||
) | AM_GET_SUBSCRIPT_ACCESS_VECTOR (M, I)[J] |
#define AM_GET_SUBSCRIPT_ACCESS_VECTOR | ( | M, | |
I | |||
) | AM_MATRIX (M)[I] |
#define AM_LOOP_NEST | ( | M | ) | (M)->loop_nest |
Referenced by am_vector_index_for_loop().
#define AM_MATRIX | ( | M | ) | (M)->matrix |
#define AM_NB_COLUMNS | ( | M | ) | (AM_NB_INDUCTION_VARS (M) + AM_NB_PARAMETERS (M) + 1) |
#define AM_NB_INDUCTION_VARS | ( | M | ) | (M)->nb_induction_vars |
#define AM_NB_PARAMETERS | ( | M | ) | (AM_PARAMETERS(M)).length () |
#define AM_PARAMETERS | ( | M | ) | (M)->parameters |
#define CF_NO_DEPENDENCE_P | ( | CF | ) | ((CF)->n == NO_DEPENDENCE) |
Referenced by analyze_miv_subscript(), analyze_siv_subscript(), and subscript_dependence_tester_1().
#define CF_NONTRIVIAL_P | ( | CF | ) | ((CF)->n != NO_DEPENDENCE && (CF)->n != NOT_KNOWN) |
Referenced by common_affine_function(), dump_subscript(), and free_conflict_function().
#define CF_NOT_KNOWN_P | ( | CF | ) | ((CF)->n == NOT_KNOWN) |
Referenced by analyze_miv_subscript(), analyze_siv_subscript(), and subscript_dependence_tester_1().
#define DDR_A | ( | DDR | ) | DDR->a |
Referenced by add_other_self_distances(), build_classic_dist_vector(), compute_affine_dependence(), cond_if_else_store_replacement(), constant_access_functions(), create_rdg_edge_for_ddr(), ddr_is_anti_dependent(), determine_loop_nest_reuse(), dump_data_dependence_relation(), init_omega_for_ddr(), initialize_data_dependence_relation(), lambda_transform_legal_p(), same_access_functions(), split_data_refs_to_components(), subscript_dependence_tester(), vect_analyze_data_ref_dependence(), vect_create_cond_for_alias_checks(), vect_find_same_alignment_drs(), vect_mark_for_runtime_alias_test(), vect_prune_runtime_alias_test_list(), vect_slp_analyze_data_ref_dependence(), and vect_vfa_range_equal().
#define DDR_AFFINE_P | ( | DDR | ) | DDR->affine_p |
#define DDR_ARE_DEPENDENT | ( | DDR | ) | DDR->are_dependent |
Referenced by add_other_self_distances(), analyze_all_data_dependences(), build_classic_dist_vector(), classify_partition(), compute_affine_dependence(), compute_subscript_distance(), cond_if_else_store_replacement(), create_rdg_edges(), ddr_is_anti_dependent(), determine_loop_nest_reuse(), dump_data_dependence_relation(), dump_dist_dir_vectors(), finalize_ddr_dependent(), init_omega_for_ddr_1(), initialize_data_dependence_relation(), known_dependences_p(), lambda_transform_legal_p(), split_data_refs_to_components(), vect_analyze_data_ref_dependence(), vect_find_same_alignment_drs(), and vect_slp_analyze_data_ref_dependence().
#define DDR_B | ( | DDR | ) | DDR->b |
Referenced by build_classic_dist_vector(), compute_affine_dependence(), cond_if_else_store_replacement(), constant_access_functions(), create_rdg_edge_for_ddr(), ddr_is_anti_dependent(), determine_loop_nest_reuse(), dump_data_dependence_relation(), init_omega_for_ddr(), initialize_data_dependence_relation(), lambda_transform_legal_p(), same_access_functions(), split_data_refs_to_components(), subscript_dependence_tester(), vect_analyze_data_ref_dependence(), vect_create_cond_for_alias_checks(), vect_find_same_alignment_drs(), vect_mark_for_runtime_alias_test(), vect_prune_runtime_alias_test_list(), vect_slp_analyze_data_ref_dependence(), and vect_vfa_range_equal().
#define DDR_DIR_VECT | ( | DDR, | |
I | |||
) | DDR_DIR_VECTS (DDR)[I] |
Referenced by ddr_consistent_p(), and dump_data_dependence_relation().
#define DDR_DIR_VECTS | ( | DDR | ) | ((DDR)->dir_vects) |
#define DDR_DIST_VECT | ( | DDR, | |
I | |||
) | DDR_DIST_VECTS (DDR)[I] |
#define DDR_DIST_VECTS | ( | DDR | ) | ((DDR)->dist_vects) |
Referenced by build_classic_dir_vector(), classify_partition(), compute_affine_dependence(), ddr_consistent_p(), ddr_dependence_level(), dump_dist_dir_vectors(), free_dependence_relation(), initialize_data_dependence_relation(), save_dist_v(), vect_analyze_data_ref_dependence(), and vect_find_same_alignment_drs().
#define DDR_INNER_LOOP | ( | DDR | ) | DDR->inner_loop |
#define DDR_LOOP_NEST | ( | DDR | ) | DDR->loop_nest |
Referenced by add_multivariate_self_dist(), add_other_self_distances(), build_classic_dist_vector_1(), classify_partition(), dump_data_dependence_relation(), init_omega_eq_with_af(), init_omega_for_ddr_1(), initialize_data_dependence_relation(), omega_extract_distance_vectors(), vect_analyze_data_ref_dependence(), and vect_find_same_alignment_drs().
#define DDR_NB_LOOPS | ( | DDR | ) | (DDR_LOOP_NEST (DDR).length ()) |
The size of the direction/distance vectors: the number of loops in the loop nest.
Referenced by add_multivariate_self_dist(), add_other_self_distances(), add_outer_distances(), build_classic_dir_vector(), build_classic_dist_vector(), build_classic_dist_vector_1(), ddr_consistent_p(), ddr_dependence_level(), dump_data_dependence_relation(), dump_dist_dir_vectors(), init_omega_eq_with_af(), init_omega_for_ddr(), init_omega_for_ddr_1(), insert_innermost_unit_dist_vector(), omega_extract_distance_vectors(), omega_setup_subscript(), save_dir_v(), and save_dist_v().
#define DDR_NUM_DIR_VECTS | ( | DDR | ) | (DDR_DIR_VECTS (DDR).length ()) |
Referenced by ddr_consistent_p(), and dump_data_dependence_relation().
#define DDR_NUM_DIST_VECTS | ( | DDR | ) | (DDR_DIST_VECTS (DDR).length ()) |
#define DDR_NUM_SUBSCRIPTS | ( | DDR | ) | DDR_SUBSCRIPTS (DDR).length () |
#define DDR_REVERSED_P | ( | DDR | ) | DDR->reversed_p |
#define DDR_SELF_REFERENCE | ( | DDR | ) | DDR->self_reference_p |
Referenced by initialize_data_dependence_relation().
#define DDR_SUBSCRIPT | ( | DDR, | |
I | |||
) | DDR_SUBSCRIPTS (DDR)[I] |
#define DDR_SUBSCRIPTS | ( | DDR | ) | DDR->subscripts |
#define DR_ACCESS_FN | ( | DR, | |
I | |||
) | DR_ACCESS_FNS (DR)[I] |
Referenced by add_other_self_distances(), build_classic_dist_vector_1(), constant_access_functions(), create_data_ref(), dump_data_dependence_relation(), dump_data_reference(), find_params_in_bb(), init_omega_for_ddr_1(), pdr_add_memory_accesses(), same_access_functions(), same_data_refs(), stmt_has_simple_data_refs_p(), and subscript_dependence_tester_1().
#define DR_ACCESS_FNS | ( | DR | ) | (DR)->indices.access_fns |
Referenced by access_functions_are_affine_or_constant_p(), dr_analyze_indices(), free_data_ref(), and self_reuse_distance().
#define DR_ACCESS_MATRIX | ( | DR | ) | (DR)->access_matrix |
#define DR_ALIGNED_TO | ( | DR | ) | (DR)->innermost.aligned_to |
Referenced by create_data_ref(), dr_analyze_innermost(), and vect_compute_data_ref_alignment().
#define DR_BASE_ADDRESS | ( | DR | ) | (DR)->innermost.base_address |
Referenced by build_addr_arg_loc(), create_data_ref(), determine_offset(), dr_analyze_innermost(), dr_group_sort_cmp(), ref_base_address(), valid_initializer_p(), vect_analyze_data_ref_accesses(), vect_analyze_data_refs(), vect_compute_data_ref_alignment(), vect_create_addr_base_for_vector_ref(), vect_create_cond_for_alias_checks(), vect_create_data_ref_ptr(), vect_enhance_data_refs_alignment(), vect_slp_analyze_data_ref_dependence(), vectorizable_load(), and vectorizable_store().
#define DR_BASE_OBJECT | ( | DR | ) | (DR)->indices.base_object |
#define DR_INIT | ( | DR | ) | (DR)->innermost.init |
Referenced by aff_combination_dr_offset(), build_addr_arg_loc(), create_data_ref(), determine_offset(), dr_analyze_innermost(), dr_group_sort_cmp(), valid_initializer_p(), vect_analyze_data_ref_accesses(), vect_analyze_data_refs(), vect_analyze_group_access(), vect_compute_data_ref_alignment(), vect_create_addr_base_for_vector_ref(), vect_create_cond_for_alias_checks(), vect_slp_analyze_data_ref_dependence(), vectorizable_load(), and vectorizable_store().
#define DR_IS_READ | ( | DR | ) | (DR)->is_read |
Referenced by build_poly_dr(), classify_partition(), cond_if_else_store_replacement(), create_data_ref(), create_rdg_edge_for_ddr(), ddr_is_anti_dependent(), dr_group_sort_cmp(), dr_may_alias_p(), dump_dref(), execute_load_motion(), find_looparound_phi(), lambda_transform_legal_p(), make_rooted_chain(), name_for_ref(), split_data_refs_to_components(), vect_analyze_data_ref_access(), vect_analyze_data_ref_accesses(), vect_analyze_data_ref_dependence(), vect_analyze_data_refs(), vect_analyze_group_access(), vect_analyze_slp_cost_1(), vect_bb_slp_scalar_cost(), vect_build_slp_tree(), vect_enhance_data_refs_alignment(), vect_get_data_access_cost(), vect_get_single_scalar_iteration_cost(), vect_slp_analyze_data_ref_dependence(), vect_supportable_dr_alignment(), and vect_verify_datarefs_alignment().
#define DR_IS_WRITE | ( | DR | ) | (!DR_IS_READ (DR)) |
Referenced by compute_all_dependences(), cond_if_else_store_replacement(), create_rdg_edge_for_ddr(), ddr_is_anti_dependent(), determine_roots_comp(), dr_may_alias_p(), execute_load_motion(), suitable_component_p(), vect_analyze_data_ref_dependence(), vect_analyze_group_access(), vect_analyze_slp_cost_1(), vect_enhance_data_refs_alignment(), vect_slp_analyze_data_ref_dependence(), and write_memrefs_written_at_least_once().
#define DR_NUM_DIMENSIONS | ( | DR | ) | DR_ACCESS_FNS (DR).length () |
#define DR_OFFSET | ( | DR | ) | (DR)->innermost.offset |
Referenced by aff_combination_dr_offset(), build_addr_arg_loc(), create_data_ref(), determine_offset(), dr_analyze_innermost(), dr_equal_offsets_p(), dr_group_sort_cmp(), valid_initializer_p(), vect_analyze_data_refs(), vect_create_addr_base_for_vector_ref(), vect_create_cond_for_alias_checks(), vect_update_init_of_dr(), vectorizable_load(), and vectorizable_store().
#define DR_PTR_INFO | ( | DR | ) | (DR)->alias.ptr_info |
Referenced by bump_vector_ptr(), dr_analyze_alias(), vect_create_addr_base_for_vector_ref(), and vect_create_data_ref_ptr().
#define DR_REF | ( | DR | ) | (DR)->ref |
Referenced by adjacent_dr_p(), build_addr_arg_loc(), build_size_arg_loc(), create_array_ref(), create_data_ref(), determine_offset(), dr_analyze_alias(), dr_analyze_indices(), dr_analyze_innermost(), dr_group_sort_cmp(), dr_may_alias_p(), dump_data_reference(), dump_dref(), find_looparound_phi(), initialize_data_dependence_relation(), initialize_root_vars(), initialize_root_vars_lm(), memrefs_read_or_written_unconditionally(), pdr_add_data_dimensions(), prepare_initializers_chain(), same_data_refs(), self_reuse_distance(), split_data_refs_to_components(), suitable_reference_p(), vect_analyze_data_ref_access(), vect_analyze_data_ref_accesses(), vect_analyze_data_ref_dependence(), vect_analyze_data_refs(), vect_analyze_group_access(), vect_analyze_slp_instance(), vect_check_gather(), vect_compute_data_ref_alignment(), vect_create_addr_base_for_vector_ref(), vect_create_cond_for_alias_checks(), vect_create_data_ref_ptr(), vect_enhance_data_refs_alignment(), vect_find_same_alignment_drs(), vect_mark_for_runtime_alias_test(), vect_prune_runtime_alias_test_list(), vect_same_range_drs(), vect_setup_realignment(), vect_slp_analyze_data_ref_dependence(), vect_supportable_dr_alignment(), vect_update_misalignment_for_peel(), vect_verify_datarefs_alignment(), vect_vfa_segment_size(), vector_alignment_reachable_p(), vectorizable_load(), and vectorizable_store().
#define DR_STEP | ( | DR | ) | (DR)->innermost.step |
Referenced by adjacent_dr_p(), build_addr_arg_loc(), classify_partition(), create_data_ref(), determine_offset(), dr_analyze_innermost(), dr_group_sort_cmp(), suitable_reference_p(), valid_initializer_p(), vect_analyze_data_ref_access(), vect_analyze_data_ref_accesses(), vect_analyze_data_refs(), vect_analyze_group_access(), vect_compute_data_ref_alignment(), vect_create_cond_for_alias_checks(), vect_create_cond_for_align_checks(), vect_create_data_ref_ptr(), vect_enhance_data_refs_alignment(), vect_find_same_alignment_drs(), vect_gen_niters_for_prolog_loop(), vect_mark_for_runtime_alias_test(), vect_supportable_dr_alignment(), vect_update_init_of_dr(), vect_update_misalignment_for_peel(), vect_vfa_segment_size(), vectorizable_load(), and vectorizable_store().
#define DR_STMT | ( | DR | ) | (DR)->stmt |
Referenced by classify_partition(), compute_affine_dependence(), cond_if_else_store_replacement(), create_data_ref(), create_rdg_edge_for_ddr(), dr_analyze_innermost(), dr_group_sort_cmp(), dump_data_reference(), find_looparound_phi(), generate_memcpy_builtin(), generate_memset_builtin(), memrefs_read_or_written_unconditionally(), split_data_refs_to_components(), split_reduction_stmt(), vect_analyze_data_ref_access(), vect_analyze_data_ref_accesses(), vect_analyze_data_ref_dependence(), vect_analyze_data_refs(), vect_analyze_group_access(), vect_compute_data_ref_alignment(), vect_compute_data_refs_alignment(), vect_create_cond_for_alias_checks(), vect_enhance_data_refs_alignment(), vect_find_same_alignment_drs(), vect_gen_niters_for_prolog_loop(), vect_get_data_access_cost(), vect_get_load_cost(), vect_get_store_cost(), vect_peeling_hash_get_lowest_cost(), vect_recog_bool_pattern(), vect_same_range_drs(), vect_slp_analyze_data_ref_dependence(), vect_supportable_dr_alignment(), vect_update_misalignment_for_peel(), vect_verify_datarefs_alignment(), vect_vfa_segment_size(), vector_alignment_reachable_p(), and write_memrefs_written_at_least_once().
#define DR_UNCONSTRAINED_BASE | ( | DR | ) | (DR)->indices.unconstrained_base |
Referenced by dr_analyze_indices(), and dr_may_alias_p().
#define MAX_DIM 2 |
The description of the grid of iterations that overlap. At most two loops are considered at the same time just now, hence at most two functions are needed. For each of the functions, we store the vector of coefficients, f[0] + x * f[1] + y * f[2] + ..., where x, y, ... are variables.
Referenced by conflict_fn().
#define NO_DEPENDENCE 0 |
Special values of N.
Referenced by conflict_fn_no_dependence(), and dump_conflict_function().
#define NOT_KNOWN (MAX_DIM + 1) |
Referenced by conflict_fn_not_known(), and dump_conflict_function().
#define RDG_DATAREFS | ( | RDG, | |
I | |||
) | RDGV_DATAREFS (&(RDG->vertices[I])) |
Referenced by classify_partition(), and similar_memory_accesses().
#define RDG_MEM_READS_STMT | ( | RDG, | |
I | |||
) | RDGV_HAS_MEM_READS (&(RDG->vertices[I])) |
Referenced by dot_rdg_1(), dump_rdg_vertex(), number_of_rw_in_partition(), number_of_rw_in_rdg(), and similar_memory_accesses().
#define RDG_MEM_WRITE_STMT | ( | RDG, | |
I | |||
) | RDGV_HAS_MEM_WRITE (&(RDG->vertices[I])) |
#define RDG_STMT | ( | RDG, | |
I | |||
) | RDGV_STMT (&(RDG->vertices[I])) |
Referenced by classify_partition(), create_rdg_edges(), rdg_defs_used_in_other_loops_p(), rdg_flag_vertex(), and rdg_vertex_for_stmt().
Referenced by create_rdg_edge_for_ddr().
Referenced by create_rdg_edge_for_ddr(), and create_rdg_edges_for_scalar().
Referenced by create_rdg_edge_for_ddr(), create_rdg_edges_for_scalar(), dot_rdg_1(), and has_anti_dependence().
#define RDGV_DATAREFS | ( | V | ) | ((struct rdg_vertex *) ((V)->data))->datarefs |
Referenced by create_rdg_vertices(), and free_rdg().
#define RDGV_HAS_MEM_READS | ( | V | ) | ((struct rdg_vertex *) ((V)->data))->has_mem_reads |
Referenced by create_rdg_vertices().
#define RDGV_HAS_MEM_WRITE | ( | V | ) | ((struct rdg_vertex *) ((V)->data))->has_mem_write |
Referenced by create_rdg_vertices().
#define RDGV_STMT | ( | V | ) | ((struct rdg_vertex *) ((V)->data))->stmt |
Referenced by create_rdg_vertices(), dump_rdg_vertex(), free_rdg(), and rdg_flag_uses().
#define SUB_CONFLICTS_IN_A | ( | SUB | ) | SUB->conflicting_iterations_in_a |
#define SUB_CONFLICTS_IN_B | ( | SUB | ) | SUB->conflicting_iterations_in_b |
#define SUB_DISTANCE | ( | SUB | ) | SUB->distance |
#define SUB_LAST_CONFLICT | ( | SUB | ) | SUB->last_conflict |
Referenced by dump_subscript(), initialize_data_dependence_relation(), and subscript_dependence_tester_1().
typedef struct data_reference* data_reference_p |
typedef struct data_dependence_relation* ddr_p |
typedef lambda_vector* lambda_matrix |
An integer matrix. A matrix consists of m vectors of length n (IE all vectors are the same length).
typedef int* lambda_vector |
An integer vector. A vector formally consists of an element of a vector space. A vector space is a set that is closed under vector addition and scalar multiplication. In this vector space, an element is a list of integers.
typedef struct rdg_edge * rdg_edge_p |
Dependence information attached to an edge of the RDG.
typedef struct rdg_vertex * rdg_vertex_p |
A Reduced Dependence Graph (RDG) vertex representing a statement.
typedef struct rdg_component * rdgc |
Strongly connected components of the reduced data dependence graph.
typedef struct subscript* subscript_p |
enum rdg_dep_type |
|
inlinestatic |
Returns true when the data reference DR the form "A[i] = ..." with a stride equal to its unit type size.
References DR_REF, DR_STEP, and tree_int_cst_equal().
Referenced by classify_partition().
|
inlinestatic |
Return the column in the access matrix of LOOP_NUM.
References AM_LOOP_NEST, and loop::num.
|
read |
|
read |
Build the Reduced Dependence Graph (RDG) with one vertex per statement of the loop nest, and one edge per data dependence or scalar dependence.
References build_empty_rdg(), compute_data_dependences_for_loop(), create_rdg_edges(), create_rdg_vertices(), known_dependences_p(), and stmts_from_loop().
Referenced by distribute_loop().
void compute_affine_dependence | ( | struct data_dependence_relation * | , |
loop_p | |||
) |
bool compute_all_dependences | ( | vec< data_reference_p > | datarefs, |
vec< ddr_p > * | dependence_relations, | ||
vec< loop_p > | loop_nest, | ||
bool | compute_self_and_rr | ||
) |
Compute in DEPENDENCE_RELATIONS the data dependence graph for all the data references in DATAREFS, in the LOOP_NEST. When COMPUTE_SELF_AND_RR is FALSE, don't compute read-read and self relations. Return true when successful, i.e. data references number is small enough to be handled.
References compute_affine_dependence(), DR_IS_WRITE, and initialize_data_dependence_relation().
Referenced by compute_data_dependences_for_bb(), compute_data_dependences_for_loop(), cond_if_else_store_replacement(), determine_loop_nest_reuse(), vect_analyze_data_ref_dependences(), and vect_slp_analyze_data_ref_dependences().
bool compute_data_dependences_for_bb | ( | basic_block | bb, |
bool | compute_self_and_read_read_dependences, | ||
vec< data_reference_p > * | datarefs, | ||
vec< ddr_p > * | dependence_relations | ||
) |
Returns true when the data dependences for the basic block BB have been computed, false otherwise. DATAREFS is initialized to all the array elements contained in this basic block, DEPENDENCE_RELATIONS contains the relations between the data references. Compute read-read and self relations if COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE.
References chrec_dont_know, compute_all_dependences(), find_data_references_in_bb(), and vNULL.
bool compute_data_dependences_for_loop | ( | struct loop * | loop, |
bool | compute_self_and_read_read_dependences, | ||
vec< loop_p > * | loop_nest, | ||
vec< data_reference_p > * | datarefs, | ||
vec< ddr_p > * | dependence_relations | ||
) |
Returns true when the data dependences have been computed, false otherwise. Given a loop nest LOOP, the following vectors are returned: DATAREFS is initialized to all the array elements contained in this loop, DEPENDENCE_RELATIONS contains the relations between the data references. Compute read-read and self relations if COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE.
References chrec_dont_know, compute_all_dependences(), dependence_stats, dump_file, dump_flags, find_data_references_in_loop(), find_loop_nest(), memset(), datadep_stats::num_dependence_dependent, datadep_stats::num_dependence_independent, datadep_stats::num_dependence_tests, datadep_stats::num_dependence_undetermined, datadep_stats::num_miv, datadep_stats::num_miv_dependent, datadep_stats::num_miv_independent, datadep_stats::num_miv_unimplemented, datadep_stats::num_same_subscript_function, datadep_stats::num_siv, datadep_stats::num_siv_dependent, datadep_stats::num_siv_independent, datadep_stats::num_siv_unimplemented, datadep_stats::num_subscript_tests, datadep_stats::num_subscript_undetermined, datadep_stats::num_ziv, datadep_stats::num_ziv_dependent, datadep_stats::num_ziv_independent, and datadep_stats::num_ziv_unimplemented.
Referenced by analyze_all_data_dependences(), build_rdg(), if_convertible_loop_p_1(), loop_parallel_p(), and tree_predictive_commoning_loop().
void compute_self_dependence | ( | struct data_dependence_relation * | ) |
|
read |
Analyzes memory reference MEMREF accessed in STMT. The reference is read if IS_READ is true, write otherwise. Returns the data_reference description of MEMREF. NEST is the outermost loop in which the reference should be instantiated, LOOP is the loop in which the data reference should be analyzed.
References DR_ACCESS_FN, DR_ALIGNED_TO, dr_analyze_alias(), dr_analyze_indices(), dr_analyze_innermost(), DR_BASE_ADDRESS, DR_BASE_OBJECT, DR_INIT, DR_IS_READ, DR_NUM_DIMENSIONS, DR_OFFSET, DR_REF, DR_STEP, DR_STMT, dump_file, dump_flags, data_reference::is_read, print_generic_expr(), print_generic_stmt(), and data_reference::stmt.
Referenced by create_rdg_vertices(), determine_loop_nest_reuse(), find_data_references_in_stmt(), graphite_find_data_references_in_stmt(), and vect_analyze_data_refs().
|
inlinestatic |
Return the dependence level for the DDR relation.
References DDR_DIST_VECT, DDR_DIST_VECTS, DDR_NB_LOOPS, DDR_NUM_DIST_VECTS, dependence_level(), and vector.
Referenced by create_rdg_edge_for_ddr().
|
inlinestatic |
Return true when DDR is an anti-dependence relation.
References DDR_A, DDR_ARE_DEPENDENT, DDR_B, DR_IS_READ, DR_IS_WRITE, and same_access_functions().
Referenced by ddrs_have_anti_deps().
|
inlinestatic |
Return true when DEPENDENCE_RELATIONS contains an anti-dependence.
References ddr_is_anti_dependent().
void debug | ( | data_reference & | ref | ) |
void debug | ( | data_reference * | ptr | ) |
void debug | ( | vec< data_reference_p > & | ref | ) |
void debug | ( | vec< data_reference_p > * | ptr | ) |
void debug_data_dependence_relation | ( | struct data_dependence_relation * | ) |
void debug_data_reference | ( | struct data_reference * | ) |
void debug_data_references | ( | vec< data_reference_p > | ) |
void debug_rdg | ( | struct graph * | ) |
void debug_rdg_component | ( | struct graph * | , |
int | |||
) |
void debug_rdg_vertex | ( | struct graph * | , |
int | |||
) |
|
inlinestatic |
Returns the dependence level for a vector DIST of size LENGTH. LEVEL = 0 means a lexicographic dependence, i.e. a dependence due to the sequence of statements, not carried by any loop.
Referenced by ddr_dependence_level().
bool dr_analyze_innermost | ( | struct data_reference * | , |
struct loop * | |||
) |
bool dr_equal_offsets_p | ( | struct data_reference * | dra, |
struct data_reference * | drb | ||
) |
Check if DRA and DRB have equal offsets.
References dr_equal_offsets_p1(), and DR_OFFSET.
Referenced by dr_group_sort_cmp(), vect_analyze_data_ref_accesses(), and vect_slp_analyze_data_ref_dependence().
bool dr_may_alias_p | ( | const struct data_reference * | a, |
const struct data_reference * | b, | ||
bool | loop_nest | ||
) |
Returns false if we can prove that data references A and B do not alias, true otherwise. If LOOP_NEST is false no cross-iteration aliases are considered.
References aff_comb_cannot_overlap_p(), aff_combination_add(), aff_combination_scale(), DR_BASE_OBJECT, DR_IS_READ, DR_IS_WRITE, DR_REF, DR_UNCONSTRAINED_BASE, get_inner_reference_aff(), ptr_derefs_may_alias_p(), refs_anti_dependent_p(), refs_may_alias_p(), and refs_output_dependent_p().
Referenced by build_alias_set_optimal_p(), initialize_data_dependence_relation(), write_alias_graph_to_ascii_dimacs(), write_alias_graph_to_ascii_dot(), and write_alias_graph_to_ascii_ecc().
Dump into FILE all the dependence relations from DDRS.
References dump_data_dependence_relation().
Referenced by analyze_all_data_dependences(), debug_data_dependence_relations(), loop_parallel_p(), and tree_predictive_commoning_loop().
void dump_data_reference | ( | FILE * | outf, |
struct data_reference * | dr | ||
) |
Dump function for a DATA_REFERENCE structure.
References DR_ACCESS_FN, DR_BASE_OBJECT, DR_NUM_DIMENSIONS, DR_REF, DR_STMT, print_generic_stmt(), and print_gimple_stmt().
Referenced by compute_affine_dependence(), debug_data_reference(), dump_data_dependence_relation(), dump_data_references(), and print_pdr().
void dump_rdg | ( | FILE * | , |
struct graph * | |||
) |
tree find_data_references_in_bb | ( | struct loop * | loop, |
basic_block | bb, | ||
vec< data_reference_p > * | datarefs | ||
) |
Search the data references in LOOP, and record the information into DATAREFS. Returns chrec_dont_know when failing to analyze a difficult case, returns NULL_TREE otherwise.
References chrec_dont_know, find_data_references_in_stmt(), gsi_end_p(), gsi_next(), gsi_start_bb(), and gsi_stmt().
Referenced by compute_data_dependences_for_bb(), cond_if_else_store_replacement(), and find_data_references_in_loop().
tree find_data_references_in_loop | ( | struct loop * | loop, |
vec< data_reference_p > * | datarefs | ||
) |
Search the data references in LOOP, and record the information into DATAREFS. Returns chrec_dont_know when failing to analyze a difficult case, returns NULL_TREE otherwise. TODO: This function should be made smarter so that it can handle address arithmetic as if they were array accesses, etc.
References chrec_dont_know, find_data_references_in_bb(), free(), get_loop_body_in_dom_order(), and loop::num_nodes.
Referenced by compute_data_dependences_for_loop(), and vect_analyze_data_refs().
bool find_data_references_in_stmt | ( | struct loop * | nest, |
gimple | stmt, | ||
vec< data_reference_p > * | datarefs | ||
) |
Stores the data references in STMT to DATAREFS. If there is an unanalyzable reference, returns false, otherwise returns true. NEST is the outermost loop of the loop nest in which the references should be analyzed.
References create_data_ref(), get_references_in_stmt(), data_ref_loc_d::is_read, loop_containing_stmt(), and data_ref_loc_d::pos.
Referenced by find_data_references_in_bb(), and vect_analyze_data_refs().
void free_data_ref | ( | data_reference_p | ) |
void free_data_refs | ( | vec< data_reference_p > | ) |
void free_dependence_relation | ( | struct data_dependence_relation * | ) |
void free_rdg | ( | struct graph * | ) |
bool graphite_find_data_references_in_stmt | ( | loop_p | nest, |
loop_p | loop, | ||
gimple | stmt, | ||
vec< data_reference_p > * | datarefs | ||
) |
Stores the data references in STMT to DATAREFS. If there is an unanalyzable reference, returns false, otherwise returns true. NEST is the outermost loop of the loop nest in which the references should be instantiated, LOOP is the loop in which the references should be analyzed.
References create_data_ref(), get_references_in_stmt(), data_ref_loc_d::is_read, and data_ref_loc_d::pos.
Referenced by analyze_drs_in_stmts(), stmt_has_simple_data_refs_p(), and try_generate_gimple_bb().
|
inlinestatic |
Return the index of the variable VAR in the LOOP_NEST array.
References loop::num.
Referenced by add_multivariate_self_dist(), add_other_self_distances(), build_classic_dist_vector_1(), classify_partition(), init_omega_eq_with_af(), vect_analyze_data_ref_dependence(), and vect_find_same_alignment_drs().
|
read |
Initialize a data dependence relation between data accesses A and B. NB_LOOPS is the number of loops surrounding the references: the size of the classic distance/direction vectors.
References data_dependence_relation::a, data_dependence_relation::b, chrec_dont_know, chrec_known, conflict_fn_not_known(), DDR_A, DDR_AFFINE_P, DDR_ARE_DEPENDENT, DDR_B, DDR_DIR_VECTS, DDR_DIST_VECTS, DDR_INNER_LOOP, DDR_LOOP_NEST, DDR_REVERSED_P, DDR_SELF_REFERENCE, DDR_SUBSCRIPTS, DR_BASE_OBJECT, dr_may_alias_p(), DR_NUM_DIMENSIONS, DR_REF, data_dependence_relation::loop_nest, object_address_invariant_in_loop_p(), operand_equal_p(), SUB_CONFLICTS_IN_A, SUB_CONFLICTS_IN_B, SUB_DISTANCE, and SUB_LAST_CONFLICT.
Referenced by classify_partition(), and compute_all_dependences().
|
inlinestatic |
Allocate a matrix of M rows x N cols.
References lambda_vector_new().
Referenced by analyze_subscript_affine_affine(), and lambda_trans_matrix_new().
|
inlinestatic |
Clear out vector VEC1 of length SIZE.
References memset().
Referenced by lambda_matrix_vector_mult(), and lambda_vector_mult_const().
|
inlinestatic |
Compute the greatest common divisor of a VECTOR of SIZE numbers.
References gcd().
Referenced by omega_setup_subscript().
|
inlinestatic |
Returns true when the vector V is lexicographically positive, in other words, when the first nonzero element is positive.
Referenced by build_classic_dist_vector(), and lambda_transform_legal_p().
|
inlinestatic |
Allocate a new vector of given SIZE.
Referenced by add_multivariate_self_dist(), add_other_self_distances(), add_outer_distances(), build_classic_dir_vector(), build_classic_dist_vector(), build_classic_dist_vector_1(), init_omega_for_ddr(), insert_innermost_unit_dist_vector(), lambda_matrix_new(), lambda_transform_legal_p(), and omega_extract_distance_vectors().
|
inlinestatic |
Return true if vector VEC1 of length SIZE is the zero vector.
Referenced by determine_loop_nest_reuse().
bool rdg_defs_used_in_other_loops_p | ( | struct graph * | , |
int | |||
) |
|
inlinestatic |
Return true when the DDR contains two data references that have the same access functions.
References DDR_A, DDR_B, DDR_NUM_SUBSCRIPTS, DR_ACCESS_FN, and eq_evolutions_p().
Referenced by build_classic_dist_vector(), ddr_is_anti_dependent(), and init_omega_for_ddr().
|
inlinestatic |
Return true when the data references A and B are accessing the same memory object with the same access functions.
References DR_ACCESS_FN, DR_NUM_DIMENSIONS, DR_REF, eq_evolutions_p(), operand_equal_p(), and same_data_refs_base_objects().
|
inlinestatic |
Return true when the base objects of data references A and B are the same memory object.
References DR_BASE_OBJECT, DR_NUM_DIMENSIONS, and operand_equal_p().
Referenced by same_data_refs(), and write_memrefs_written_at_least_once().