summaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.h
diff options
context:
space:
mode:
authordorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4>2004-08-17 16:17:14 +0000
committerdorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4>2004-08-17 16:17:14 +0000
commitc91e822398d80d51e7b0e0884fa3e8c7c32d6ae7 (patch)
tree49effbb8670b04dbfb66de531c733c3e4389a525 /gcc/tree-vectorizer.h
parent867fd9060f9bdfef84dbea3354f5747c94d60a13 (diff)
downloadgcc-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.h181
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 */