* tree-vectorizer.h (unknown_alignment_for_access_p): Replaced by
known_alignment_for_access_p.
(known_alignment_for_access_p): New.
(do_peeling_for_alignment): Field made int instead of bool and renamed
to peeling_for_alignment.
(LOOP_DO_PEELING_FOR_ALIGNMENT): Renamed to LOOP_PEELING_FOR_ALIGNMENT.
* tree-vect-analyze.c (vect_determine_vectorization_factor): New. This
functionality used to be in vect_analyze_operations.
(vect_analyze_operations): Code to determine vectorization factor was
moved to vect_determine_vectorization_factor.
(vect_enhance_data_refs_alignment): Update to correct alignment when it
is known instead of -1. Set LOOP_PEELING_FOR_ALIGNMENT to peeling
factor.
(vect_analyze_loop): Call vect_determine_vectorization_factor (used to
be part of vect_analyze_operations).
* tree-vectorizer.c (slpeel_tree_peel_loop_to_edge): Use fold when
creating the guard condition, as the number of iterations may be
constant.
(slpeel_tree_peel_loop_to_edge): Use new name of
LOOP_DO_PEELING_FOR_ALIGNMENT. Set it to 0 instead of false.
* tree-vect-transform.c (vect_gen_niters_for_prolog_loop): Handle known
alignment case more efficiently. Use LOOP_PEELING_FOR_ALIGNMENT.
(vect_do_peeling_for_alignment): Use fold.
(vect_transform_loop): Use new name of LOOP_DO_PEELING_FOR_ALIGNMENT.
(vect_update_inits_of_dr): Renamed to
vect_update_init_of_dr.
(vect_update_inits_of_drs): Use new name of vect_update_inits_of_dr.
(vectorizable_store): Fix assertion to use == instead of =.
From-SVN: r96526
* cfgloop.c (flow_loop_entry_edges_find, flow_loop_exit_edges_find,
flow_loop_pre_header_scan, flow_loop_pre_header_find,
flow_loop_scan): Removed.
(flow_loop_dump): Do not dump removed fields.
(flow_loop_free): Do not free removed fields.
(flow_loops_find): Flags argument removed. Do not call flow_loop_scan.
(loop_exit_edge_p): New function.
* cfgloop.h (struct loop): Removed fields pre_header, pre_header_edges,
num_pre_header_edges, entry_edges, num_entries, exit_edges,
num_exits, exits_doms.
(LOOP_TREE, LOOP_PRE_HEADER, LOOP_ENTRY_EDGES, LOOP_EXIT_EDGES,
LOOP_EDGES, LOOP_ALL): Removed.
(flow_loop_scan): Declaration removed.
(loop_exit_edge_p, mark_loop_exit_edges): Declare.
* cfgloopmanip.c (create_loop_notes): Do not pass flags to
flow_loops_find.
* ifcvt.c (mark_loop_exit_edges): Moved to cfgloopanal.c.
(if_convert): Call flow_loops_find and flow_loops_free
when calling mark_loop_exit_edges.
* cfgloopanal.c (mark_loop_exit_edges): Moved from
ifcvt.c. Removed the flow_loops_find, flow_loops_free and
free_dominance_info calls.
* loop-init.c (flow_loops_find): Ditto.
* passes.c (rest_of_handle_branch_prob): Ditto.
* lambda-code.c (perfect_nestify): Do not call flow_loops_find.
* loop-unroll.c (analyze_insns_in_loop): Do not use
EDGE_LOOP_EXIT.
* predict.c (predict_loops): Do not call flow_loop_scan.
Use get_loop_exit_edges.
(tree_estimate_probability): Do not pass flags to flow_loops_find.
* tree-if-conv.c (bb_with_exit_edge_p): Take loop as argument.
Do not use EDGE_LOOP_EXIT.
(tree_if_convert_cond_expr, if_convertible_modify_expr_p): Pass loop
to bb_with_exit_edge_p.
(if_convertible_loop_p): Do not call flow_loop_scan. Use
loop->single_exit. Do not use EDGE_LOOP_EXIT. Pass loop
to bb_with_exit_edge_p.
(combine_blocks): Pass loop to bb_with_exit_edge_p. Do not use
EDGE_LOOP_EXIT.
* tree-loop-linear.c (linear_transform_loops): Do not call
flow_loop_scan. Use loop->single_exit.
* tree-vect-analyze.c (vect_analyze_operations): Use loop->single_exit.
(vect_analyze_loop_form): Do not call flow_loop_scan.
* tree-vect-transform.c (vect_update_ivs_after_vectorizer): Use
loop->single_exit.
(vect_do_peeling_for_loop_bound): Use loop_preheader_edge and
loop->single_exit.
* tree-vectorizer.c (slpeel_update_phis_for_duplicate_loop,
slpeel_make_loop_iterate_ntimes, slpeel_can_duplicate_loop_p,
slpeel_tree_duplicate_loop_to_edge_cfg,
slpeel_verify_cfg_after_peeling, slpeel_tree_peel_loop_to_edge):
Use loop_preheader_edge and loop->single_exit. Do not call
flow_loop_scan.
From-SVN: r95738
* tree-vectorizer.c (vect_get_base_and_offset): Remove.
(vect_is_simple_iv_evolution): Remove redundant parameter
and step check.
(vect_analyze_scalar_cycles): Call vect_is_simple_iv_evolution
without last parameter.
(vect_analyze_pointer_ref_access): Get access_fn as parameter.
Return pointer step. Call vect_is_simple_iv_evolution without
last parameter. Check only that the step is multiple of size
type. Remove stmt_vinfo updates.
(vect_get_memtag_and_dr): Remove.
(vect_get_memtag): New function.
(vect_address_analysis): New function.
(vect_object_analysis): New function.
(vect_analyze_data_refs): Call vect_object_analysis and
vect_get_memtag. Update stmt_vinfo fields.
From-SVN: r94934
* tree-data-ref.c (array_base_name_differ_p): Check that the bases
exist and are objects. Remove checks for pointer.
* tree-vectorizer.c (vect_create_addr_base_for_vector_ref): Use
STMT_VINFO_VECT_DR_BASE_ADDRESS instead of DR_BASE_NAME.
(vect_create_data_ref_ptr): Likewise.
(vect_base_addr_differ_p): New function.
(vect_analyze_data_ref_dependence): Call vect_base_addr_differ_p.
(vect_analyze_pointer_ref_access): Add output parameter - ptr_init.
Don't set the DR_BASE_NAME field of data-ref.
(vect_get_memtag_and_dr): Use ptr_init instead of DR_BASE_NAME.
From-SVN: r94932
2005-02-13 Ira Rosen <irar@il.ibm.com>
* tree-vectorizer.h (struct _stmt_vec_info): Rename a field: base
to base_address.
* tree-vectorizer.c (new_stmt_vec_info): Rename the above field of
stmt_vec_info.
(vect_get_base_and_offset): Always return an address.
(vect_create_addr_base_for_vector_ref): Remove treatment for
different data reference types.
(vect_compute_data_ref_alignment): Rename base to base_address in
stmt_vec_info. Get the object in order to force its alignment.
(vect_get_memtag_and_dr): Rename base to base_address in
stmt_vec_info. Extract the object for memtag analysis.
From-SVN: r94930
* tree-vectorizer.c (vect_analyze_data_ref_dependence): Function
declaration added.
(vect_analyze_data_ref_dependences): Likewise.
(vect_is_simple_use): Argument changed from loop structure to
loop_vect_info structure.
(vect_can_advance_ivs_p): Likewise.
(vect_create_index_for_vector_ref): Likewise.
(vect_update_ivs_after_vectorizer): Likewise.
(new_stmt_vec_info): Likewise.
(new_loop_vec_info): Second argument in call to new_stmt_vec_info was
changed from loop to loop_vinfo.
(vect_create_data_ref_ptr): First argument in call to
vect_create_index_for_vector_ref was changed from loop to loop_vinfo.
(vectorizable_assignment): Second argument in call to vect_is_simple_use
was changed from loop to loop_vinfo.
(vectorizable_operation): Likewise.
(vectorizable_store): Likewise.
(vect_mark_stmts_to_be_vectorized): Likewise.
(vect_do_peeling_for_loop_bound): First argument in call to
vect_update_ivs_after_vectorizer was changed from loop to loop_vinfo.
(vect_analyze_operations): Argument in call to vect_can_advance_ivs_p
was changed from loop to loop_vinfo.
(vect_analyze_data_ref_dependences): Third argument in call to
vect_analyze_data_ref_dependence was changed from loop to loop_vinfo.
(vect_create_index_for_vector_ref): Get the loop from loop_vinfo.
(vect_create_data_ref_ptr): Likewise.
(vect_init_vector): Likewise.
(vect_get_vec_def_for_operand): Likewise.
(vectorizable_assignment): Likewise.
(vectorizable_operation): Likewise.
(vectorizable_store): Likewise.
(vectorizable_load): Likewise.
(vect_update_ivs_after_vectorizer): Likewise.
(vect_is_simple_use): Likewise.
(vect_analyze_data_ref_dependence): Likewise.
(vect_analyze_pointer_ref_access): Likewise.
(vect_can_advance_ivs_p): Likewise.
* tree-vectorizer.h: (_loop_vec_info): Definition and macros moved
before _stmt_vec_info.
(_stmt_vec_info): Loop field replaced by loop_vec_info.
(STMT_VINFO_LOOP): Replaced with STMT_VINFO_LOOP_VINFO.
(new_stmt_vec_info): Argument changed from loop structure to
loop_vect_info structure
(vect_analyze_data_ref_dependences): Unnecessary line was removed.
(vect_analyze_offset_expr): Avoid 80 columns overflow.
(vect_create_addr_base_for_vector_ref): Likewise.
(vect_analyze_pointer_ref_access): Likewise.
Co-Authored-By: Dorit Naishlos <dorit@il.ibm.com>
From-SVN: r94661
* tree-vectorizer.c (slpeel_make_loop_iterate_ntimes): Copy
EXPR_LOCUS from orig_cond to the new cond_stmt.
(vect_finish_stmt_generation): Copy EXPR_LOCUS from stmt to
the new vec_stmt.
* tree-vectorizer.c (slpeel_make_loop_iterate_ntimes): Call
standard_iv_increment_position. Remove call to bsi_next
(no need to bump the iterator anymore).
(vect_create_index_for_vector_ref): Call
standard_iv_increment_position. Remove second function argument.
(vect_finish_stmt_generation): Remove call to bsi_next
(no need to bump the iterator anymore).
(vect_create_data_ref_ptr): Remove second argument (bsi) in call
to vect_create_index_for_vector_ref.
* tree-vectorizer.c (vect_mark_stmts_to_be_vectorized): Check if
phis are used out of the loop.
From-SVN: r94651
2005-01-09 Ira Rosen <irar@il.ibm.com>
* tree-vectorizer.c (vect_analyze_offset_expr): Use
expr_invariant_in_loop_p.
Initialize outputs first thing in the function.
(vect_update_ivs_after_vectorizer): Call initial_condition_in_loop_num.
(vect_is_simple_iv_evolution): Call initial_condition_in_loop_num.
(vect_analyze_pointer_ref_access): Check that the initial condition of
the access function is loop invariant.
From-SVN: r93113
2005-01-04 Ira Rosen <irar@il.ibm.com>
* tree-vectorizer.c (vect_analyze_offset_expr): Test for
INTEGER_CST instead of TREE_CONSTANT.
(vect_gen_niters_for_prolog_loop): Test for INTEGER_CST
instead of TREE_CONSTANT.
(vect_analyze_pointer_ref_access): Test for INTEGER_CST
instead of TREE_CONSTANT.
From-SVN: r92894
2004-12-29 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/18179
* tree-vectorizer.c (vect_get_base_and_offset): Call get_inner_reference
and vect_analyze_offset_expr.
(vect_create_addr_base_for_vector_ref): Build address_base by combining
base and initial_offset fields of vect_stmt_info.
(vect_update_inits_of_dr): Update offset of data-ref instead of its
access-fn. Remove argument.
(vect_update_inits_of_drs): Call vect_update_inits_of_dr with new
arguments.
(vect_compute_data_ref_alignment): Check misalignment info in
vect_stmt_info. Remove argument.
(vect_compute_data_refs_alignment): Call vect_compute_data_ref_alignment
with correct argument.
(vect_analyze_data_ref_access): Check access info in vect_stmt_info.
(vect_analyze_pointer_ref_access): Update step and initial_offset fields
of vect_stmt_info.
(vect_get_memtag_and_dr): Call vect_get_base_and_offset and set the
fields of stmt_vec_info.
(vect_analyze_data_refs): Find vectype and pass it to
vect_get_memtag_and_dr.
(vect_get_first_index): Remove.
(vect_compute_array_base_alignment): Remove.
(vect_compute_array_ref_alignment): Remove
(vect_create_data_ref_ptr): Use TYPE_SIZE_UNIT instead GET_MODE_SIZE.
(vect_gen_niters_for_prolog_loop): Use TREE_CONSTANT instead
host_integerp.
(vectorizable_load): Use size arithmetics.
From-SVN: r92704
2004-12-29 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/18179
* tree-vectorizer.h (struct _stmt_vec_info): Add new fields:
initial_offset, step, misalignment and base_aligned_p and macros
to access them.
* tree-vectorizer.c (vect_analyze_offset_expr): New function.
(new_stmt_vec_info): Initialize the new fields of stmt_vec_info.
(vect_create_data_ref_ptr): Fix printings.
From-SVN: r92701
* tree-into-ssa.c (REWRITE_THIS_STMT): Define.
(mark_def_sites): Clear REWRITE_THIS_STMT for statements that
don't need any operands rewritten.
(rewrite_stmt): Ignore statements that don't need to be
rewritten.
(rewrite_operand): Validate that an existing SSA_NAME is
identical to the current reaching definition of the operand.
* tree-dfa.c (mark_call_clobbered_vars_to_rename): New function.
* tree-vectorizer.c (vectorizable_load): Call it.
* tree-flow.h (mark_call_clobbered_vars_to_rename): Declare.
* tree-sra.c (mark_all_v_defs): Also mark VUSEs for renaming.
From-SVN: r92010
2004-11-30 Ira Rosen <irar@il.ibm.com>
PR tree-opt/18607
* tree-vectorizer.c (vect_analyze_data_refs): Use temporary
variable for data_reference when looking for memtag.
From-SVN: r91521
* tree-vectorizer.c (vect_can_force_dr_alignment_p): Return false for
decls that are assembled before vectorization takes place.
(vect_compute_data_ref_alignment): Set DECL_USER_ALIGN to 1.
From-SVN: r91517
* tree-phinodes.c (add_phi_arg): Take "tree" instead of
"tree *" as the first argument.
* tree-flow.h: Update the prototype of add_phi_arg.
* lambda-code.c, tree-cfg.c, tree-into-ssa.c,
tree-ssa-loop-ivopts.c, tree-ssa-loop-manip.c, tree-ssa-pre.c,
tree-ssa-threadupdate.c, tree-ssa.c, tree-tailcall.c,
tree-vectorizer.c: Update all call sites of add_phi_arg.
From-SVN: r91307
* tree-vectorizer.c (vect_analyze_operations): Don't vectorize if
the vectorization factor is greater than the iteration count.
(vect_gen_niters_for_prolog_loop): No need to calculate min if the
iteration count is known.
(vect_build_symbol_bound): Removed. Its functionality moved to
vect_generate_tmps_on_preheader.
(vect_generate_tmps_on_preheader): Moved content of
vect_build_symbol_bound here instead of calling it. Changed some
variables names.
(vect_build_loop_niters): We don't expect a new_bb to be generated -
use gcc_assert.
(vect_gen_niters_for_prolog_loop): Likewise.
(vect_gen_niters_for_prolog_loo): Likewise.
(slpeel_make_loop_iterate_ntimes): Use buildN instead of build.
(slpeel_add_loop_guard): Likewise.
(slpeel_tree_peel_loop_to_edge): Likewise.
(vect_do_peeling_for_alignment): Likewise.
(vect_get_first_index): Missing space.
From-SVN: r91100
PR tree-opt/18403
PR tree-opt/18505
* tree-vectorizer.c (vect_create_data_ref_ptr): Use
lang_hooks.types.type_for_size instead of integer_type_node for the
type of ptr_update.
From-SVN: r91081
PR tree-opt/18536
* tree-vectorizer.c (make_loop_iterate_ntimes): Use type of niters when
creating iv instead of integer_type.
(vect_build_loop_niters): Remove redundant code.
(vect_transform_loop_bound): Removed (duplicates functionality of
make_loop_iterate_ntimes.
(vect_gen_niters_for_prolog_loop): Add documentation. Call
lang_hooks.types.type_for_size to create a type of the required size.
Use that type instead of integer_type. Remove redundant code.
(vect_update_niters_after_peeling): Use type of niters instead of
integer_type.
(vect_transform_loop): Unify handling of known and unknown loop bound
cases. Call make_loop_iterate_ntimes instead of
vect_transform_loop_bound.
From-SVN: r91014
2004-11-19 Andreas Tobler <a.tobler@schweiz.ch>
* tree-vectorizer.c (slpeel_verify_cfg_after_peeling): Define only
if checking is enabled.
From-SVN: r90939
PR tree-opt/18181
* tree-vectorizer.c (slpeel_tree_peel_loop_to_edge): Peeling scheme
changed to suppoer uses-after-loop and to void creating flow paths
that shouldn't exist.
(slpeel_update_phi_nodes_for_guard): Takes additional two arguments.
Modified to fit the new peeling scheme. Avoid quadratic behavior.
(slpeel_add_loop_guard): Takes additional argument.
(slpeel_verify_cfg_after_peeling): New function.
(vect_update_ivs_after_vectorizer): Takes additional argument. Updated
documentation. Use 'exit-bb' instead of creating 'new-bb'.
(rename_variables_in_bb): Don't update phis for BBs out of loop, to fit
the new peeling scheme.
(copy_phi_nodes): Function removed. Its functionality moved to
update_phis_for_duplicate_loop.
(slpeel_update_phis_for_duplicate_loop): Functionality of copy_phi_nodes
moved here. Added documentation. Modified to fit the new peeling scheme.
(slpeel_make_loop_iterate_ntimes): Setting loop->single_exit not not
needed - done in slpeel_tree_peel_loop_to_edge.
(slpeel_tree_duplicate_loop_to_edge_cfg): Debug printouts compacted.
(vect_do_peeling_for_loop_bound): Add documentation. Call
slpeel_verify_cfg_after_peeling. Call vect_update_ivs_after_vectorizer
with additional argument.
(vect_do_peeling_for_alignment): Call slpeel_verify_cfg_after_peeling.
(vect_finish_stmt_generation): Avoid 80 column oveflow.
From-SVN: r90932
* tree-vectorizer.c (slpeel_make_loop_iterate_ntimes): Last two
arguments removed.
(slpeel_tree_peel_loop_to_edge): Call slpeel_make_loop_iterate_ntimes
without last two arguments. Update single_exit of loops.
(vect_update_niters_after_peeling): Removed. Its functionality was
moved to vect_do_peeling_for_alignment.
(vect_do_peeling_for_loop_bound): New name for function previously
called vect_transform_for_unknown_loop_bound.
(vect_transform_loop_bound): Call slpeel_make_loop_iterate_ntimes
instead of code that duplicates the same functionality.
(vect_do_peeling_for_alignment): Functionality of
vect_update_niters_after_peeling moved here.
(vect_transform_loop): Unify call to vect_do_peeling_for_loop_bound -
previously named vect_transform_for_unknown_loop_bound - for both known
and unknown loop bound cases.
From-SVN: r90931
* tree-vectorizer.c (slpeel_can_duplicate_loop_p): New name for function
previously called verify_loop_for_duplication. All conditions compacted
into one compound condition. Removed debug dumps.
(vect_analyze_loop_with_symbolic_num_of_iters): Removed. Some of the
functionality moved to vect_can_advance_ivs_p, and some to
vect_analyze_loop_form.
(vect_can_advance_ivs_p): New function. Contains functionality that was
taken out of vect_analyze_loop_with_symbolic_num_of_iters.
(slpeel_tree_peel_loop_to_edge): Call slpeel_can_duplicate_loop_p.
(vect_analyze_operations): Call vect_can_advance_ivs_p and
slpeel_can_duplicate_loop_p.
(vect_get_loop_niters): Added documentation.
(vect_analyze_loop_form): Check the loop entry always - not only in case
of unknown loop bound. Create preheader and exit bb if necessary. Apply
a check that used to take place in
vect_analyze_loop_with_symbolic_num_of_iters.
(vectorize_loops): Call verify_loop_closed_ssa under ENABLE_CHECKING.
Remove redundant call to rewrite_into_loop_closed_ssa.
(vect_compute_data_refs_alignment): Removed obsolete comment.
From-SVN: r90930
* tree-vectorizer.c (slpeel_tree_peel_loop_to_edge): New name for
function previously called tree_duplicate_loop_to_edge.
(slpeel_tree_duplicate_loop_to_edge_cfg): New name for function
previously called tree_duplicate_loop_to_edge_cfg.
(slpeel_update_phis_for_duplicate_loop): Prefix 'slpeel' added to
function name.
(slpeel_update_phi_nodes_for_guard): Likewise.
(slpeel_make_loop_iterate_ntimes): Likewise.
(slpeel_add_loop_guard): Likewise.
(allocate_new_names, free_new_names): Function declaration moved to top
of file.
(rename_use_op, rename_def_op): Likewise.
(rename_variables_in_bb, rename_variables_in_loop): Likewise.
(vect_generate_tmps_on_preheader): Function declaration moved.
(vect_transform_for_unknown_loop_bound): Added missing function
declaration.
From-SVN: r90929