diff options
| author | dorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-02-22 08:16:18 +0000 |
|---|---|---|
| committer | dorit <dorit@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-02-22 08:16:18 +0000 |
| commit | bfe8bfe97f7c02f2f01e838cc046971711cdac05 (patch) | |
| tree | 574c3d11b2b4b5fe7b87fc4164943fcc054acd91 /gcc/tree-vectorizer.c | |
| parent | 2f506d70743b3c4bc73b897c43fe0c101dc45df3 (diff) | |
| download | ppe42-gcc-bfe8bfe97f7c02f2f01e838cc046971711cdac05.tar.gz ppe42-gcc-bfe8bfe97f7c02f2f01e838cc046971711cdac05.zip | |
PR tree-optimization/30858
* tree-vectorizer.c (vect_is_simple_reduction): Check that the stmts
in the reduction cycle have a single use in the loop.
* tree-vectorizer.h (relevant): Add documentation.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122220 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vectorizer.c')
| -rw-r--r-- | gcc/tree-vectorizer.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index fab57234ed9..2a53b9c9fa3 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -1935,14 +1935,35 @@ vect_is_simple_reduction (struct loop *loop, tree phi) int op_type; tree operation, op1, op2; tree type; + int nloop_uses; + tree name; + imm_use_iterator imm_iter; + use_operand_p use_p; - if (TREE_CODE (loop_arg) != SSA_NAME) + name = PHI_RESULT (phi); + nloop_uses = 0; + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name) { - if (vect_print_dump_info (REPORT_DETAILS)) + tree use_stmt = USE_STMT (use_p); + if (flow_bb_inside_loop_p (loop, bb_for_stmt (use_stmt)) + && vinfo_for_stmt (use_stmt) + && !is_pattern_stmt_p (vinfo_for_stmt (use_stmt))) + nloop_uses++; + if (nloop_uses > 1) { - fprintf (vect_dump, "reduction: not ssa_name: "); - print_generic_expr (vect_dump, loop_arg, TDF_SLIM); + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "reduction used in loop."); + return NULL_TREE; } + } + + if (TREE_CODE (loop_arg) != SSA_NAME) + { + if (vect_print_dump_info (REPORT_DETAILS)) + { + fprintf (vect_dump, "reduction: not ssa_name: "); + print_generic_expr (vect_dump, loop_arg, TDF_SLIM); + } return NULL_TREE; } @@ -1950,19 +1971,34 @@ vect_is_simple_reduction (struct loop *loop, tree phi) if (!def_stmt) { if (vect_print_dump_info (REPORT_DETAILS)) - fprintf (vect_dump, "reduction: no def_stmt."); + fprintf (vect_dump, "reduction: no def_stmt."); return NULL_TREE; } if (TREE_CODE (def_stmt) != GIMPLE_MODIFY_STMT) { if (vect_print_dump_info (REPORT_DETAILS)) - { - print_generic_expr (vect_dump, def_stmt, TDF_SLIM); - } + print_generic_expr (vect_dump, def_stmt, TDF_SLIM); return NULL_TREE; } + name = GIMPLE_STMT_OPERAND (def_stmt, 0); + nloop_uses = 0; + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name) + { + tree use_stmt = USE_STMT (use_p); + if (flow_bb_inside_loop_p (loop, bb_for_stmt (use_stmt)) + && vinfo_for_stmt (use_stmt) + && !is_pattern_stmt_p (vinfo_for_stmt (use_stmt))) + nloop_uses++; + if (nloop_uses > 1) + { + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "reduction used in loop."); + return NULL_TREE; + } + } + operation = GIMPLE_STMT_OPERAND (def_stmt, 1); code = TREE_CODE (operation); if (!commutative_tree_code (code) || !associative_tree_code (code)) |

