/* Vectorizer
- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
- Foundation, Inc.
- Contributed by Dorit Naishlos <dorit@il.ibm.com>
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
+ Contributed by Dorit Naishlos <dorit@il.ibm.com>
This file is part of GCC.
/* 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)
#include "tm.h"
#include "ggc.h"
#include "tree.h"
-#include "diagnostic.h"
+#include "tree-pretty-print.h"
#include "tree-flow.h"
#include "tree-dump.h"
#include "cfgloop.h"
/* 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;
+static enum vect_verbosity_levels vect_verbosity_level = MAX_VERBOSITY_LEVEL;
/* Loop or bb location. */
LOC vect_location;
\f
-/* Function vect_set_verbosity_level.
-
- Called from opts.c upon detection of the
- -ftree-vectorizer-verbose=N option. */
-
-void
-vect_set_verbosity_level (const char *val)
-{
- unsigned int vl;
-
- vl = atoi (val);
- if (vl < MAX_VERBOSITY_LEVEL)
- user_vect_verbosity_level = (enum verbosity_levels) vl;
- else
- user_vect_verbosity_level
- = (enum verbosity_levels) (MAX_VERBOSITY_LEVEL - 1);
-}
-
-
/* Function vect_set_dump_settings.
Fix the verbosity level of the vectorizer if the
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))
}
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;
For vectorization debug dumps. */
bool
-vect_print_dump_info (enum verbosity_levels vl)
+vect_print_dump_info (enum vect_verbosity_levels vl)
{
if (vl > vect_verbosity_level)
return false;
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;
/* Function vectorize_loops.
-
+
Entry point to loop vectorization phase. */
unsigned
/* ----------- 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))
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);
return num_vectorized_loops > 0 ? TODO_cleanup_cfg : 0;
}
-
+
/* Entry point to basic block SLP phase. */
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);
}
TODO_ggc_collect
| TODO_verify_ssa
| TODO_dump_func
- | TODO_update_ssa
+ | TODO_update_ssa
| TODO_verify_stmts /* todo_flags_finish */
}
};
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);
{
fprintf (dump_file, "Increasing alignment of decl: ");
print_generic_expr (dump_file, decl, TDF_SLIM);
+ fprintf (dump_file, "\n");
}
}
}
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
- TV_NONE, /* tv_id */
+ TV_IPA_OPT, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */