diff options
author | Ira Rosen <ira.rosen@linaro.org> | 2011-06-30 06:37:41 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2011-06-30 06:37:41 +0000 |
commit | 83197f37339cecf1c89724341a85aae539751f84 (patch) | |
tree | 4f3bebd5f33136e8f6f42ff799dc8c7eb3704c7e /gcc/tree-vect-loop.c | |
parent | 0dcd5f9db100c5c9d4209c04fdbe0f5bd75f2751 (diff) | |
download | gcc-83197f37339cecf1c89724341a85aae539751f84.zip gcc-83197f37339cecf1c89724341a85aae539751f84.tar.gz gcc-83197f37339cecf1c89724341a85aae539751f84.tar.bz2 |
tree-vect-loop.c (vect_determine_vectorization_factor): Handle both pattern and original statements if necessary.
* tree-vect-loop.c (vect_determine_vectorization_factor): Handle
both pattern and original statements if necessary.
(vect_transform_loop): Likewise.
* tree-vect-patterns.c (vect_pattern_recog): Update documentation.
* tree-vect-stmts.c (vect_mark_relevant): Add new argument.
Mark the pattern statement only if the original statement doesn't
have its own uses.
(process_use): Call vect_mark_relevant with additional parameter.
(vect_mark_stmts_to_be_vectorized): Likewise.
(vect_get_vec_def_for_operand): Use vectorized pattern statement.
(vect_analyze_stmt): Handle both pattern and original statements
if necessary.
(vect_transform_stmt): Don't store vectorized pattern statement
in the original statement.
(vect_is_simple_use_1): Use related pattern statement only if the
original statement is irrelevant.
* tree-vect-slp.c (vect_get_and_check_slp_defs): Likewise.
From-SVN: r175681
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 7691267..0352607 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -181,6 +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; if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "=== vect_determine_vectorization_factor ==="); @@ -241,11 +243,19 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) } } - for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) + for (si = gsi_start_bb (bb); !gsi_end_p (si) || analyze_pattern_stmt;) { - tree vf_vectype; - gimple stmt = gsi_stmt (si), pattern_stmt; - stmt_info = vinfo_for_stmt (stmt); + tree vf_vectype; + + if (analyze_pattern_stmt) + { + stmt = pattern_stmt; + analyze_pattern_stmt = false; + } + else + stmt = gsi_stmt (si); + + stmt_info = vinfo_for_stmt (stmt); if (vect_print_dump_info (REPORT_DETAILS)) { @@ -276,9 +286,15 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) { if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "skip."); + gsi_next (&si); continue; } } + else if (STMT_VINFO_IN_PATTERN_P (stmt_info) + && (pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info)) + && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_stmt)) + || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt)))) + analyze_pattern_stmt = true; if (gimple_get_lhs (stmt) == NULL_TREE) { @@ -383,6 +399,9 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) if (!vectorization_factor || (nunits > vectorization_factor)) vectorization_factor = nunits; + + if (!analyze_pattern_stmt) + gsi_next (&si); } } @@ -5057,6 +5076,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; if (vect_print_dump_info (REPORT_DETAILS)) fprintf (vect_dump, "=== vec_transform_loop ==="); @@ -5144,11 +5165,19 @@ vect_transform_loop (loop_vec_info loop_vinfo) } } - for (si = gsi_start_bb (bb); !gsi_end_p (si);) + pattern_stmt = NULL; + for (si = gsi_start_bb (bb); !gsi_end_p (si) || transform_pattern_stmt;) { - gimple stmt = gsi_stmt (si), pattern_stmt; bool is_store; + if (transform_pattern_stmt) + { + stmt = pattern_stmt; + transform_pattern_stmt = false; + } + else + stmt = gsi_stmt (si); + if (vect_print_dump_info (REPORT_DETAILS)) { fprintf (vect_dump, "------>vectorizing statement: "); @@ -5186,6 +5215,11 @@ vect_transform_loop (loop_vec_info loop_vinfo) continue; } } + else if (STMT_VINFO_IN_PATTERN_P (stmt_info) + && (pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info)) + && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_stmt)) + || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt)))) + transform_pattern_stmt = true; gcc_assert (STMT_VINFO_VECTYPE (stmt_info)); nunits = (unsigned int) TYPE_VECTOR_SUBPARTS ( @@ -5214,8 +5248,9 @@ 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)) { - gsi_next (&si); - continue; + if (!transform_pattern_stmt) + gsi_next (&si); + continue; } } @@ -5234,7 +5269,7 @@ vect_transform_loop (loop_vec_info loop_vinfo) the chain. */ vect_remove_stores (GROUP_FIRST_ELEMENT (stmt_info)); gsi_remove (&si, true); - continue; + continue; } else { @@ -5244,7 +5279,9 @@ vect_transform_loop (loop_vec_info loop_vinfo) continue; } } - gsi_next (&si); + + if (!transform_pattern_stmt) + gsi_next (&si); } /* stmts in BB */ } /* BBs in loop */ |