aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-transform.c
diff options
context:
space:
mode:
authorDorit Nuzman <dorit@il.ibm.com>2007-09-07 15:00:11 +0000
committerDorit Nuzman <dorit@gcc.gnu.org>2007-09-07 15:00:11 +0000
commit71f4a02318f4dad261ad8c8e9f77cd36e83f46e3 (patch)
treeeb44856e6a9b109989f0270786b08e7349ebe9dc /gcc/tree-vect-transform.c
parentccf64c833ffaa36f74940afcdaef57a688bb4dcf (diff)
downloadgcc-71f4a02318f4dad261ad8c8e9f77cd36e83f46e3.zip
gcc-71f4a02318f4dad261ad8c8e9f77cd36e83f46e3.tar.gz
gcc-71f4a02318f4dad261ad8c8e9f77cd36e83f46e3.tar.bz2
re PR tree-optimization/33299 (miscompilation with gfortran -O2 -ffast-math -ftree-vectorize)
PR tree-optimization/33299 * tree-vect-transform.c (vect_create_epilog_for_reduction): Update uses for all relevant loop-exit phis, not just the first. From-SVN: r128242
Diffstat (limited to 'gcc/tree-vect-transform.c')
-rw-r--r--gcc/tree-vect-transform.c54
1 files changed, 25 insertions, 29 deletions
diff --git a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c
index 321d3253..cddebde 100644
--- a/gcc/tree-vect-transform.c
+++ b/gcc/tree-vect-transform.c
@@ -1964,6 +1964,8 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt,
tree operation = GIMPLE_STMT_OPERAND (stmt, 1);
bool nested_in_vect_loop = false;
int op_type;
+ VEC(tree,heap) *phis = NULL;
+ int i;
if (nested_in_vect_loop_p (loop, stmt))
{
@@ -2260,11 +2262,7 @@ vect_finalize_reduction:
epilog_stmt = build_gimple_modify_stmt (new_dest, expr);
new_temp = make_ssa_name (new_dest, epilog_stmt);
GIMPLE_STMT_OPERAND (epilog_stmt, 0) = new_temp;
-#if 0
- bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
-#else
bsi_insert_before (&exit_bsi, epilog_stmt, BSI_SAME_STMT);
-#endif
}
@@ -2274,45 +2272,43 @@ vect_finalize_reduction:
Find the loop-closed-use at the loop exit of the original scalar result.
(The reduction result is expected to have two immediate uses - one at the
latch block, and one at the loop exit). */
- exit_phi = NULL;
+ phis = VEC_alloc (tree, heap, 10);
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, scalar_dest)
{
if (!flow_bb_inside_loop_p (loop, bb_for_stmt (USE_STMT (use_p))))
{
exit_phi = USE_STMT (use_p);
- break;
+ VEC_quick_push (tree, phis, exit_phi);
}
}
/* We expect to have found an exit_phi because of loop-closed-ssa form. */
- gcc_assert (exit_phi);
+ gcc_assert (!VEC_empty (tree, phis));
- if (nested_in_vect_loop)
+ for (i = 0; VEC_iterate (tree, phis, i, exit_phi); i++)
{
- stmt_vec_info stmt_vinfo = vinfo_for_stmt (exit_phi);
+ if (nested_in_vect_loop)
+ {
+ stmt_vec_info stmt_vinfo = vinfo_for_stmt (exit_phi);
- /* FORNOW. Currently not supporting the case that an inner-loop reduction
- is not used in the outer-loop (but only outside the outer-loop). */
- gcc_assert (STMT_VINFO_RELEVANT_P (stmt_vinfo)
- && !STMT_VINFO_LIVE_P (stmt_vinfo));
+ /* FORNOW. Currently not supporting the case that an inner-loop reduction
+ is not used in the outer-loop (but only outside the outer-loop). */
+ gcc_assert (STMT_VINFO_RELEVANT_P (stmt_vinfo)
+ && !STMT_VINFO_LIVE_P (stmt_vinfo));
- epilog_stmt = adjustment_def ? epilog_stmt : new_phi;
- STMT_VINFO_VEC_STMT (stmt_vinfo) = epilog_stmt;
- set_stmt_info (get_stmt_ann (epilog_stmt),
- new_stmt_vec_info (epilog_stmt, loop_vinfo));
+ epilog_stmt = adjustment_def ? epilog_stmt : new_phi;
+ STMT_VINFO_VEC_STMT (stmt_vinfo) = epilog_stmt;
+ set_stmt_info (get_stmt_ann (epilog_stmt),
+ new_stmt_vec_info (epilog_stmt, loop_vinfo));
+ continue;
+ }
- if (vect_print_dump_info (REPORT_DETAILS))
- {
- fprintf (vect_dump, "vector of partial results after inner-loop:");
- print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM);
- }
- return;
+ /* Replace the uses: */
+ orig_name = PHI_RESULT (exit_phi);
+ FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, orig_name)
+ FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
+ SET_USE (use_p, new_temp);
}
-
- /* Replace the uses: */
- orig_name = PHI_RESULT (exit_phi);
- FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, orig_name)
- FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
- SET_USE (use_p, new_temp);
+ VEC_free (tree, heap, phis);
}