From 82f7261aab7d0d5fc4a606e256f7314ea3cbc024 Mon Sep 17 00:00:00 2001 From: dorit Date: Sat, 12 Feb 2005 10:24:40 +0000 Subject: [PATCH] 2005-02-13 Ira Rosen * tree-vectorizer.h (struct _stmt_vec_info): Rename a field: base to base_address. * tree-vectorizer.c (new_stmt_vec_info): Rename the above field of stmt_vec_info. (vect_get_base_and_offset): Always return an address. (vect_create_addr_base_for_vector_ref): Remove treatment for different data reference types. (vect_compute_data_ref_alignment): Rename base to base_address in stmt_vec_info. Get the object in order to force its alignment. (vect_get_memtag_and_dr): Rename base to base_address in stmt_vec_info. Extract the object for memtag analysis. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94930 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/tree-vectorizer.c | 41 ++++++++--------------------------------- gcc/tree-vectorizer.h | 19 ++++++++++++------- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e70eb8bb461..e8e8a80c639 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2005-02-13 Ira Rosen + + * tree-vectorizer.h (struct _stmt_vec_info): Rename a field: base + to base_address. + * tree-vectorizer.c (new_stmt_vec_info): Rename the above field of + stmt_vec_info. + (vect_get_base_and_offset): Always return an address. + (vect_create_addr_base_for_vector_ref): Remove treatment for + different data reference types. + (vect_compute_data_ref_alignment): Rename base to base_address in + stmt_vec_info. Get the object in order to force its alignment. + (vect_get_memtag_and_dr): Rename base to base_address in + stmt_vec_info. Extract the object for memtag analysis. + 2005-02-12 Hans-Peter Nilsson PR regression/19898. diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index 06b74036e2c..f18d0bb091d 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -1282,7 +1282,7 @@ new_stmt_vec_info (tree stmt, loop_vec_info loop_vinfo) STMT_VINFO_VEC_STMT (res) = NULL; STMT_VINFO_DATA_REF (res) = NULL; STMT_VINFO_MEMTAG (res) = NULL; - STMT_VINFO_VECT_DR_BASE (res) = NULL; + STMT_VINFO_VECT_DR_BASE_ADDRESS (res) = NULL; STMT_VINFO_VECT_INIT_OFFSET (res) = NULL_TREE; STMT_VINFO_VECT_STEP (res) = NULL_TREE; STMT_VINFO_VECT_BASE_ALIGNED_P (res) = false; @@ -1690,7 +1690,7 @@ vect_get_base_and_offset (struct data_reference *dr, *misalign = ssize_int (0); if (DECL_ALIGN (expr) >= TYPE_ALIGN (vectype)) *base_aligned_p = true; - return expr; + return build_fold_addr_expr (expr); case SSA_NAME: if (TREE_CODE (TREE_TYPE (expr)) != POINTER_TYPE) @@ -1960,7 +1960,8 @@ vect_create_addr_base_for_vector_ref (tree stmt, { stmt_vec_info stmt_info = vinfo_for_stmt (stmt); struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info); - tree data_ref_base = unshare_expr (STMT_VINFO_VECT_DR_BASE (stmt_info)); + tree data_ref_base = + unshare_expr (STMT_VINFO_VECT_DR_BASE_ADDRESS (stmt_info)); tree base_name = unshare_expr (DR_BASE_NAME (dr)); tree ref = DR_REF (dr); tree scalar_type = TREE_TYPE (ref); @@ -1971,33 +1972,6 @@ vect_create_addr_base_for_vector_ref (tree stmt, tree dest, new_stmt; tree base_offset = unshare_expr (STMT_VINFO_VECT_INIT_OFFSET (stmt_info)); - if (TREE_CODE (TREE_TYPE (data_ref_base)) != POINTER_TYPE) - /* After the analysis stage, we expect to get here only with RECORD_TYPE - and ARRAY_TYPE. */ - /* Add '&' to ref_base. */ - data_ref_base = build_fold_addr_expr (data_ref_base); - else - { - /* Create '(scalar_type*) base' for pointers. */ - tree dest, new_stmt, new_temp, vec_stmt, tmp_base; - tree scalar_array_type = build_array_type (scalar_type, 0); - tree scalar_array_ptr_type = build_pointer_type (scalar_array_type); - tree array_ptr = create_tmp_var (scalar_array_ptr_type, "array_ptr"); - add_referenced_tmp_var (array_ptr); - - dest = create_tmp_var (TREE_TYPE (data_ref_base), "dataref"); - add_referenced_tmp_var (dest); - tmp_base = force_gimple_operand (data_ref_base, &new_stmt, false, dest); - append_to_statement_list_force (new_stmt, new_stmt_list); - - vec_stmt = fold_convert (scalar_array_ptr_type, tmp_base); - vec_stmt = build2 (MODIFY_EXPR, void_type_node, array_ptr, vec_stmt); - new_temp = make_ssa_name (array_ptr, vec_stmt); - TREE_OPERAND (vec_stmt, 0) = new_temp; - append_to_statement_list_force (vec_stmt, new_stmt_list); - data_ref_base = new_temp; - } - /* Create base_offset */ dest = create_tmp_var (TREE_TYPE (base_offset), "base_off"); add_referenced_tmp_var (dest); @@ -4253,7 +4227,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr) misalign = STMT_VINFO_VECT_MISALIGNMENT (stmt_info); base_aligned_p = STMT_VINFO_VECT_BASE_ALIGNED_P (stmt_info); - base = STMT_VINFO_VECT_DR_BASE (stmt_info); + base = build_fold_indirect_ref (STMT_VINFO_VECT_DR_BASE_ADDRESS (stmt_info)); vectype = STMT_VINFO_VECTYPE (stmt_info); if (!misalign) @@ -4877,7 +4851,8 @@ vect_get_memtag_and_dr (tree memref, tree stmt, bool is_read, /* Fall through. */ case ADDR_EXPR: - symbl = STMT_VINFO_VECT_DR_BASE (stmt_info); + symbl = build_fold_indirect_ref ( + STMT_VINFO_VECT_DR_BASE_ADDRESS (stmt_info)); break; /* For recursive call. */ case PLUS_EXPR: @@ -4965,7 +4940,7 @@ vect_get_memtag_and_dr (tree memref, tree stmt, bool is_read, STMT_VINFO_VECT_BASE_ALIGNED_P (stmt_info) = base_aligned_p; STMT_VINFO_VECT_MISALIGNMENT (stmt_info) = misalign; - STMT_VINFO_VECT_DR_BASE (stmt_info) = dr_base; + STMT_VINFO_VECT_DR_BASE_ADDRESS (stmt_info) = dr_base; } if (!symbl) diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 3d540596b66..7876cb6d7cb 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -174,20 +174,25 @@ typedef struct _stmt_vec_info { tree memtag; /** The following fields are used to store the information about - data-reference. {base + initial_offset} is the first location accessed by - data-ref in the loop, and step is the stride of data-ref in the loop; + data-reference. {base_address + initial_offset} is the first location + accessed by data-ref in the loop, and step is the stride of data-ref in + the loop in bytes; e.g.: Example 1 Example 2 data-ref a[j].b[i][j] a + 4B (a is int*) - - base a a + + base_address &a a initial_offset j_0*D_j + i_0*D_i + C 4 step D_j 4 + data-reference structure info: + base_name a NULL + access_fn (0, +, 1) + **/ - /* The above base, offset and step. */ - tree base; + /* The above base_address, offset and step. */ + tree base_address; tree initial_offset; tree step; @@ -208,7 +213,7 @@ typedef struct _stmt_vec_info { #define STMT_VINFO_VEC_STMT(S) (S)->vectorized_stmt #define STMT_VINFO_DATA_REF(S) (S)->data_ref_info #define STMT_VINFO_MEMTAG(S) (S)->memtag -#define STMT_VINFO_VECT_DR_BASE(S) (S)->base +#define STMT_VINFO_VECT_DR_BASE_ADDRESS(S)(S)->base_address #define STMT_VINFO_VECT_INIT_OFFSET(S) (S)->initial_offset #define STMT_VINFO_VECT_STEP(S) (S)->step #define STMT_VINFO_VECT_BASE_ALIGNED_P(S) (S)->base_aligned_p -- 2.11.4.GIT