X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-vect-transform.c;h=6168fdab74d9dfb84c87fd7c5f8145cc0018d455;hb=9ec0fbe12f5d88044672d79ff164eff1d2ec3f94;hp=8b22dcaf1f489c00340c068da1caa89bb0add098;hpb=51c9253cb03c9ce6bf67ee891d96597473256171;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c index 8b22dcaf1f4..6168fdab74d 100644 --- a/gcc/tree-vect-transform.c +++ b/gcc/tree-vect-transform.c @@ -1,5 +1,5 @@ /* Transformation Utilities for Loop Vectorization. - Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Contributed by Dorit Naishlos This file is part of GCC. @@ -134,7 +134,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) /* Cost model disabled. */ if (!flag_vect_cost_model) { - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model disabled."); return 0; } @@ -153,7 +153,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) /* FIXME: Make cost depend on complexity of individual check. */ vec_outside_cost += VEC_length (tree, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo)); - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model: Adding cost of checks for loop " "versioning to treat misalignment.\n"); } @@ -163,7 +163,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) /* FIXME: Make cost depend on complexity of individual check. */ vec_outside_cost += VEC_length (ddr_p, LOOP_VINFO_MAY_ALIAS_DDRS (loop_vinfo)); - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model: Adding cost of checks for loop " "versioning aliasing.\n"); } @@ -202,7 +202,8 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) stmt_vec_info stmt_info = vinfo_for_stmt (stmt); /* Skip stmts that are not vectorized inside the loop. */ if (!STMT_VINFO_RELEVANT_P (stmt_info) - && STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def) + && (!STMT_VINFO_LIVE_P (stmt_info) + || STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def)) continue; scalar_single_iter_cost += cost_for_stmt (stmt) * factor; vec_inside_cost += STMT_VINFO_INSIDE_OF_LOOP_COST (stmt_info) * factor; @@ -224,14 +225,14 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) if (byte_misalign < 0) { peel_iters_prologue = vf/2; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model: " "prologue peel iters set to vf/2."); /* If peeling for alignment is unknown, loop bound of main loop becomes unknown. */ peel_iters_epilogue = vf/2; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model: " "epilogue peel iters set to vf/2 because " "peeling for alignment is unknown ."); @@ -261,7 +262,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)) { peel_iters_epilogue = vf/2; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model: " "epilogue peel iters set to vf/2 because " "loop iterations are unknown ."); @@ -391,7 +392,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) /* vector version will never be profitable. */ else { - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "cost model: vector iteration cost = %d " "is divisible by scalar iteration cost = %d by a factor " "greater than or equal to the vectorization factor = %d .", @@ -399,7 +400,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) return -1; } - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) { fprintf (vect_dump, "Cost model analysis: \n"); fprintf (vect_dump, " Vector inside of loop cost: %d\n", @@ -425,7 +426,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) then skip the vectorized loop. */ min_profitable_iters--; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, " Profitability threshold = %d\n", min_profitable_iters); @@ -465,7 +466,7 @@ vect_model_reduction_cost (stmt_vec_info stmt_info, enum tree_code reduc_code, vectype = get_vectype_for_scalar_type (TREE_TYPE (reduction_op)); if (!vectype) { - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) { fprintf (vect_dump, "unsupported data-type "); print_generic_expr (vect_dump, TREE_TYPE (reduction_op), TDF_SLIM); @@ -520,7 +521,7 @@ vect_model_reduction_cost (stmt_vec_info stmt_info, enum tree_code reduc_code, STMT_VINFO_OUTSIDE_OF_LOOP_COST (stmt_info) = outer_cost; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_reduction_cost: inside_cost = %d, " "outside_cost = %d .", STMT_VINFO_INSIDE_OF_LOOP_COST (stmt_info), STMT_VINFO_OUTSIDE_OF_LOOP_COST (stmt_info)); @@ -541,7 +542,7 @@ vect_model_induction_cost (stmt_vec_info stmt_info, int ncopies) /* prologue cost for vec_init and vec_step. */ STMT_VINFO_OUTSIDE_OF_LOOP_COST (stmt_info) = 2 * TARG_SCALAR_TO_VEC_COST; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_induction_cost: inside_cost = %d, " "outside_cost = %d .", STMT_VINFO_INSIDE_OF_LOOP_COST (stmt_info), STMT_VINFO_OUTSIDE_OF_LOOP_COST (stmt_info)); @@ -570,7 +571,7 @@ vect_model_simple_cost (stmt_vec_info stmt_info, int ncopies, outside_cost += TARG_SCALAR_TO_VEC_COST; } - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_simple_cost: inside_cost = %d, " "outside_cost = %d .", inside_cost, outside_cost); @@ -628,7 +629,7 @@ vect_model_store_cost (stmt_vec_info stmt_info, int ncopies, inside_cost = ncopies * exact_log2(group_size) * group_size * TARG_VEC_STMT_COST; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_store_cost: strided group_size = %d .", group_size); @@ -637,7 +638,7 @@ vect_model_store_cost (stmt_vec_info stmt_info, int ncopies, /* Costs of the stores. */ inside_cost += ncopies * TARG_VEC_STORE_COST; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_store_cost: inside_cost = %d, " "outside_cost = %d .", inside_cost, outside_cost); @@ -688,7 +689,7 @@ vect_model_load_cost (stmt_vec_info stmt_info, int ncopies, slp_tree slp_node) inside_cost = ncopies * exact_log2(group_size) * group_size * TARG_VEC_STMT_COST; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_load_cost: strided group_size = %d .", group_size); @@ -701,7 +702,7 @@ vect_model_load_cost (stmt_vec_info stmt_info, int ncopies, slp_tree slp_node) { inside_cost += ncopies * TARG_VEC_LOAD_COST; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_load_cost: aligned."); break; @@ -711,7 +712,7 @@ vect_model_load_cost (stmt_vec_info stmt_info, int ncopies, slp_tree slp_node) /* Here, we assign an additional cost for the unaligned load. */ inside_cost += ncopies * TARG_VEC_UNALIGNED_LOAD_COST; - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_load_cost: unaligned supported by " "hardware."); @@ -731,7 +732,7 @@ vect_model_load_cost (stmt_vec_info stmt_info, int ncopies, slp_tree slp_node) } case dr_explicit_realign_optimized: { - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_load_cost: unaligned software " "pipelined."); @@ -758,7 +759,7 @@ vect_model_load_cost (stmt_vec_info stmt_info, int ncopies, slp_tree slp_node) gcc_unreachable (); } - if (vect_print_dump_info (REPORT_DETAILS)) + if (vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "vect_model_load_cost: inside_cost = %d, " "outside_cost = %d .", inside_cost, outside_cost); @@ -1101,8 +1102,12 @@ vect_create_data_ref_ptr (tree stmt, struct loop *at_loop, new_temp = vect_create_addr_base_for_vector_ref (stmt, &new_stmt_list, offset, loop); pe = loop_preheader_edge (loop); - new_bb = bsi_insert_on_edge_immediate (pe, new_stmt_list); - gcc_assert (!new_bb); + if (new_stmt_list) + { + new_bb = bsi_insert_on_edge_immediate (pe, new_stmt_list); + gcc_assert (!new_bb); + } + *initial_address = new_temp; /* Create: p = (vectype *) initial_base */ @@ -2110,11 +2115,7 @@ vect_finish_stmt_generation (tree stmt, tree vec_stmt, /* Make sure bsi points to the stmt that is being vectorized. */ gcc_assert (stmt == bsi_stmt (*bsi)); -#ifdef USE_MAPPED_LOCATION SET_EXPR_LOCATION (vec_stmt, EXPR_LOCATION (stmt)); -#else - SET_EXPR_LOCUS (vec_stmt, EXPR_LOCUS (stmt)); -#endif } @@ -2520,7 +2521,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, vec_size_in_bits = tree_low_cst (TYPE_SIZE (vectype), 1); rhs = build3 (BIT_FIELD_REF, scalar_type, vec_temp, bitsize, bitsize_zero_node); - BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type); epilog_stmt = build_gimple_modify_stmt (new_scalar_dest, rhs); new_temp = make_ssa_name (new_scalar_dest, epilog_stmt); GIMPLE_STMT_OPERAND (epilog_stmt, 0) = new_temp; @@ -2535,7 +2535,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree rhs = build3 (BIT_FIELD_REF, scalar_type, vec_temp, bitsize, bitpos); - BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type); epilog_stmt = build_gimple_modify_stmt (new_scalar_dest, rhs); new_name = make_ssa_name (new_scalar_dest, epilog_stmt); GIMPLE_STMT_OPERAND (epilog_stmt, 0) = new_name; @@ -2571,7 +2570,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, bitpos = bitsize_zero_node; rhs = build3 (BIT_FIELD_REF, scalar_type, new_temp, bitsize, bitpos); - BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type); epilog_stmt = build_gimple_modify_stmt (new_scalar_dest, rhs); new_temp = make_ssa_name (new_scalar_dest, epilog_stmt); GIMPLE_STMT_OPERAND (epilog_stmt, 0) = new_temp; @@ -3637,6 +3635,9 @@ vectorizable_conversion (tree stmt, block_stmt_iterator *bsi, *vec_stmt = STMT_VINFO_VEC_STMT (stmt_info); } + if (vec_oprnds0) + VEC_free (tree, heap, vec_oprnds0); + return true; } @@ -4588,11 +4589,8 @@ vect_permute_store_chain (VEC(tree,heap) *dr_chain, tree scalar_dest, tmp; int i; unsigned int j; - VEC(tree,heap) *first, *second; scalar_dest = GIMPLE_STMT_OPERAND (stmt, 0); - first = VEC_alloc (tree, heap, length/2); - second = VEC_alloc (tree, heap, length/2); /* Check that the operation is supported. */ if (!vect_strided_store_supported (vectype)) @@ -4975,6 +4973,11 @@ vectorizable_store (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt, } } + VEC_free (tree, heap, dr_chain); + VEC_free (tree, heap, oprnds); + if (result_chain) + VEC_free (tree, heap, result_chain); + return true; } @@ -5480,6 +5483,8 @@ vect_transform_strided_load (tree stmt, VEC(tree,heap) *dr_chain, int size, break; } } + + VEC_free (tree, heap, result_chain); return true; } @@ -5880,8 +5885,6 @@ vectorizable_load (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt, bitpos = bitsize_zero_node; vec_inv = build3 (BIT_FIELD_REF, scalar_type, new_temp, bitsize, bitpos); - BIT_FIELD_REF_UNSIGNED (vec_inv) = - TYPE_UNSIGNED (scalar_type); vec_dest = vect_create_destination_var (scalar_dest, NULL_TREE); new_stmt = build_gimple_modify_stmt (vec_dest, vec_inv); @@ -5919,6 +5922,7 @@ vectorizable_load (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt, if (!vect_transform_strided_load (stmt, dr_chain, group_size, bsi)) return false; *vec_stmt = STMT_VINFO_VEC_STMT (stmt_info); + VEC_free (tree, heap, dr_chain); dr_chain = VEC_alloc (tree, heap, group_size); } else @@ -5931,6 +5935,9 @@ vectorizable_load (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt, } } + if (dr_chain) + VEC_free (tree, heap, dr_chain); + return true; } @@ -6552,11 +6559,7 @@ conservative_cost_threshold (loop_vec_info loop_vinfo, || min_profitable_iters > min_scalar_loop_bound)) th = (unsigned) min_profitable_iters; - if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS)) - fprintf (vect_dump, "not vectorized: vectorization may not be " - "profitable."); - - if (th && vect_print_dump_info (REPORT_DETAILS)) + if (th && vect_print_dump_info (REPORT_COST)) fprintf (vect_dump, "Vectorization may not be profitable."); return th; @@ -7271,10 +7274,8 @@ vect_loop_versioning (loop_vec_info loop_vinfo) static void vect_remove_stores (tree first_stmt) { - stmt_ann_t ann; tree next = first_stmt; tree tmp; - stmt_vec_info next_stmt_info; block_stmt_iterator next_si; while (next) @@ -7282,11 +7283,8 @@ vect_remove_stores (tree first_stmt) /* Free the attached stmt_vec_info and remove the stmt. */ next_si = bsi_for_stmt (next); bsi_remove (&next_si, true); - next_stmt_info = vinfo_for_stmt (next); - ann = stmt_ann (next); - tmp = DR_GROUP_NEXT_DR (next_stmt_info); - free (next_stmt_info); - set_stmt_info (ann, NULL); + tmp = DR_GROUP_NEXT_DR (vinfo_for_stmt (next)); + free_stmt_vec_info (next); next = tmp; } } @@ -7385,7 +7383,7 @@ vect_transform_loop (loop_vec_info loop_vinfo) struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo); int nbbs = loop->num_nodes; - block_stmt_iterator si, next_si; + block_stmt_iterator si; int i; tree ratio = NULL; int vectorization_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo); @@ -7550,37 +7548,19 @@ vect_transform_loop (loop_vec_info loop_vinfo) is_store = vect_transform_stmt (stmt, &si, &strided_store, NULL); if (is_store) { - stmt_ann_t ann; if (STMT_VINFO_STRIDED_ACCESS (stmt_info)) { /* Interleaving. If IS_STORE is TRUE, the vectorization of the interleaving chain was completed - free all the stores in the chain. */ - tree next = DR_GROUP_FIRST_DR (stmt_info); - tree tmp; - stmt_vec_info next_stmt_info; - - while (next) - { - next_si = bsi_for_stmt (next); - next_stmt_info = vinfo_for_stmt (next); - /* Free the attached stmt_vec_info and remove the stmt. */ - ann = stmt_ann (next); - tmp = DR_GROUP_NEXT_DR (next_stmt_info); - free (next_stmt_info); - set_stmt_info (ann, NULL); - bsi_remove (&next_si, true); - next = tmp; - } + vect_remove_stores (DR_GROUP_FIRST_DR (stmt_info)); bsi_remove (&si, true); continue; } else { /* Free the attached stmt_vec_info and remove the stmt. */ - ann = stmt_ann (stmt); - free (stmt_info); - set_stmt_info (ann, NULL); + free_stmt_vec_info (stmt); bsi_remove (&si, true); continue; }