diff options
author | irar <irar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-08-04 16:47:17 +0000 |
---|---|---|
committer | irar <irar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-08-04 16:47:17 +0000 |
commit | 45eea33f3f587405f23969177456cbb4094762e6 (patch) | |
tree | f97727c3e140e3effeba1ba33adafa64f68719ea /gcc/tree-vect-loop.c | |
parent | 83a435b8e542329d7a1d703de51c3b6bac77b3cb (diff) | |
download | gcc-45eea33f3f587405f23969177456cbb4094762e6.tar.gz |
* tree-vectorizer.h (struct _stmt_vec_info): Add new field for
pattern def statement, and its access macro.
(NUM_PATTERNS): Set to 5.
* tree-vect-loop.c (vect_determine_vectorization_factor): Handle
pattern def statement.
(vect_transform_loop): Likewise.
* tree-vect-patterns.c (vect_vect_recog_func_ptrs): Add new
function vect_recog_over_widening_pattern ().
(vect_operation_fits_smaller_type): New function.
(vect_recog_over_widening_pattern, vect_mark_pattern_stmts):
Likewise.
(vect_pattern_recog_1): Move the code that marks pattern
statements to vect_mark_pattern_stmts (), and call it. Update
documentation.
* tree-vect-stmts.c (vect_supportable_shift): New function.
(vect_analyze_stmt): Handle pattern def statement.
(new_stmt_vec_info): Initialize pattern def statement.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177409 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 505a41acb03..7b765964713 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -181,8 +181,8 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) stmt_vec_info stmt_info; int i; HOST_WIDE_INT dummy; - gimple stmt, pattern_stmt = NULL; - bool analyze_pattern_stmt = false; + gimple stmt, pattern_stmt = NULL, pattern_def_stmt = NULL; + bool analyze_pattern_stmt = false, pattern_def = false; if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "=== vect_determine_vectorization_factor ==="); @@ -296,6 +296,29 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt)))) analyze_pattern_stmt = true; + /* If a pattern statement has a def stmt, analyze it too. */ + if (is_pattern_stmt_p (stmt_info) + && (pattern_def_stmt = STMT_VINFO_PATTERN_DEF_STMT (stmt_info)) + && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_def_stmt)) + || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_def_stmt)))) + { + if (pattern_def) + pattern_def = false; + else + { + if (vect_print_dump_info (REPORT_DETAILS)) + { + fprintf (vect_dump, "==> examining pattern def stmt: "); + print_gimple_stmt (vect_dump, pattern_def_stmt, 0, + TDF_SLIM); + } + + pattern_def = true; + stmt = pattern_def_stmt; + stmt_info = vinfo_for_stmt (stmt); + } + } + if (gimple_get_lhs (stmt) == NULL_TREE) { if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS)) @@ -400,7 +423,7 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) || (nunits > vectorization_factor)) vectorization_factor = nunits; - if (!analyze_pattern_stmt) + if (!analyze_pattern_stmt && !pattern_def) gsi_next (&si); } } @@ -5085,8 +5108,8 @@ vect_transform_loop (loop_vec_info loop_vinfo) tree cond_expr = NULL_TREE; gimple_seq cond_expr_stmt_list = NULL; bool do_peeling_for_loop_bound; - gimple stmt, pattern_stmt; - bool transform_pattern_stmt = false; + gimple stmt, pattern_stmt, pattern_def_stmt; + bool transform_pattern_stmt = false, pattern_def = false; if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "=== vec_transform_loop ==="); @@ -5230,6 +5253,30 @@ vect_transform_loop (loop_vec_info loop_vinfo) || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt)))) transform_pattern_stmt = true; + /* If pattern statement has a def stmt, vectorize it too. */ + if (is_pattern_stmt_p (stmt_info) + && (pattern_def_stmt = STMT_VINFO_PATTERN_DEF_STMT (stmt_info)) + && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_def_stmt)) + || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_def_stmt)))) + { + if (pattern_def) + pattern_def = false; + else + { + if (vect_print_dump_info (REPORT_DETAILS)) + { + fprintf (vect_dump, "==> vectorizing pattern def" + " stmt: "); + print_gimple_stmt (vect_dump, pattern_def_stmt, 0, + TDF_SLIM); + } + + pattern_def = true; + stmt = pattern_def_stmt; + stmt_info = vinfo_for_stmt (stmt); + } + } + gcc_assert (STMT_VINFO_VECTYPE (stmt_info)); nunits = (unsigned int) TYPE_VECTOR_SUBPARTS ( STMT_VINFO_VECTYPE (stmt_info)); @@ -5257,7 +5304,7 @@ vect_transform_loop (loop_vec_info loop_vinfo) /* Hybrid SLP stmts must be vectorized in addition to SLP. */ if (!vinfo_for_stmt (stmt) || PURE_SLP_STMT (stmt_info)) { - if (!transform_pattern_stmt) + if (!transform_pattern_stmt && !pattern_def) gsi_next (&si); continue; } @@ -5289,7 +5336,7 @@ vect_transform_loop (loop_vec_info loop_vinfo) } } - if (!transform_pattern_stmt) + if (!transform_pattern_stmt && !pattern_def) gsi_next (&si); } /* stmts in BB */ } /* BBs in loop */ |