diff options
author | dorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-17 16:17:14 +0000 |
---|---|---|
committer | dorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-17 16:17:14 +0000 |
commit | c91e822398d80d51e7b0e0884fa3e8c7c32d6ae7 (patch) | |
tree | 49effbb8670b04dbfb66de531c733c3e4389a525 /gcc/tree-vectorizer.h | |
parent | 867fd9060f9bdfef84dbea3354f5747c94d60a13 (diff) | |
download | gcc-c91e822398d80d51e7b0e0884fa3e8c7c32d6ae7.tar.gz |
* tree-vectorizer.c: New File: loop vectorization on SSAed GIMPLE trees.
* tree-vectorizer.h: New File: Same.
* Makefile.in (tree-vectorizer.c, tree-vectorizer.h): Add new files.
* common.opt (ftree-vectorize): New flag to enable vectorization.
* timevar.def (TV_TREE_VECTORIZATION): New dump file for vectorization
pass.
* tree-data-ref.h (init_data_ref): Additional argument.
(array_base_name_differ_p): Moved to tree-data-ref.c.
* tree-data-ref.c (array_base_name_differ_p): Revised.
(initialize_data_dependence_relation): Call array_base_name_differ_p
with an extra argument.
(analyze_all_data_dependences): Same.
(init_data_ref): Additional argument is_read to set DR_IS_READ.
* tree-ssa-phiopt.c (empty_block_p): Expose for usage out of this file.
* tree-flow.h (vectorize_loops, empty_block_p): Add declaration.
* tree-optimize.c (pass_vectorize): Schedule the vectorization pass.
* tree-pass.h (tree_opt_pass pass_vectorize): Declare the new
vectorization pass.
* tree-ssa-loop.c (tree_ssa_loop_init): Call scev_initialize.
(tree_ssa_loop_done): Call scev_finalize.
(tree_vectorize): Define the new vectorization pass.
* defaults.h (UNITS_PER_SIMD_WORD): Allow targets to specify the size of
the vector they support (until support for multiple vector sizes is
added to the vectorizer).
* config/i386/i386.h (UNITS_PER_SIMD_WORD): Define.
* config/rs6000/rs6000.h (UNITS_PER_SIMD_WORD): Define.
* invoke.texi (fdump-tree-vect, ftree-vectorize): Add
documentation.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86131 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h new file mode 100644 index 00000000000..4c280e93415 --- /dev/null +++ b/gcc/tree-vectorizer.h @@ -0,0 +1,181 @@ +/* Loop Vectorization + Copyright (C) 2003, 2004 Free Software Foundation, Inc. + Contributed by Dorit Naishlos <dorit@il.ibm.com> + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +#ifndef GCC_TREE_VECTORIZER_H +#define GCC_TREE_VECTORIZER_H + +/* Used for naming of new temporaries. */ +enum vect_var_kind { + vect_simple_var, + vect_pointer_var +}; + +/* Defines type of operation: unary or binary. */ +enum operation_type { + unary_op = 1, + binary_op +}; + +/*-----------------------------------------------------------------*/ +/* Info on vectorized defs. */ +/*-----------------------------------------------------------------*/ +enum stmt_vec_info_type { + undef_vec_info_type = 0, + load_vec_info_type, + store_vec_info_type, + op_vec_info_type, + assignment_vec_info_type +}; + +typedef struct _stmt_vec_info { + + enum stmt_vec_info_type type; + + /* The stmt to which this info struct refers to. */ + tree stmt; + + /* The loop with resprct to which STMT is vectorized. */ + struct loop *loop; + + /* Not all stmts in the loop need to be vectorized. e.g, the incrementation + of the loop induction variable and computation of array indexes. relevant + indicates whether the stmt needs to be vectorized. */ + bool relevant; + + /* The vector type to be used. */ + tree vectype; + + /* The vectorized version of the stmt. */ + tree vectorized_stmt; + + + /** The following is relevant only for stmts that contain a non-scalar + data-ref (array/pointer/struct access). A GIMPLE stmt is expected to have + at most one such data-ref. **/ + + /* Information about the data-ref (access function, etc). */ + struct data_reference *data_ref_info; + + /* Aliasing information. */ + tree memtag; +} *stmt_vec_info; + +/* Access Functions. */ +#define STMT_VINFO_TYPE(S) (S)->type +#define STMT_VINFO_STMT(S) (S)->stmt +#define STMT_VINFO_LOOP(S) (S)->loop +#define STMT_VINFO_RELEVANT_P(S) (S)->relevant +#define STMT_VINFO_VECTYPE(S) (S)->vectype +#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 + +static inline void set_stmt_info (stmt_ann_t ann, stmt_vec_info stmt_info); +static inline stmt_vec_info vinfo_for_stmt (tree stmt); + +static inline void +set_stmt_info (stmt_ann_t ann, stmt_vec_info stmt_info) +{ + if (ann) + ann->common.aux = (char *) stmt_info; +} + +static inline stmt_vec_info +vinfo_for_stmt (tree stmt) +{ + stmt_ann_t ann = stmt_ann (stmt); + return ann ? (stmt_vec_info) ann->common.aux : NULL; +} + +/*-----------------------------------------------------------------*/ +/* Info on data references alignment. */ +/*-----------------------------------------------------------------*/ + +#define DR_MISALIGNMENT(DR) (DR)->aux + +static inline bool +aligned_access_p (struct data_reference *data_ref_info) +{ + return (DR_MISALIGNMENT (data_ref_info) == 0); +} + +static inline bool +unknown_alignment_for_access_p (struct data_reference *data_ref_info) +{ + return (DR_MISALIGNMENT (data_ref_info) == -1); +} + + +/*-----------------------------------------------------------------*/ +/* Info on vectorized loops. */ +/*-----------------------------------------------------------------*/ +typedef struct _loop_vec_info { + + /* The loop to which this info struct refers to. */ + struct loop *loop; + + /* The loop basic blocks. */ + basic_block *bbs; + + /* The loop exit_condition. */ + tree exit_cond; + + /* Number of iterations. -1 if unknown. */ + HOST_WIDE_INT num_iters; + + /* Is the loop vectorizable? */ + bool vectorizable; + + /* Unrolling factor */ + int vectorization_factor; + + /* All data references in the loop that are being written to. */ + varray_type data_ref_writes; + + /* All data references in the loop that are being read from. */ + varray_type data_ref_reads; +} *loop_vec_info; + +/* Access Functions. */ +#define LOOP_VINFO_LOOP(L) (L)->loop +#define LOOP_VINFO_BBS(L) (L)->bbs +#define LOOP_VINFO_EXIT_COND(L) (L)->exit_cond +#define LOOP_VINFO_NITERS(L) (L)->num_iters +#define LOOP_VINFO_VECTORIZABLE_P(L) (L)->vectorizable +#define LOOP_VINFO_VECT_FACTOR(L) (L)->vectorization_factor +#define LOOP_VINFO_DATAREF_WRITES(L) (L)->data_ref_writes +#define LOOP_VINFO_DATAREF_READS(L) (L)->data_ref_reads + +#define LOOP_VINFO_NITERS_KNOWN_P(L) ((L)->num_iters > 0) + +/*-----------------------------------------------------------------*/ +/* Function prototypes. */ +/*-----------------------------------------------------------------*/ + +/* Main driver. */ +extern void vectorize_loops (struct loops *); + +/* creation and deletion of loop and stmt info structs. */ +extern loop_vec_info new_loop_vec_info (struct loop *loop); +extern void destroy_loop_vec_info (loop_vec_info); +extern stmt_vec_info new_stmt_vec_info (tree stmt, struct loop *loop); + +#endif /* GCC_TREE_VECTORIZER_H */ |