summaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-04 16:47:17 +0000
committerirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-04 16:47:17 +0000
commit45eea33f3f587405f23969177456cbb4094762e6 (patch)
treef97727c3e140e3effeba1ba33adafa64f68719ea /gcc/tree-vect-loop.c
parent83a435b8e542329d7a1d703de51c3b6bac77b3cb (diff)
downloadgcc-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.c61
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 */