1. 31 Jul, 2018 40 commits
    • [40/46] Add vec_info::lookup_dr · f5ae2856
      This patch replaces DR_VECT_AUX and vect_dr_stmt with a new
      vec_info::lookup_dr function, so that the lookup is relative
      to a particular vec_info rather than to global state.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::lookup_dr): New member function.
      	(vect_dr_stmt): Delete.
      	* tree-vectorizer.c (vec_info::lookup_dr): New function.
      	* tree-vect-loop-manip.c (vect_update_inits_of_drs): Use it instead
      	of DR_VECT_AUX.
      	* tree-vect-data-refs.c (vect_analyze_possibly_independent_ddr)
      	(vect_analyze_data_ref_dependence, vect_record_base_alignments)
      	(vect_verify_datarefs_alignment, vect_peeling_supportable)
      	(vect_analyze_data_ref_accesses, vect_prune_runtime_alias_test_list)
      	(vect_analyze_data_refs): Likewise.
      	(vect_slp_analyze_data_ref_dependence): Likewise.  Take a vec_info
      	argument.
      	(vect_find_same_alignment_drs): Likewise.
      	(vect_slp_analyze_node_dependences): Update calls accordingly.
      	(vect_analyze_data_refs_alignment): Likewise.  Use vec_info::lookup_dr
      	instead of DR_VECT_AUX.
      	(vect_get_peeling_costs_all_drs): Take a loop_vec_info instead
      	of a vector data references.  Use vec_info::lookup_dr instead of
      	DR_VECT_AUX.
      	(vect_peeling_hash_get_lowest_cost): Update calls accordingly.
      	(vect_enhance_data_refs_alignment): Likewise.  Use vec_info::lookup_dr
      	instead of DR_VECT_AUX.
      
      From-SVN: r263155
      Richard Sandiford committed
    • [39/46] Change STMT_VINFO_UNALIGNED_DR to a dr_vec_info · 1e5e6ff5
      After previous changes, it makes more sense for STMT_VINFO_UNALIGNED_DR
      to be dr_vec_info rather than a data_reference.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_loop_vec_info::unaligned_dr): Change to
      	dr_vec_info.
      	* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Update
      	accordingly.
      	* tree-vect-loop.c (vect_analyze_loop_2): Likewise.
      	* tree-vect-loop-manip.c (get_misalign_in_elems): Likewise.
      	(vect_gen_prolog_loop_niters): Likewise.
      
      From-SVN: r263154
      Richard Sandiford committed
    • [38/46] Use dr_vec_info to represent a data reference · 89fa689a
      This patch makes various routines (mostly in tree-vect-data-refs.c)
      take dr_vec_infos rather than data_references.  The affected routines
      are really dealing with the way that an access is going to vectorised,
      rather than with the original scalar access described by the
      data_reference.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (set_dr_misalignment, dr_misalignment)
      	(DR_TARGET_ALIGNMENT, aligned_access_p, known_alignment_for_access_p)
      	(vect_known_alignment_in_bytes, vect_dr_behavior)
      	(vect_get_scalar_dr_size): Take references as dr_vec_infos
      	instead of data_references.  Update calls to other routines for
      	which the same change has been made.
      	* tree-vect-data-refs.c (vect_preserves_scalar_order_p): Take
      	dr_vec_infos instead of stmt_vec_infos.
      	(vect_analyze_data_ref_dependence): Update call accordingly.
      	(vect_slp_analyze_data_ref_dependence)
      	(vect_record_base_alignments): Use DR_VECT_AUX.
      	(vect_calculate_target_alignment, vect_compute_data_ref_alignment)
      	(vect_update_misalignment_for_peel, verify_data_ref_alignment)
      	(vector_alignment_reachable_p, vect_get_data_access_cost)
      	(vect_peeling_supportable, vect_analyze_group_access_1)
      	(vect_analyze_group_access, vect_analyze_data_ref_access)
      	(vect_vfa_segment_size, vect_vfa_access_size, vect_vfa_align)
      	(vect_compile_time_alias, vect_small_gap_p)
      	(vectorizable_with_step_bound_p, vect_duplicate_ssa_name_ptr_info):
      	(vect_supportable_dr_alignment): Take references as dr_vec_infos
      	instead of data_references.  Update calls to other routines for
      	which the same change has been made.
      	(vect_verify_datarefs_alignment, vect_get_peeling_costs_all_drs)
      	(vect_find_same_alignment_drs, vect_analyze_data_refs_alignment)
      	(vect_slp_analyze_and_verify_node_alignment)
      	(vect_analyze_data_ref_accesses, vect_prune_runtime_alias_test_list)
      	(vect_create_addr_base_for_vector_ref, vect_create_data_ref_ptr)
      	(vect_setup_realignment): Use dr_vec_infos.  Update calls after
      	above changes.
      	(_vect_peel_info::dr): Replace with...
      	(_vect_peel_info::dr_info): ...this new field.
      	(vect_peeling_hash_get_most_frequent)
      	(vect_peeling_hash_choose_best_peeling): Update accordingly.
      	(vect_peeling_hash_get_lowest_cost):
      	(vect_enhance_data_refs_alignment): Likewise.  Update calls to other
      	routines for which the same change has been made.
      	(vect_peeling_hash_insert): Likewise.  Take a dr_vec_info instead of a
      	data_reference.
      	* tree-vect-loop-manip.c (get_misalign_in_elems)
      	(vect_gen_prolog_loop_niters): Use dr_vec_infos.  Update calls after
      	above changes.
      	* tree-vect-loop.c (vect_analyze_loop_2): Likewise.
      	* tree-vect-stmts.c (vect_get_store_cost, vect_get_load_cost)
      	(vect_truncate_gather_scatter_offset, compare_step_with_zero)
      	(get_group_load_store_type, get_negative_load_store_type)
      	(vect_get_data_ptr_increment, vectorizable_store)
      	(vectorizable_load): Likewise.
      	(ensure_base_align): Take a dr_vec_info instead of a data_reference.
      	Update calls to other routines for which the same change has been made.
      
      From-SVN: r263153
      Richard Sandiford committed
    • [37/46] dr_aux tweaks · f44fb7aa
      This patch makes dr_aux link back to both the scalar data_reference
      and the containing stmt_vec_info, so that it becomes a suitable key
      for a vectorisable reference.
      
      The data_reference link is just STMT_VINFO_DATA_REF, moved here
      from _stmt_vec_info.  The stmt pointer is a new field and always
      tracks the current stmt_vec_info for the reference (which might
      be a pattern stmt or the original stmt).
      
      The patch also makes the dr_aux in this current stmt be the one
      that counts, rather than have the information stay with the DR_STMT.
      A new macro (STMT_VINFO_DR_INFO) gives this information for a given
      stmt_info.
      
      In future we could make dr_aux a separate structure, which would
      be useful if we want to support multiple data references per stmt.
      That seems too much of a diversion for this series though.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::move_dr): New member function.
      	(dataref_aux): Rename to...
      	(dr_vec_info): ...this and add "dr" and "stmt" fields.
      	(_stmt_vec_info::dr_aux): Update accordingly.
      	(_stmt_vec_info::data_ref_info): Delete.
      	(STMT_VINFO_GROUPED_ACCESS, DR_GROUP_FIRST_ELEMENT)
      	(DR_GROUP_NEXT_ELEMENT, DR_GROUP_SIZE, DR_GROUP_STORE_COUNT)
      	(DR_GROUP_GAP, DR_GROUP_SAME_DR_STMT, REDUC_GROUP_FIRST_ELEMENT):
      	(REDUC_GROUP_NEXT_ELEMENT, REDUC_GROUP_SIZE): Use dr_aux.dr instead
      	of data_ref.
      	(STMT_VINFO_DATA_REF): Likewise.  Turn into an lvalue.
      	(STMT_VINFO_DR_INFO): New macro.
      	(DR_VECT_AUX): Use STMT_VINFO_DR_INKFO and vect_dr_stmt.
      	(set_dr_misalignment): Update after rename of dataref_aux.
      	(vect_dr_stmt): Move earlier in file.  Return dr_aux.stmt.
      	* tree-vect-stmts.c (new_stmt_vec_info): Remove redundant
      	initialization of STMT_VINFO_DATA_REF.
      	* tree-vectorizer.c (vec_info::move_dr): New function.
      	* tree-vect-patterns.c (vect_recog_bool_pattern)
      	(vect_recog_mask_conversion_pattern)
      	(vect_recog_gather_scatter_pattern): Use it.
      	* tree-vect-data-refs.c (vect_analyze_data_refs): Initialize
      	the "dr" and "stmt" fields of dr_vec_info instead of
      	STMT_VINFO_DATA_REF.
      
      From-SVN: r263152
      Richard Sandiford committed
    • [36/46] Add a pattern_stmt_p field to stmt_vec_info · 634e7150
      This patch adds a pattern_stmt_p field to stmt_vec_info, so that it's
      possible to tell whether the statement is a pattern statement without
      referring to other statements.  The new field goes in what was
      previously a hole in the structure, so the size is the same as before.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_stmt_vec_info::pattern_stmt_p): New field.
      	(is_pattern_stmt_p): Use it.
      	* tree-vect-patterns.c (vect_init_pattern_stmt): Set pattern_stmt_p
      	on pattern statements.
      
      From-SVN: r263151
      Richard Sandiford committed
    • [35/46] Alter interfaces within vect_pattern_recog · cef6cac8
      vect_pattern_recog_1 took a gimple_stmt_iterator as argument, but was
      only interested in the gsi_stmt, not anything else.  This patch makes
      the associated routines operate directly on stmt_vec_infos.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-patterns.c (vect_mark_pattern_stmts): Take the
      	original stmt as a stmt_vec_info rather than a gimple stmt.
      	(vect_pattern_recog_1): Take the statement directly as a
      	stmt_vec_info, rather than via a gimple_stmt_iterator.
      	Update call to vect_mark_pattern_stmts.
      	(vect_pattern_recog): Update calls accordingly.
      
      From-SVN: r263150
      Richard Sandiford committed
    • [34/46] Alter interface to vect_get_vec_def_for_stmt_copy · e4057a39
      This patch makes vect_get_vec_def_for_stmt_copy take a vec_info
      rather than a vect_def_type.  If the vector operand passed in is
      defined in the vectorised region, we should look for copies in
      the normal way.  If it's defined in an external statement
      (such as by vect_init_vector_1) we should just use the original value.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vect_get_vec_defs_for_stmt_copy)
      	(vect_get_vec_def_for_stmt_copy): Take a vec_info rather than
      	a vect_def_type for the first argument.
      	* tree-vect-stmts.c (vect_get_vec_defs_for_stmt_copy): Likewise.
      	(vect_get_vec_def_for_stmt_copy): Likewise.  Return the original
      	operand if it isn't defined by a vectorized statement.
      	(vect_build_gather_load_calls): Remove the mask_dt argument and
      	update calls to vect_get_vec_def_for_stmt_copy.
      	(vectorizable_bswap): Likewise the dt argument.
      	(vectorizable_call): Update calls to vectorizable_bswap and
      	vect_get_vec_def_for_stmt_copy.
      	(vectorizable_simd_clone_call, vectorizable_assignment)
      	(vectorizable_shift, vectorizable_operation, vectorizable_condition)
      	(vectorizable_comparison): Update calls to
      	vect_get_vec_def_for_stmt_copy.
      	(vectorizable_store): Likewise.  Remove now-unnecessary calls to
      	vect_is_simple_use.
      	(vect_get_loop_based_defs): Remove dt argument and update call
      	to vect_get_vec_def_for_stmt_copy.
      	(vectorizable_conversion): Update calls to vect_get_loop_based_defs
      	and vect_get_vec_def_for_stmt_copy.
      	(vectorizable_load): Update calls to vect_build_gather_load_calls
      	and vect_get_vec_def_for_stmt_copy.
      	* tree-vect-loop.c (vect_create_epilog_for_reduction)
      	(vectorizable_reduction, vectorizable_live_operation): Update calls
      	to vect_get_vec_def_for_stmt_copy.
      
      From-SVN: r263149
      Richard Sandiford committed
    • [33/46] Use stmt_vec_infos instead of vec_info/gimple stmt pairs · d7609678
      This patch makes vect_record_max_nunits and vect_record_base_alignment
      take a stmt_vec_info instead of a vec_info/gimple pair.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-data-refs.c (vect_record_base_alignment): Replace vec_info
      	and gimple stmt arguments with a stmt_vec_info.
      	(vect_record_base_alignments): Update calls accordingly.
      	* tree-vect-slp.c (vect_record_max_nunits): Replace vec_info
      	and gimple stmt arguments with a stmt_vec_info.
      	(vect_build_slp_tree_1): Remove vinfo argument and update call
      	to vect_record_max_nunits.
      	(vect_build_slp_tree_2): Update calls to vect_build_slp_tree_1
      	and vect_record_max_nunits.
      
      From-SVN: r263148
      Richard Sandiford committed
    • [32/46] Use stmt_vec_info in function interfaces (part 2) · 32e8e429
      This second part handles the mechanical change from a gimple stmt
      argument to a stmt_vec_info argument.  It updates the function
      comments if they referred to the argument by name, but it doesn't
      try to retrofit mentions to other functions.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (nested_in_vect_loop_p): Move further down
      	file and take a stmt_vec_info instead of a gimple stmt.
      	(supportable_widening_operation, vect_finish_replace_stmt)
      	(vect_finish_stmt_generation, vect_get_store_rhs)
      	(vect_get_vec_def_for_operand_1, vect_get_vec_def_for_operand)
      	(vect_get_vec_defs, vect_init_vector, vect_transform_stmt)
      	(vect_remove_stores, vect_analyze_stmt, vectorizable_condition)
      	(vect_get_smallest_scalar_type, vect_check_gather_scatter)
      	(vect_create_data_ref_ptr, bump_vector_ptr)
      	(vect_permute_store_chain, vect_setup_realignment)
      	(vect_transform_grouped_load, vect_record_grouped_load_vectors)
      	(vect_create_addr_base_for_vector_ref, vectorizable_live_operation)
      	(vectorizable_reduction, vectorizable_induction)
      	(get_initial_def_for_reduction, is_simple_and_all_uses_invariant)
      	(vect_get_place_in_interleaving_chain): Take stmt_vec_infos rather
      	than gimple stmts as arguments.
      	* tree-vect-data-refs.c (vect_get_smallest_scalar_type)
      	(vect_preserves_scalar_order_p, vect_slp_analyze_node_dependences)
      	(can_group_stmts_p, vect_check_gather_scatter)
      	(vect_create_addr_base_for_vector_ref, vect_create_data_ref_ptr)
      	(bump_vector_ptr, vect_permute_store_chain, vect_setup_realignment)
      	(vect_permute_load_chain, vect_shift_permute_load_chain)
      	(vect_transform_grouped_load)
      	(vect_record_grouped_load_vectors): Likewise.
      	* tree-vect-loop.c (vect_fixup_reduc_chain)
      	(get_initial_def_for_reduction, vect_create_epilog_for_reduction)
      	(vectorize_fold_left_reduction, is_nonwrapping_integer_induction)
      	(vectorizable_reduction, vectorizable_induction)
      	(vectorizable_live_operation, vect_loop_kill_debug_uses): Likewise.
      	* tree-vect-patterns.c (type_conversion_p, adjust_bool_stmts)
      	(vect_get_load_store_mask): Likewise.
      	* tree-vect-slp.c (vect_get_place_in_interleaving_chain)
      	(vect_analyze_slp_instance, vect_mask_constant_operand_p): Likewise.
      	* tree-vect-stmts.c (vect_mark_relevant)
      	(is_simple_and_all_uses_invariant)
      	(exist_non_indexing_operands_for_use_p, process_use)
      	(vect_init_vector_1, vect_init_vector, vect_get_vec_def_for_operand_1)
      	(vect_get_vec_def_for_operand, vect_get_vec_defs)
      	(vect_finish_stmt_generation_1, vect_finish_replace_stmt)
      	(vect_finish_stmt_generation, vect_truncate_gather_scatter_offset)
      	(compare_step_with_zero, vect_get_store_rhs, get_group_load_store_type)
      	(get_negative_load_store_type, get_load_store_type)
      	(vect_check_load_store_mask, vect_check_store_rhs)
      	(vect_build_gather_load_calls, vect_get_strided_load_store_ops)
      	(vectorizable_bswap, vectorizable_call, vectorizable_simd_clone_call)
      	(vect_create_vectorized_demotion_stmts, vectorizable_conversion)
      	(vectorizable_assignment, vectorizable_shift, vectorizable_operation)
      	(get_group_alias_ptr_type, vectorizable_store, hoist_defs_of_uses)
      	(vectorizable_load, vectorizable_condition, vectorizable_comparison)
      	(vect_analyze_stmt, vect_transform_stmt, vect_remove_stores)
      	(supportable_widening_operation): Likewise.
      
      From-SVN: r263147
      Richard Sandiford committed
    • [31/46] Use stmt_vec_info in function interfaces (part 1) · 82570274
      This first (less mechanical) part handles cases that involve changes in
      the callers or non-trivial changes in the functions themselves.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-data-refs.c (vect_describe_gather_scatter_call): Take
      	a stmt_vec_info instead of a gcall.
      	(vect_check_gather_scatter): Update call accordingly.
      	* tree-vect-loop-manip.c (iv_phi_p): Take a stmt_vec_info instead
      	of a gphi.
      	(vect_can_advance_ivs_p, vect_update_ivs_after_vectorizer)
      	(slpeel_update_phi_nodes_for_loops):): Update calls accordingly.
      	* tree-vect-loop.c (vect_transform_loop_stmt): Take a stmt_vec_info
      	instead of a gimple stmt.
      	(vect_transform_loop): Update calls accordingly.
      	* tree-vect-slp.c (vect_split_slp_store_group): Take and return
      	stmt_vec_infos instead of gimple stmts.
      	(vect_analyze_slp_instance): Update use accordingly.
      	* tree-vect-stmts.c (read_vector_array, write_vector_array)
      	(vect_clobber_variable, vect_stmt_relevant_p, permute_vec_elements)
      	(vect_use_strided_gather_scatters_p, vect_build_all_ones_mask)
      	(vect_build_zero_merge_argument, vect_get_gather_scatter_ops)
      	(vect_gen_widened_results_half, vect_get_loop_based_defs)
      	(vect_create_vectorized_promotion_stmts, can_vectorize_live_stmts):
      	Take a stmt_vec_info instead of a gimple stmt and pass stmt_vec_infos
      	down to subroutines.
      
      From-SVN: r263146
      Richard Sandiford committed
    • [30/46] Use stmt_vec_infos rather than gimple stmts for worklists · eca52fdd
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (vect_analyze_scalar_cycles_1): Change the type
      	of the worklist from a vector of gimple stmts to a vector of
      	stmt_vec_infos.
      	* tree-vect-stmts.c (vect_mark_relevant, process_use)
      	(vect_mark_stmts_to_be_vectorized): Likewise
      
      From-SVN: r263145
      Richard Sandiford committed
    • [29/46] Use stmt_vec_info instead of gimple stmts internally (part 2) · a1824cfd
      This second part handles the less mechnical cases, i.e. those that don't
      just involve swapping a gimple stmt for an existing stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (vect_analyze_loop_operations): Look up the
      	statement before passing it to vect_analyze_stmt.
      	(vect_create_epilog_for_reduction): Use a stmt_vec_info to walk
      	the chain of phi vector definitions.  Track the exit phi via its
      	stmt_vec_info.
      	(vectorizable_reduction): Set cond_stmt_vinfo directly from the
      	STMT_VINFO_REDUC_DEF.
      	* tree-vect-slp.c (vect_get_place_in_interleaving_chain): Use
      	stmt_vec_infos to handle the statement chains.
      	(vect_get_slp_defs): Record the first statement in the node
      	using a stmt_vec_info.
      	* tree-vect-stmts.c (vect_mark_stmts_to_be_vectorized): Look up
      	statements here and pass their stmt_vec_info down to subroutines.
      	(vect_init_vector_1): Hoist call to vinfo_for_stmt and pass it
      	down to vect_finish_stmt_generation.
      	(vect_init_vector, vect_get_vec_defs, vect_finish_replace_stmt)
      	(vect_finish_stmt_generation): Call vinfo_for_stmt and pass
      	stmt_vec_infos to subroutines.
      	(vect_remove_stores): Use stmt_vec_infos to handle the statement
      	chains.
      
      From-SVN: r263144
      Richard Sandiford committed
    • [28/46] Use stmt_vec_info instead of gimple stmts internally (part 1) · 86a91c0a
      This first part makes functions use stmt_vec_infos instead of
      gimple stmts in cases where the stmt_vec_info was already available
      and where the change is mechanical.  Most of it is just replacing
      "stmt" with "stmt_info".
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-data-refs.c (vect_slp_analyze_node_dependences):
      	(vect_check_gather_scatter, vect_create_data_ref_ptr, bump_vector_ptr)
      	(vect_permute_store_chain, vect_setup_realignment)
      	(vect_permute_load_chain, vect_shift_permute_load_chain)
      	(vect_transform_grouped_load): Use stmt_vec_info rather than gimple
      	stmts internally, and when passing values to other vectorizer routines.
      	* tree-vect-loop-manip.c (vect_can_advance_ivs_p): Likewise.
      	* tree-vect-loop.c (vect_analyze_scalar_cycles_1)
      	(vect_analyze_loop_operations, get_initial_def_for_reduction)
      	(vect_create_epilog_for_reduction, vectorize_fold_left_reduction)
      	(vectorizable_reduction, vectorizable_induction)
      	(vectorizable_live_operation, vect_transform_loop_stmt)
      	(vect_transform_loop): Likewise.
      	* tree-vect-patterns.c (vect_reassociating_reduction_p)
      	(vect_recog_widen_op_pattern, vect_recog_mixed_size_cond_pattern)
      	(vect_recog_bool_pattern, vect_recog_gather_scatter_pattern): Likewise.
      	* tree-vect-slp.c (vect_analyze_slp_instance): Likewise.
      	(vect_slp_analyze_node_operations_1): Likewise.
      	* tree-vect-stmts.c (vect_mark_relevant, process_use)
      	(exist_non_indexing_operands_for_use_p, vect_init_vector_1)
      	(vect_mark_stmts_to_be_vectorized, vect_get_vec_def_for_operand)
      	(vect_finish_stmt_generation_1, get_group_load_store_type)
      	(get_load_store_type, vect_build_gather_load_calls)
      	(vectorizable_bswap, vectorizable_call, vectorizable_simd_clone_call)
      	(vect_create_vectorized_demotion_stmts, vectorizable_conversion)
      	(vectorizable_assignment, vectorizable_shift, vectorizable_operation)
      	(vectorizable_store, vectorizable_load, vectorizable_condition)
      	(vectorizable_comparison, vect_analyze_stmt, vect_transform_stmt)
      	(supportable_widening_operation): Likewise.
      	(vect_get_vector_types_for_stmt): Likewise.
      	* tree-vectorizer.h (vect_dr_behavior): Likewise.
      
      From-SVN: r263143
      Richard Sandiford committed
    • [27/46] Remove duplicated stmt_vec_info lookups · 91987857
      Various places called vect_dr_stmt or vinfo_for_stmt multiple times
      on the same input.  This patch makes them reuse the earlier result.
      It also splits a couple of single vinfo_for_stmt calls out into
      separate statements so that they can be reused in later patches.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-data-refs.c (vect_analyze_data_ref_dependence)
      	(vect_slp_analyze_node_dependences, vect_analyze_data_ref_accesses)
      	(vect_permute_store_chain, vect_permute_load_chain)
      	(vect_shift_permute_load_chain, vect_transform_grouped_load): Avoid
      	repeated stmt_vec_info lookups.
      	* tree-vect-loop-manip.c (vect_can_advance_ivs_p): Likewise.
      	(vect_update_ivs_after_vectorizer): Likewise.
      	* tree-vect-loop.c (vect_is_simple_reduction): Likewise.
      	(vect_create_epilog_for_reduction, vectorizable_reduction): Likewise.
      	* tree-vect-patterns.c (adjust_bool_stmts): Likewise.
      	* tree-vect-slp.c (vect_analyze_slp_instance): Likewise.
      	(vect_bb_slp_scalar_cost): Likewise.
      	* tree-vect-stmts.c (get_group_alias_ptr_type): Likewise.
      
      From-SVN: r263142
      Richard Sandiford committed
    • [26/46] Make more use of dyn_cast in tree-vect* · beb456c3
      If we use stmt_vec_infos to represent statements in the vectoriser,
      it's then more natural to use dyn_cast when processing the statement
      as an assignment, call, etc.  This patch does that in a few more places.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-data-refs.c (vect_check_gather_scatter): Pass the
      	gcall rather than the generic gimple stmt to gimple_call_internal_fn.
      	(vect_get_smallest_scalar_type, can_group_stmts_p): Use dyn_cast
      	to get gassigns and gcalls, rather than operating on generc gimple
      	stmts.
      	* tree-vect-stmts.c (exist_non_indexing_operands_for_use_p)
      	(vect_mark_stmts_to_be_vectorized, vectorizable_store)
      	(vectorizable_load, vect_analyze_stmt): Likewise.
      	* tree-vect-loop.c (vectorizable_reduction): Likewise gphi.
      
      From-SVN: r263141
      Richard Sandiford committed
    • [25/46] Make get_earlier/later_stmt take and return stmt_vec_infos · 95c68311
      ...and also make vect_find_last_scalar_stmt_in_slp return a stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (get_earlier_stmt, get_later_stmt): Take and
      	return stmt_vec_infos rather than gimple stmts.  Do not accept
      	null arguments.
      	(vect_find_last_scalar_stmt_in_slp): Return a stmt_vec_info instead
      	of a gimple stmt.
      	* tree-vect-slp.c (vect_find_last_scalar_stmt_in_slp): Likewise.
      	Update use of get_later_stmt.
      	(vect_get_constant_vectors): Update call accordingly.
      	(vect_schedule_slp_instance): Likewise
      	* tree-vect-data-refs.c (vect_slp_analyze_node_dependences): Likewise.
      	(vect_slp_analyze_instance_dependence): Likewise.
      	(vect_preserves_scalar_order_p): Update use of get_earlier_stmt.
      
      From-SVN: r263140
      Richard Sandiford committed
    • [24/46] Make stmt_info_for_cost use a stmt_vec_info · 211ee39b
      This patch makes stmt_info_for_cost carry a stmt_vec_info instead
      of a gimple stmt.  The structure is internal to the vectoriser,
      so targets aren't affected.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (stmt_info_for_cost::stmt): Replace with...
      	(stmt_info_for_cost::stmt_info): ...this new field.
      	(add_stmt_costs): Update accordingly.
      	* tree-vect-loop.c (vect_compute_single_scalar_iteration_cost)
      	(vect_get_known_peeling_cost): Likewise.
      	(vect_estimate_min_profitable_iters): Likewise.
      	* tree-vect-stmts.c (record_stmt_cost): Likewise.
      
      From-SVN: r263139
      Richard Sandiford committed
    • [23/46] Make LOOP_VINFO_MAY_MISALIGN_STMTS use stmt_vec_info · 7bcbf2d8
      This patch changes LOOP_VINFO_MAY_MISALIGN_STMTS from an
      auto_vec<gimple *> to an auto_vec<stmt_vec_info>.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_loop_vec_info::may_misalign_stmts): Change
      	from an auto_vec<gimple *> to an auto_vec<stmt_vec_info>.
      	* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Update
      	accordingly.
      	* tree-vect-loop-manip.c (vect_create_cond_for_align_checks): Likewise.
      
      From-SVN: r263138
      Richard Sandiford committed
    • [22/46] Make DR_GROUP_SAME_DR_STMT a stmt_vec_info · c26228d4
      This patch changes STMT_VINFO_SAME_DR_STMT from a gimple stmt to a
      stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_stmt_vec_info::same_dr_stmt): Change from
      	a gimple stmt to a stmt_vec_info.
      	* tree-vect-stmts.c (vectorizable_load): Update accordingly.
      
      From-SVN: r263137
      Richard Sandiford committed
    • [21/46] Make grouped_stores and reduction_chains use stmt_vec_infos · f698fccf
      This patch changes the SLP lists grouped_stores and reduction_chains
      from auto_vec<gimple *> to auto_vec<stmt_vec_info>.  It was easier
      to do them together due to the way vect_analyze_slp is structured.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::grouped_stores): Change from
      	an auto_vec<gimple *> to an auto_vec<stmt_vec_info>.
      	(_loop_vec_info::reduction_chains): Likewise.
      	* tree-vect-loop.c (vect_fixup_scalar_cycles_with_patterns): Update
      	accordingly.
      	* tree-vect-slp.c (vect_analyze_slp): Likewise.
      
      From-SVN: r263136
      Richard Sandiford committed
    • [20/46] Make *FIRST_ELEMENT and *NEXT_ELEMENT stmt_vec_infos · bffb8014
      This patch changes {REDUC,DR}_GROUP_{FIRST,NEXT} element from a
      gimple stmt to stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_stmt_vec_info::first_element): Change from
      	a gimple stmt to a stmt_vec_info.
      	(_stmt_vec_info::next_element): Likewise.
      	* tree-vect-data-refs.c (vect_update_misalignment_for_peel)
      	(vect_slp_analyze_and_verify_node_alignment)
      	(vect_analyze_group_access_1, vect_analyze_group_access)
      	(vect_small_gap_p, vect_prune_runtime_alias_test_list)
      	(vect_create_data_ref_ptr, vect_record_grouped_load_vectors)
      	(vect_supportable_dr_alignment): Update accordingly.
      	* tree-vect-loop.c (vect_fixup_reduc_chain): Likewise.
      	(vect_fixup_scalar_cycles_with_patterns, vect_is_slp_reduction)
      	(vect_is_simple_reduction, vectorizable_reduction): Likewise.
      	* tree-vect-patterns.c (vect_reassociating_reduction_p): Likewise.
      	* tree-vect-slp.c (vect_build_slp_tree_1)
      	(vect_attempt_slp_rearrange_stmts, vect_supported_load_permutation_p)
      	(vect_split_slp_store_group, vect_analyze_slp_instance)
      	(vect_analyze_slp, vect_transform_slp_perm_load): Likewise.
      	* tree-vect-stmts.c (vect_model_store_cost, vect_model_load_cost)
      	(get_group_load_store_type, get_load_store_type)
      	(get_group_alias_ptr_type, vectorizable_store, vectorizable_load)
      	(vect_transform_stmt, vect_remove_stores): Likewise.
      
      From-SVN: r263135
      Richard Sandiford committed
    • [19/46] Make vect_dr_stmt return a stmt_vec_info · 78e02b3b
      This patch makes vect_dr_stmt return a stmt_vec_info instead of a
      gimple stmt.  Rather than retain a separate gimple stmt variable
      in cases where both existed, the patch replaces uses of the gimple
      variable with the uses of the stmt_vec_info.  Later patches do this
      more generally.
      
      Many things that are keyed off a data_reference would these days
      be better keyed off a stmt_vec_info, but it's more convenient
      to do that later in the series.  The vect_dr_size calls that are
      left over do still benefit from this patch.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vect_dr_stmt): Return a stmt_vec_info rather
      	than a gimple stmt.
      	* tree-vect-data-refs.c (vect_analyze_data_ref_dependence)
      	(vect_slp_analyze_data_ref_dependence, vect_record_base_alignments)
      	(vect_calculate_target_alignmentm, vect_compute_data_ref_alignment)
      	(vect_update_misalignment_for_peel, vect_verify_datarefs_alignment)
      	(vector_alignment_reachable_p, vect_get_data_access_cost)
      	(vect_get_peeling_costs_all_drs, vect_peeling_hash_get_lowest_cost)
      	(vect_peeling_supportable, vect_enhance_data_refs_alignment)
      	(vect_find_same_alignment_drs, vect_analyze_data_refs_alignment)
      	(vect_analyze_group_access_1, vect_analyze_group_access)
      	(vect_analyze_data_ref_access, vect_analyze_data_ref_accesses)
      	(vect_vfa_access_size, vect_small_gap_p, vect_analyze_data_refs)
      	(vect_supportable_dr_alignment): Remove vinfo_for_stmt from the
      	result of vect_dr_stmt and use the stmt_vec_info instead of
      	the associated gimple stmt.
      	* tree-vect-loop-manip.c (get_misalign_in_elems): Likewise.
      	(vect_gen_prolog_loop_niters): Likewise.
      	* tree-vect-loop.c (vect_analyze_loop_2): Likewise.
      
      From-SVN: r263134
      Richard Sandiford committed
    • [18/46] Make SLP_TREE_SCALAR_STMTS a vec<stmt_vec_info> · b9787581
      This patch changes SLP_TREE_SCALAR_STMTS from a vec<gimple *> to
      a vec<stmt_vec_info>.  It's longer than the previous conversions
      but mostly mechanical.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_slp_tree::stmts): Change from a vec<gimple *>
      	to a vec<stmt_vec_info>.
      	* tree-vect-slp.c (vect_free_slp_tree): Update accordingly.
      	(vect_create_new_slp_node): Take a vec<gimple *> instead of a
      	vec<stmt_vec_info>.
      	(_slp_oprnd_info::def_stmts): Change from a vec<gimple *>
      	to a vec<stmt_vec_info>.
      	(bst_traits::value_type, bst_traits::value_type): Likewise.
      	(bst_traits::hash): Update accordingly.
      	(vect_get_and_check_slp_defs): Change the stmts parameter from
      	a vec<gimple *> to a vec<stmt_vec_info>.
      	(vect_two_operations_perm_ok_p, vect_build_slp_tree_1): Likewise.
      	(vect_build_slp_tree): Likewise.
      	(vect_build_slp_tree_2): Likewise.  Update uses of
      	SLP_TREE_SCALAR_STMTS.
      	(vect_print_slp_tree): Update uses of SLP_TREE_SCALAR_STMTS.
      	(vect_mark_slp_stmts, vect_mark_slp_stmts_relevant)
      	(vect_slp_rearrange_stmts, vect_attempt_slp_rearrange_stmts)
      	(vect_supported_load_permutation_p, vect_find_last_scalar_stmt_in_slp)
      	(vect_detect_hybrid_slp_stmts, vect_slp_analyze_node_operations_1)
      	(vect_slp_analyze_node_operations, vect_slp_analyze_operations)
      	(vect_bb_slp_scalar_cost, vect_slp_analyze_bb_1)
      	(vect_get_constant_vectors, vect_get_slp_defs)
      	(vect_transform_slp_perm_load, vect_schedule_slp_instance)
      	(vect_remove_slp_scalar_calls, vect_schedule_slp): Likewise.
      	(vect_analyze_slp_instance): Build up a vec of stmt_vec_infos
      	instead of gimple stmts.
      	* tree-vect-data-refs.c (vect_slp_analyze_node_dependences): Change
      	the stores parameter for a vec<gimple *> to a vec<stmt_vec_info>.
      	(vect_slp_analyze_instance_dependence): Update uses of
      	SLP_TREE_SCALAR_STMTS.
      	(vect_slp_analyze_and_verify_node_alignment): Likewise.
      	(vect_slp_analyze_and_verify_instance_alignment): Likewise.
      	* tree-vect-loop.c (neutral_op_for_slp_reduction): Likewise.
      	(get_initial_defs_for_reduction): Likewise.
      	(vect_create_epilog_for_reduction): Likewise.
      	(vectorize_fold_left_reduction): Likewise.
      	* tree-vect-stmts.c (vect_prologue_cost_for_slp_op): Likewise.
      	(vect_model_simple_cost, vectorizable_shift, vectorizable_load)
      	(can_vectorize_live_stmts): Likewise.
      
      From-SVN: r263133
      Richard Sandiford committed
    • [17/46] Make LOOP_VINFO_REDUCTIONS an auto_vec<stmt_vec_info> · 32c91dfc
      This patch changes LOOP_VINFO_REDUCTIONS from an auto_vec<gimple *>
      to an auto_vec<stmt_vec_info>.  It also changes the associated
      vect_force_simple_reduction so that it takes and returns stmt_vec_infos
      instead of gimple stmts.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_loop_vec_info::reductions): Change from an
      	auto_vec<gimple *> to an auto_vec<stmt_vec_info>.
      	(vect_force_simple_reduction): Take and return stmt_vec_infos rather
      	than gimple stmts.
      	* tree-parloops.c (valid_reduction_p): Take a stmt_vec_info instead
      	of a gimple stmt.
      	(gather_scalar_reductions): Update after above interface changes.
      	* tree-vect-loop.c (vect_analyze_scalar_cycles_1): Likewise.
      	(vect_is_simple_reduction): Take and return stmt_vec_infos rather
      	than gimple stmts.
      	(vect_force_simple_reduction): Likewise.
      	* tree-vect-patterns.c (vect_pattern_recog_1): Update use of
      	LOOP_VINFO_REDUCTIONS.
      	* tree-vect-slp.c (vect_analyze_slp_instance): Likewise.
      
      From-SVN: r263132
      Richard Sandiford committed
    • [16/46] Make STMT_VINFO_REDUC_DEF a stmt_vec_info · 542ad08c
      This patch changes STMT_VINFO_REDUC_DEF from a gimple stmt to a
      stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_stmt_vec_info::reduc_def): Change from
      	a gimple stmt to a stmt_vec_info.
      	* tree-vect-loop.c (vect_active_double_reduction_p)
      	(vect_force_simple_reduction, vectorizable_reduction): Update
      	accordingly.
      
      From-SVN: r263131
      Richard Sandiford committed
    • [15/46] Make SLP_TREE_VEC_STMTS a vec<stmt_vec_info> · 16edaeb8
      This patch changes SLP_TREE_VEC_STMTS from a vec<gimple *> to a
      vec<stmt_vec_info>.  This involved making the same change to the
      phis vector in vectorizable_reduction, since SLP_TREE_VEC_STMTS is
      spliced into it here:
      
        phis.splice (SLP_TREE_VEC_STMTS (slp_node_instance->reduc_phis));
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_slp_tree::vec_stmts): Change from a
      	vec<gimple *> to a vec<stmt_vec_info>.
      	* tree-vect-loop.c (vect_create_epilog_for_reduction): Change
      	the reduction_phis argument from a vec<gimple *> to a
      	vec<stmt_vec_info>.
      	(vectorizable_reduction): Likewise the phis local variable that
      	is passed to vect_create_epilog_for_reduction.  Update for new type
      	of SLP_TREE_VEC_STMTS.
      	(vectorizable_induction): Update for new type of SLP_TREE_VEC_STMTS.
      	(vectorizable_live_operation): Likewise.
      	* tree-vect-slp.c (vect_get_slp_vect_defs): Likewise.
      	(vect_transform_slp_perm_load, vect_schedule_slp_instance): Likewise.
      
      From-SVN: r263130
      Richard Sandiford committed
    • [14/46] Make STMT_VINFO_VEC_STMT a stmt_vec_info · 1eede195
      This patch changes STMT_VINFO_VEC_STMT from a gimple stmt to a
      stmt_vec_info and makes the vectorizable_* routines pass back
      a stmt_vec_info to vect_transform_stmt.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_stmt_vec_info::vectorized_stmt): Change from
      	a gimple stmt to a stmt_vec_info.
      	(vectorizable_condition, vectorizable_live_operation)
      	(vectorizable_reduction, vectorizable_induction): Pass back the
      	vectorized statement as a stmt_vec_info.
      	* tree-vect-data-refs.c (vect_record_grouped_load_vectors): Update
      	use of STMT_VINFO_VEC_STMT.
      	* tree-vect-loop.c (vect_create_epilog_for_reduction): Likewise,
      	accumulating the inner phis that feed the STMT_VINFO_VEC_STMT
      	as stmt_vec_infos rather than gimple stmts.
      	(vectorize_fold_left_reduction): Change vec_stmt from a gimple stmt
      	to a stmt_vec_info.
      	(vectorizable_live_operation): Likewise.
      	(vectorizable_reduction, vectorizable_induction): Likewise,
      	updating use of STMT_VINFO_VEC_STMT.
      	* tree-vect-stmts.c (vect_get_vec_def_for_operand_1): Update use
      	of STMT_VINFO_VEC_STMT.
      	(vect_build_gather_load_calls, vectorizable_bswap, vectorizable_call)
      	(vectorizable_simd_clone_call, vectorizable_conversion)
      	(vectorizable_assignment, vectorizable_shift, vectorizable_operation)
      	(vectorizable_store, vectorizable_load, vectorizable_condition)
      	(vectorizable_comparison, can_vectorize_live_stmts): Change vec_stmt
      	from a gimple stmt to a stmt_vec_info.
      	(vect_transform_stmt): Update use of STMT_VINFO_VEC_STMT.  Pass a
      	pointer to a stmt_vec_info to the vectorizable_* routines.
      
      From-SVN: r263129
      Richard Sandiford committed
    • [13/46] Make STMT_VINFO_RELATED_STMT a stmt_vec_info · 10681ce8
      This patch changes STMT_VINFO_RELATED_STMT from a gimple stmt to a
      stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (_stmt_vec_info::related_stmt): Change from
      	a gimple stmt to a stmt_vec_info.
      	(is_pattern_stmt_p): Update accordingly.
      	* tree-vect-data-refs.c (vect_preserves_scalar_order_p): Likewise.
      	(vect_record_grouped_load_vectors): Likewise.
      	* tree-vect-loop.c (vect_determine_vf_for_stmt): Likewise.
      	(vect_fixup_reduc_chain, vect_update_vf_for_slp): Likewise.
      	(vect_model_reduction_cost): Likewise.
      	(vect_create_epilog_for_reduction): Likewise.
      	(vectorizable_reduction, vectorizable_induction): Likewise.
      	* tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
      	Return the stmt_vec_info for the pattern statement.
      	(vect_set_pattern_stmt): Update use of STMT_VINFO_RELATED_STMT.
      	(vect_split_statement, vect_mark_pattern_stmts): Likewise.
      	* tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Likewise.
      	(vect_detect_hybrid_slp, vect_get_slp_defs): Likewise.
      	* tree-vect-stmts.c (vect_mark_relevant): Likewise.
      	(vect_get_vec_def_for_operand_1, vectorizable_call): Likewise.
      	(vectorizable_simd_clone_call, vect_analyze_stmt, new_stmt_vec_info)
      	(free_stmt_vec_info, vect_is_simple_use): Likewise.
      
      From-SVN: r263128
      Richard Sandiford committed
    • [12/46] Make vect_finish_stmt_generation return a stmt_vec_info · e1bd7296
      This patch makes vect_finish_replace_stmt and vect_finish_stmt_generation
      return the stmt_vec_info for the vectorised statement, so that the caller
      doesn't need a separate vinfo_for_stmt to get at it.
      
      This involved changing the structure of the statement-generating loops
      so that they use narrow scopes for the vectorised gimple statements
      and use the existing (wider) scopes for the associated stmt_vec_infos.
      This helps with gimple stmt->stmt_vec_info changes further down the line.
      
      The way we do this generation is another area ripe for clean-up,
      but that's too much of a rabbit-hole for this series.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vect_finish_replace_stmt): Return a stmt_vec_info
      	(vect_finish_stmt_generation): Likewise.
      	* tree-vect-stmts.c (vect_finish_stmt_generation_1): Likewise.
      	(vect_finish_replace_stmt, vect_finish_stmt_generation): Likewise.
      	(vect_build_gather_load_calls): Use the return value of the above
      	functions instead of a separate call to vinfo_for_stmt.  Use narrow
      	scopes for the input gimple stmt and wider scopes for the associated
      	stmt_vec_info.  Use vec_info::lookup_def when setting these
      	stmt_vec_infos from an SSA_NAME definition.
      	(vectorizable_bswap, vectorizable_call, vectorizable_simd_clone_call)
      	(vect_create_vectorized_demotion_stmts, vectorizable_conversion)
      	(vectorizable_assignment, vectorizable_shift, vectorizable_operation)
      	(vectorizable_store, vectorizable_load, vectorizable_condition)
      	(vectorizable_comparison): Likewise.
      	* tree-vect-loop.c (vectorize_fold_left_reduction): Likewise.
      	(vectorizable_reduction): Likewise.
      
      From-SVN: r263127
      Richard Sandiford committed
    • [11/46] Pass back a stmt_vec_info from vect_is_simple_use · fef96d8e
      This patch makes vect_is_simple_use pass back a stmt_vec_info to
      those callers that want it.  Most users only need the stmt_vec_info
      but some need the gimple stmt too.
      
      It's probably high time we added a class to represent "simple operands"
      instead, but I have a separate series that tries to clean up how
      operands are handled (with a view to allowing mixed vector sizes).
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vect_is_simple_use): Add an optional
      	stmt_vec_info * parameter before the optional gimple **.
      	* tree-vect-stmts.c (vect_is_simple_use): Likewise.
      	(process_use, vect_get_vec_def_for_operand_1): Update callers.
      	(vect_get_vec_def_for_operand, vectorizable_shift): Likewise.
      	* tree-vect-loop.c (vectorizable_reduction): Likewise.
      	(vectorizable_live_operation): Likewise.
      	* tree-vect-patterns.c (type_conversion_p): Likewise.
      	(vect_look_through_possible_promotion): Likewise.
      	(vect_recog_rotate_pattern): Likewise.
      	* tree-vect-slp.c (vect_get_and_check_slp_defs): Likewise.
      
      From-SVN: r263126
      Richard Sandiford committed
    • [10/46] Temporarily make stmt_vec_info a class · dbe1b846
      This patch turns stmt_vec_info into an unspeakably bad wrapper class
      and adds an implicit conversion to the associated gimple stmt.
      Having this conversion makes the rest of the series easier to write,
      but since the class goes away again at the end of the series, I've
      not bothered adding any comments or tried to make it pretty.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (stmt_vec_info): Temporarily change from
      	a typedef to a wrapper class.
      	(NULL_STMT_VEC_INFO): New macro.
      	(vec_info::stmt_infos): Change to vec<stmt_vec_info>.
      	(stmt_vec_info::operator*): New function.
      	(stmt_vec_info::operator gimple *): Likewise.
      	(set_vinfo_for_stmt): Use NULL_STMT_VEC_INFO.
      	(add_stmt_costs): Likewise.
      	* tree-vect-loop-manip.c (iv_phi_p): Likewise.
      	* tree-vect-loop.c (vect_compute_single_scalar_iteration_cost)
      	(vect_get_known_peeling_cost): Likewise.
      	(vect_estimate_min_profitable_iters): Likewise.
      	* tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
      	* tree-vect-slp.c (vect_remove_slp_scalar_calls): Likewise.
      	* tree-vect-stmts.c (vect_build_gather_load_calls): Likewise.
      	(vectorizable_store, free_stmt_vec_infos): Likewise.
      	(new_stmt_vec_info): Change return type of xcalloc to
      	_stmt_vec_info *.
      
      From-SVN: r263125
      Richard Sandiford committed
    • [09/46] Add vec_info::lookup_single_use · 0d0a4e20
      This patch adds a helper function for seeing whether there is a single
      user of an SSA name, and whether that user has a stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::lookup_single_use): Declare.
      	* tree-vectorizer.c (vec_info::lookup_single_use): New function.
      	* tree-vect-loop.c (vectorizable_reduction): Use it instead of
      	a single_imm_use-based sequence.
      	* tree-vect-stmts.c (supportable_widening_operation): Likewise.
      
      From-SVN: r263124
      Richard Sandiford committed
    • [08/46] Add vec_info::lookup_def · c98d0595
      This patch adds a vec_info helper for checking whether an operand is an
      SSA_NAME that is defined in the vectorisable region.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::lookup_def): Declare.
      	* tree-vectorizer.c (vec_info::lookup_def): New function.
      	* tree-vect-patterns.c (vect_get_internal_def): Use it.
      	(vect_widened_op_tree): Likewise.
      	* tree-vect-stmts.c (vect_is_simple_use): Likewise.
      	* tree-vect-loop.c (vect_analyze_loop_operations): Likewise.
      	(vectorizable_reduction): Likewise.
      	(vect_valid_reduction_input_p): Take a stmt_vec_info instead
      	of a gimple *.
      	(vect_is_slp_reduction): Update calls accordingly.  Use
      	vec_info::lookup_def.
      	(vect_is_simple_reduction): Likewise
      	* tree-vect-slp.c (vect_detect_hybrid_slp_1): Use vec_info::lookup_def.
      
      From-SVN: r263123
      Richard Sandiford committed
    • [07/46] Add vec_info::lookup_stmt · 6585ff8f
      This patch adds a vec_info replacement for vinfo_for_stmt.  The main
      difference is that the new routine can cope with arbitrary statements,
      so there's no need to call vect_stmt_in_region_p first.
      
      The patch only converts calls that are still needed at the end of the
      series.  Later patches get rid of most other calls to vinfo_for_stmt.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::lookup_stmt): Declare.
      	* tree-vectorizer.c (vec_info::lookup_stmt): New function.
      	* tree-vect-loop.c (vect_determine_vf_for_stmt): Use it instead
      	of vinfo_for_stmt.
      	(vect_determine_vectorization_factor, vect_analyze_scalar_cycles_1)
      	(vect_compute_single_scalar_iteration_cost, vect_analyze_loop_form)
      	(vect_update_vf_for_slp, vect_analyze_loop_operations)
      	(vect_is_slp_reduction, vectorizable_induction)
      	(vect_transform_loop_stmt, vect_transform_loop): Likewise.
      	* tree-vect-patterns.c (vect_init_pattern_stmt):
      	(vect_determine_min_output_precision_1, vect_determine_precisions)
      	(vect_pattern_recog): Likewise.
      	* tree-vect-stmts.c (vect_analyze_stmt, vect_transform_stmt): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_density_test): Likewise.
      	* config/rs6000/rs6000.c (rs6000_density_test): Likewise.
      	* tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Likewise.
      	(vect_detect_hybrid_slp_1, vect_detect_hybrid_slp_2)
      	(vect_detect_hybrid_slp): Likewise.  Change the walk_stmt_info
      	info field from a loop to a loop_vec_info.
      
      From-SVN: r263122
      Richard Sandiford committed
    • [06/46] Add vec_info::add_stmt · 4fbeb363
      This patch adds a vec_info function for allocating and setting
      stmt_vec_infos.  It's the start of a long process of removing
      the global stmt_vec_info array.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (stmt_vec_info): Move typedef earlier in file.
      	(vec_info::add_stmt): Declare.
      	* tree-vectorizer.c (vec_info::add_stmt): New function.
      	* tree-vect-data-refs.c (vect_create_data_ref_ptr): Use it.
      	* tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Likewise.
      	(vect_create_epilog_for_reduction, vectorizable_reduction): Likewise.
      	(vectorizable_induction): Likewise.
      	* tree-vect-slp.c (_bb_vec_info::_bb_vec_info): Likewise.
      	* tree-vect-stmts.c (vect_finish_stmt_generation_1): Likewise.
      	(vectorizable_simd_clone_call, vectorizable_store): Likewise.
      	(vectorizable_load): Likewise.
      	* tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
      	(vect_recog_bool_pattern, vect_recog_mask_conversion_pattern)
      	(vect_recog_gather_scatter_pattern): Likewise.
      	(append_pattern_def_seq): Likewise.  Remove a check that is
      	performed by add_stmt itself.
      
      From-SVN: r263121
      Richard Sandiford committed
    • [05/46] Fix make_ssa_name call in vectorizable_reduction · 79cc8302
      The usual vectoriser dance to create new assignments is:
      
          new_stmt = gimple_build_assign (vec_dest, ...);
          new_temp = make_ssa_name (vec_dest, new_stmt);
          gimple_assign_set_lhs (new_stmt, new_temp);
      
      but one site in vectorizable_reduction used:
      
          new_temp = make_ssa_name (vec_dest, new_stmt);
      
      before creating new_stmt.
      
      This method of creating statements probably needs cleaning up, but
      that's for another day...
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (vectorizable_reduction): Fix an instance in
      	which make_ssa_name was called with new_stmt before new_stmt
      	had been created.
      
      From-SVN: r263120
      Richard Sandiford committed
    • [04/46] Factor out the test for a valid reduction input · 83a400d0
      vect_is_slp_reduction and vect_is_simple_reduction had two instances
      each of:
      
                    && (is_gimple_assign (def_stmt)
                        || is_gimple_call (def_stmt)
                        || STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
                                 == vect_induction_def
                        || (gimple_code (def_stmt) == GIMPLE_PHI
                            && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
                                        == vect_internal_def
                            && !is_loop_header_bb_p (gimple_bb (def_stmt)))))
      
      This patch splits it out in a subroutine.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (vect_valid_reduction_input_p): New function,
      	split out from...
      	(vect_is_slp_reduction): ...here...
      	(vect_is_simple_reduction): ...and here.  Remove repetition of tests
      	that are already known to be false.
      
      From-SVN: r263119
      Richard Sandiford committed
    • [03/46] Remove unnecessary update of NUM_SLP_USES · 6e2dd807
      vect_free_slp_tree had:
      
        gimple *stmt;
        FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt)
          /* After transform some stmts are removed and thus their vinfo is gone.  */
          if (vinfo_for_stmt (stmt))
            {
      	gcc_assert (STMT_VINFO_NUM_SLP_USES (vinfo_for_stmt (stmt)) > 0);
      	STMT_VINFO_NUM_SLP_USES (vinfo_for_stmt (stmt))--;
            }
      
      But after transform this update is redundant even for statements that do
      exist, so it seems better to skip this loop for the final teardown.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vect_free_slp_instance): Add a final_p parameter.
      	* tree-vect-slp.c (vect_free_slp_tree): Likewise.  Don't update
      	STMT_VINFO_NUM_SLP_USES when it's true.
      	(vect_free_slp_instance): Add a final_p parameter and pass it to
      	vect_free_slp_tree.
      	(vect_build_slp_tree_2): Update call to vect_free_slp_instance.
      	(vect_analyze_slp_instance): Likewise.
      	(vect_slp_analyze_operations): Likewise.
      	(vect_slp_analyze_bb_1): Likewise.
      	* tree-vectorizer.c (vec_info): Likewise.
      	* tree-vect-loop.c (vect_transform_loop): Likewise.
      
      From-SVN: r263118
      Richard Sandiford committed
    • [02/46] Remove dead vectorizable_reduction code · ac1359be
      vectorizable_reduction has old code to cope with cases in which the
      given statement belongs to a reduction group but isn't the first statement.
      That can no longer happen, since all statements in the group go into the
      same SLP node, and we only check the first statement in each node.
      
      The point is to remove the only path through vectorizable_reduction
      in which stmt and stmt_info refer to different statements.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (vectorizable_reduction): Assert that the
      	function is not called for second and subsequent members of
      	a reduction group.
      
      From-SVN: r263117
      Richard Sandiford committed
    • [01/46] Move special cases out of get_initial_def_for_reduction · 0847049d
      This minor clean-up avoids repeating the test for double reductions
      and also moves the vect_get_vec_def_for_operand call to the same
      function as the corresponding vect_get_vec_def_for_stmt_copy.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-loop.c (get_initial_def_for_reduction): Move special
      	cases for nested loops from here to ...
      	(vect_create_epilog_for_reduction): ...here.  Only call
      	vect_is_simple_use for inner-loop reductions.
      
      From-SVN: r263116
      Richard Sandiford committed