Bootstrapped / tested on x86_64-unknown-linux-gnu, applied. Richard.
2015-10-14 Richard Biener <rguent...@suse.de> * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Reset info at start. (vect_analyze_group_access_1): Add debug print. * tree-vect-loop.c (vect_get_single_scalar_iteration_cost): Rename ... (vect_compute_single_scalar_iteration_cost): ... to this. (vect_analyze_loop_2): Adjust. * tree-vect-slp.c (struct _slp_oprnd_info): Move from ... * tree-vectorizer.h: ... here. (add_stmt_info_to_vec): Remove. * tree-vect-stmts.c (record_stmt_cost): Inline add_stmt_info_to_vec. Index: gcc/tree-vect-data-refs.c =================================================================== *** gcc/tree-vect-data-refs.c (revision 228759) --- gcc/tree-vect-data-refs.c (working copy) *************** vect_enhance_data_refs_alignment (loop_v *** 1352,1357 **** --- 1352,1361 ---- dump_printf_loc (MSG_NOTE, vect_location, "=== vect_enhance_data_refs_alignment ===\n"); + /* Reset data so we can safely be called multiple times. */ + LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).truncate (0); + LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) = 0; + /* While cost model enhancements are expected in the future, the high level view of the code at this time is as follows: *************** vect_analyze_group_access_1 (struct data *** 2151,2156 **** --- 2155,2164 ---- return false; } + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "Two or more load stmts share the same dr.\n"); + /* For load use the same data-ref load. */ GROUP_SAME_DR_STMT (vinfo_for_stmt (next)) = prev; Index: gcc/tree-vect-loop.c =================================================================== *** gcc/tree-vect-loop.c (revision 228759) --- gcc/tree-vect-loop.c (working copy) *************** destroy_loop_vec_info (loop_vec_info loo *** 1043,1049 **** /* Calculate the cost of one scalar iteration of the loop. */ static void ! vect_get_single_scalar_iteration_cost (loop_vec_info loop_vinfo) { struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo); --- 1043,1049 ---- /* Calculate the cost of one scalar iteration of the loop. */ static void ! vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo) { struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo); *************** vect_analyze_loop_2 (loop_vec_info loop_ *** 1739,1745 **** } /* Compute the scalar iteration cost. */ ! vect_get_single_scalar_iteration_cost (loop_vinfo); /* This pass will decide on using loop versioning and/or loop peeling in order to enhance the alignment of data references in the loop. */ --- 1739,1745 ---- } /* Compute the scalar iteration cost. */ ! vect_compute_single_scalar_iteration_cost (loop_vinfo); /* This pass will decide on using loop versioning and/or loop peeling in order to enhance the alignment of data references in the loop. */ Index: gcc/tree-vect-slp.c =================================================================== *** gcc/tree-vect-slp.c (revision 228759) --- gcc/tree-vect-slp.c (working copy) *************** vect_create_new_slp_node (vec<gimple *> *** 135,140 **** --- 135,157 ---- } + /* This structure is used in creation of an SLP tree. Each instance + corresponds to the same operand in a group of scalar stmts in an SLP + node. */ + typedef struct _slp_oprnd_info + { + /* Def-stmts for the operands. */ + vec<gimple *> def_stmts; + /* Information about the first statement, its vector def-type, type, the + operand itself in case it's constant, and an indication if it's a pattern + stmt. */ + enum vect_def_type first_dt; + tree first_op_type; + bool first_pattern; + bool second_pattern; + } *slp_oprnd_info; + + /* Allocate operands info for NOPS operands, and GROUP_SIZE def-stmts for each operand. */ static vec<slp_oprnd_info> Index: gcc/tree-vect-stmts.c =================================================================== *** gcc/tree-vect-stmts.c (revision 228759) --- gcc/tree-vect-stmts.c (working copy) *************** record_stmt_cost (stmt_vector_for_cost * *** 94,105 **** if (body_cost_vec) { tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; ! add_stmt_info_to_vec (body_cost_vec, count, kind, ! stmt_info ? STMT_VINFO_STMT (stmt_info) : NULL, ! misalign); return (unsigned) (builtin_vectorization_cost (kind, vectype, misalign) * count); - } else return add_stmt_cost (stmt_info->vinfo->target_cost_data, --- 94,105 ---- if (body_cost_vec) { tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; ! stmt_info_for_cost si = { count, kind, ! stmt_info ? STMT_VINFO_STMT (stmt_info) : NULL, ! misalign }; ! body_cost_vec->safe_push (si); return (unsigned) (builtin_vectorization_cost (kind, vectype, misalign) * count); } else return add_stmt_cost (stmt_info->vinfo->target_cost_data, Index: gcc/tree-vectorizer.h =================================================================== *** gcc/tree-vectorizer.h (revision 228759) --- gcc/tree-vectorizer.h (working copy) *************** struct stmt_info_for_cost { *** 73,93 **** int misalign; }; - typedef vec<stmt_info_for_cost> stmt_vector_for_cost; - static inline void - add_stmt_info_to_vec (stmt_vector_for_cost *stmt_cost_vec, int count, - enum vect_cost_for_stmt kind, gimple *stmt, int misalign) - { - stmt_info_for_cost si; - si.count = count; - si.kind = kind; - si.stmt = stmt; - si.misalign = misalign; - stmt_cost_vec->safe_push (si); - } - /************************************************************************ SLP ************************************************************************/ --- 73,80 ---- *************** typedef struct _slp_instance { *** 145,166 **** #define SLP_TREE_LOAD_PERMUTATION(S) (S)->load_permutation #define SLP_TREE_TWO_OPERATORS(S) (S)->two_operators - /* This structure is used in creation of an SLP tree. Each instance - corresponds to the same operand in a group of scalar stmts in an SLP - node. */ - typedef struct _slp_oprnd_info - { - /* Def-stmts for the operands. */ - vec<gimple *> def_stmts; - /* Information about the first statement, its vector def-type, type, the - operand itself in case it's constant, and an indication if it's a pattern - stmt. */ - enum vect_def_type first_dt; - tree first_op_type; - bool first_pattern; - bool second_pattern; - } *slp_oprnd_info; - /* This struct is used to store the information of a data reference, --- 132,137 ----