X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-vect-slp.c;h=b74f5ebf9adf1ca0b13fec5f47498d7ec85d5b2c;hb=74fd6a481624213c16c7bb04b5250d40d75f51e5;hp=1177816ab600cb33bf39190f72615108ca9ec80d;hpb=bed8b93be659c8b8bb94001842533cdd5cbf460d;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 1177816ab60..b74f5ebf9ad 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -95,6 +95,7 @@ vect_free_slp_instance (slp_instance instance) vect_free_slp_tree (SLP_INSTANCE_TREE (instance)); VEC_free (int, heap, SLP_INSTANCE_LOAD_PERMUTATION (instance)); VEC_free (slp_tree, heap, SLP_INSTANCE_LOADS (instance)); + free (instance); } @@ -321,10 +322,15 @@ vect_get_and_check_slp_defs (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, vect_model_store_cost (stmt_info, ncopies_for_cost, false, dt, slp_node); else - /* Not memory operation (we don't call this function for - loads). */ - vect_model_simple_cost (stmt_info, ncopies_for_cost, &dt, - slp_node); + { + enum vect_def_type dts[2]; + dts[0] = dt; + dts[1] = vect_uninitialized_def; + /* Not memory operation (we don't call this function for + loads). */ + vect_model_simple_cost (stmt_info, ncopies_for_cost, dts, + slp_node); + } } } else @@ -1192,7 +1198,8 @@ vect_supported_load_permutation_p (slp_instance slp_instn, int group_size, /* We checked that this case ok, so there is no need to proceed with permutation tests. */ - if (complex_numbers == 2) + if (complex_numbers == 2 + && VEC_length (slp_tree, SLP_INSTANCE_LOADS (slp_instn)) == 2) { VEC_free (slp_tree, heap, SLP_INSTANCE_LOADS (slp_instn)); VEC_free (int, heap, SLP_INSTANCE_LOAD_PERMUTATION (slp_instn)); @@ -1561,6 +1568,9 @@ vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, if (vect_print_dump_info (REPORT_SLP)) fprintf (vect_dump, "Build SLP failed: unrolling required in basic" " block SLP"); + vect_free_slp_tree (node); + VEC_free (int, heap, load_permutation); + VEC_free (slp_tree, heap, loads); return false; } @@ -1817,8 +1827,11 @@ new_bb_vec_info (basic_block bb) static void destroy_bb_vec_info (bb_vec_info bb_vinfo) { + VEC (slp_instance, heap) *slp_instances; + slp_instance instance; basic_block bb; gimple_stmt_iterator si; + unsigned i; if (!bb_vinfo) return; @@ -1838,6 +1851,9 @@ destroy_bb_vec_info (bb_vec_info bb_vinfo) free_data_refs (BB_VINFO_DATAREFS (bb_vinfo)); free_dependence_relations (BB_VINFO_DDRS (bb_vinfo)); VEC_free (gimple, heap, BB_VINFO_STRIDED_STORES (bb_vinfo)); + slp_instances = BB_VINFO_SLP_INSTANCES (bb_vinfo); + FOR_EACH_VEC_ELT (slp_instance, slp_instances, i, instance) + vect_free_slp_instance (instance); VEC_free (slp_instance, heap, BB_VINFO_SLP_INSTANCES (bb_vinfo)); free (bb_vinfo); bb->aux = NULL; @@ -2965,7 +2981,8 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) { VEC (slp_instance, heap) *slp_instances; slp_instance instance; - unsigned int i, vf; + slp_tree loads_node; + unsigned int i, j, vf; bool is_store = false; if (loop_vinfo) @@ -2984,6 +3001,15 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) /* Schedule the tree of INSTANCE. */ is_store = vect_schedule_slp_instance (SLP_INSTANCE_TREE (instance), instance, vf); + + /* Clear STMT_VINFO_VEC_STMT of all loads. With shared loads + between SLP instances we fail to properly initialize the + vectorized SLP stmts and confuse different load permutations. */ + FOR_EACH_VEC_ELT (slp_tree, SLP_INSTANCE_LOADS (instance), j, loads_node) + STMT_VINFO_VEC_STMT + (vinfo_for_stmt + (VEC_index (gimple, SLP_TREE_SCALAR_STMTS (loads_node), 0))) = NULL; + if (vect_print_dump_info (REPORT_VECTORIZED_LOCATIONS) || vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS)) fprintf (vect_dump, "vectorizing stmts using SLP."); @@ -2996,7 +3022,15 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) unsigned int j; gimple_stmt_iterator gsi; - vect_remove_slp_scalar_calls (root); + /* Remove scalar call stmts. Do not do this for basic-block + vectorization as not all uses may be vectorized. + ??? Why should this be necessary? DCE should be able to + remove the stmts itself. + ??? For BB vectorization we can as well remove scalar + stmts starting from the SLP tree root if they have no + uses. */ + if (loop_vinfo) + vect_remove_slp_scalar_calls (root); for (j = 0; VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (root), j, store) && j < SLP_INSTANCE_GROUP_SIZE (instance); j++)