aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIra Rosen <irar@il.ibm.com>2005-02-12 10:24:40 +0000
committerDorit Naishlos <dorit@il.ibm.com>2005-02-12 10:24:40 +0000
commit8f92f99cb4a2e0d34ccc75dfcc281ddad0c611c0 (patch)
tree5d72892c65985445fdedf3d27a2ff1dcd4cd21ac
parentde5f74879a2ae00930c19e0fb154af598c8e4811 (diff)
2005-02-13 Ira Rosen <irar@il.ibm.com>
* 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: https://gcc.gnu.org/svn/gcc/trunk@94930 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/tree-vectorizer.c41
-rw-r--r--gcc/tree-vectorizer.h19
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 <irar@il.ibm.com>
+
+ * 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 <hp@axis.com>
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 <access_fns of indexes of b> (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