X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-vectorizer.c;h=e337672d034d9a84e83aff7a03927121ab818680;hb=bbecaa2292e2fe07d9107e0342854b1bde57ac97;hp=2c2103eda0a654cf166b9d3a9180e9f1170494bf;hpb=f9e29128a0ef05ab9c04071f6575594eb613ec88;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index 2c2103eda0a..e337672d034 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -1,7 +1,7 @@ /* Vectorizer Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - Contributed by Dorit Naishlos + Contributed by Dorit Naishlos This file is part of GCC. @@ -21,21 +21,21 @@ along with GCC; see the file COPYING3. If not see /* Loop and basic block vectorizer. - This file contains drivers for the three vectorizers: - (1) loop vectorizer (inter-iteration parallelism), + This file contains drivers for the three vectorizers: + (1) loop vectorizer (inter-iteration parallelism), (2) loop-aware SLP (intra-iteration parallelism) (invoked by the loop vectorizer) (3) BB vectorizer (out-of-loops), aka SLP - + The rest of the vectorizer's code is organized as follows: - - tree-vect-loop.c - loop specific parts such as reductions, etc. These are - used by drivers (1) and (2). - - tree-vect-loop-manip.c - vectorizer's loop control-flow utilities, used by - drivers (1) and (2). - - tree-vect-slp.c - BB vectorization specific analysis and transformation, + - tree-vect-loop.c - loop specific parts such as reductions, etc. These are + used by drivers (1) and (2). + - tree-vect-loop-manip.c - vectorizer's loop control-flow utilities, used by + drivers (1) and (2). + - tree-vect-slp.c - BB vectorization specific analysis and transformation, used by drivers (2) and (3). - tree-vect-stmts.c - statements analysis and transformation (used by all). - - tree-vect-data-refs.c - vectorizer specific data-refs analysis and + - tree-vect-data-refs.c - vectorizer specific data-refs analysis and manipulations (used by all). - tree-vect-patterns.c - vectorizable code patterns detector (used by all) @@ -73,7 +73,7 @@ along with GCC; see the file COPYING3. If not see /* vect_dump will be set to stderr or dump_file if exist. */ FILE *vect_dump; -/* vect_verbosity_level set to an invalid value +/* vect_verbosity_level set to an invalid value to mark that it's uninitialized. */ static enum verbosity_levels vect_verbosity_level = MAX_VERBOSITY_LEVEL; static enum verbosity_levels user_vect_verbosity_level = MAX_VERBOSITY_LEVEL; @@ -100,7 +100,7 @@ vect_set_verbosity_level (const char *val) if (vl < MAX_VERBOSITY_LEVEL) user_vect_verbosity_level = (enum verbosity_levels) vl; else - user_vect_verbosity_level + user_vect_verbosity_level = (enum verbosity_levels) (MAX_VERBOSITY_LEVEL - 1); } @@ -125,9 +125,9 @@ vect_set_dump_settings (bool slp) vect_verbosity_level = user_vect_verbosity_level; /* Ignore user defined verbosity if dump flags require higher level of verbosity. */ - if (dump_file) + if (dump_file) { - if (((dump_flags & TDF_DETAILS) + if (((dump_flags & TDF_DETAILS) && vect_verbosity_level >= REPORT_DETAILS) || ((dump_flags & TDF_STATS) && vect_verbosity_level >= REPORT_UNVECTORIZED_LOCATIONS)) @@ -135,8 +135,8 @@ vect_set_dump_settings (bool slp) } else { - /* If there is no dump file, print to stderr in case of loop - vectorization. */ + /* If there is no dump file, print to stderr in case of loop + vectorization. */ if (!slp) vect_dump = stderr; @@ -174,7 +174,7 @@ vect_print_dump_info (enum verbosity_levels vl) DECL_SOURCE_FILE (current_function_decl), DECL_SOURCE_LINE (current_function_decl)); else - fprintf (vect_dump, "\n%s:%d: note: ", + fprintf (vect_dump, "\n%s:%d: note: ", LOC_FILE (vect_location), LOC_LINE (vect_location)); return true; @@ -182,7 +182,7 @@ vect_print_dump_info (enum verbosity_levels vl) /* Function vectorize_loops. - + Entry point to loop vectorization phase. */ unsigned @@ -207,8 +207,8 @@ vectorize_loops (void) /* ----------- Analyze loops. ----------- */ - /* If some loop was duplicated, it gets bigger number - than all previously defined loops. This fact allows us to run + /* If some loop was duplicated, it gets bigger number + than all previously defined loops. This fact allows us to run only over initial loops skipping newly generated ones. */ FOR_EACH_LOOP (li, loop, 0) if (optimize_loop_nest_for_speed_p (loop)) @@ -230,8 +230,8 @@ vectorize_loops (void) statistics_counter_event (cfun, "Vectorized loops", num_vectorized_loops); if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS) - || (vect_print_dump_info (REPORT_VECTORIZED_LOCATIONS) - && num_vectorized_loops > 0)) + || (num_vectorized_loops > 0 + && vect_print_dump_info (REPORT_VECTORIZED_LOCATIONS))) fprintf (vect_dump, "vectorized %u loops in function.\n", num_vectorized_loops); @@ -255,7 +255,7 @@ vectorize_loops (void) return num_vectorized_loops > 0 ? TODO_cleanup_cfg : 0; } - + /* Entry point to basic block SLP phase. */ @@ -289,9 +289,9 @@ execute_vect_slp (void) static bool gate_vect_slp (void) { - /* Apply SLP either if the vectorizer is on and the user didn't specify + /* Apply SLP either if the vectorizer is on and the user didn't specify whether to run SLP or not, or if the SLP flag was set by the user. */ - return ((flag_tree_vectorize != 0 && flag_tree_slp_vectorize != 0) + return ((flag_tree_vectorize != 0 && flag_tree_slp_vectorize != 0) || flag_tree_slp_vectorize == 1); } @@ -313,7 +313,7 @@ struct gimple_opt_pass pass_slp_vectorize = TODO_ggc_collect | TODO_verify_ssa | TODO_dump_func - | TODO_update_ssa + | TODO_update_ssa | TODO_verify_stmts /* todo_flags_finish */ } }; @@ -337,11 +337,13 @@ increase_alignment (void) vnode = vnode->next_needed) { tree vectype, decl = vnode->decl; + tree t; unsigned int alignment; - if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE) + t = TREE_TYPE(decl); + if (TREE_CODE (t) != ARRAY_TYPE) continue; - vectype = get_vectype_for_scalar_type (TREE_TYPE (TREE_TYPE (decl))); + vectype = get_vectype_for_scalar_type (strip_array_types (t)); if (!vectype) continue; alignment = TYPE_ALIGN (vectype); @@ -356,6 +358,7 @@ increase_alignment (void) { fprintf (dump_file, "Increasing alignment of decl: "); print_generic_expr (dump_file, decl, TDF_SLIM); + fprintf (dump_file, "\n"); } } }