/* Vectorizer
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
Foundation, Inc.
- Contributed by Dorit Naishlos <dorit@il.ibm.com>
+ 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)
/* 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;
/* Loop or bb location. */
LOC vect_location;
-/* Bitmap of virtual variables to be renamed. */
-bitmap vect_memsyms_to_rename;
-
/* Vector mapping GIMPLE stmt to stmt_vec_info. */
VEC(vec_void_p,heap) *stmt_vec_info_vec;
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);
}
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;
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
/* Fix the verbosity level if not defined explicitly by the user. */
vect_set_dump_settings (false);
- /* Allocate the bitmap that records which virtual variables
- need to be renamed. */
- vect_memsyms_to_rename = BITMAP_ALLOC (NULL);
-
init_stmt_vec_info_vec ();
/* ----------- 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);
/* ----------- Finalize. ----------- */
- BITMAP_FREE (vect_memsyms_to_rename);
+ mark_sym_for_renaming (gimple_vop (cfun));
for (i = 1; i < vect_loops_num; i++)
{
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");
}
}
}