aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorIra Rosen <ira.rosen@linaro.org>2011-06-30 06:37:41 +0000
committerIra Rosen <irar@gcc.gnu.org>2011-06-30 06:37:41 +0000
commit83197f37339cecf1c89724341a85aae539751f84 (patch)
tree4f3bebd5f33136e8f6f42ff799dc8c7eb3704c7e /gcc/tree-vect-loop.c
parent0dcd5f9db100c5c9d4209c04fdbe0f5bd75f2751 (diff)
downloadgcc-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.c57
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 */