1. 31 Jul, 2018 40 commits
    • targhooks.c (default_have_speculation_safe_value): Add ATTRIBUTE_UNUSED. · 31d87dd2
      	* targhooks.c (default_have_speculation_safe_value): Add
      	ATTRIBUTE_UNUSED.
      
      From-SVN: r263180
      Ian Lance Taylor committed
    • dumpfile.c: eliminate special-casing of dump_file/alt_dump_file · b84e3bde
      With the addition of optinfo, the various dump_* calls had three parts:
      - optionally print to dump_file
      - optionally print to alt_dump_file
      - optionally make an optinfo_item and add it to the pending optinfo,
        creating it for dump_*_loc calls.
      
      However, this split makes it difficult to implement the formatted dumps
      later in patch kit, so as enabling work towards that, this patch removes
      the above split, so that all dumping within the dump_* API goes through
      optinfo_item.
      
      In order to ensure that the dumps to dump_file and alt_dump_file are
      processed immediately (rather than being buffered within the pending
      optinfo for consolidation), this patch introduces the idea of "immediate"
      optinfo_item destinations vs "non-immediate" destinations.
      
      The patch also adds selftest coverage of what's printed, and of scopes.
      
      This adds two allocations per dump_* call when dumping is enabled.
      I'm assuming that this isn't a problem, as dump_enabled_p is normally
      false.  There are ways of optimizing it if it is an issue (by making
      optinfo_item instances become temporaries that borrow the underlying
      buffer), but they require nontrivial changes, so I'd prefer to leave
      that for another patch kit, if it becomes necessary.
      
      gcc/ChangeLog:
      	* dump-context.h: Include "pretty-print.h".
      	(dump_context::refresh_dumps_are_enabled): New decl.
      	(dump_context::emit_item): New decl.
      	(class dump_context): Add fields "m_test_pp" and
      	"m_test_pp_flags".
      	(temp_dump_context::temp_dump_context): Add param "test_pp_flags".
      	(temp_dump_context::get_dumped_text): New decl.
      	(class temp_dump_context): Add field "m_pp".
      	* dumpfile.c (refresh_dumps_are_enabled): Convert to...
      	(dump_context::refresh_dumps_are_enabled): ...and add a test for
      	m_test_pp.
      	(set_dump_file): Update for above change.
      	(set_alt_dump_file): Likewise.
      	(dump_loc): New overload, taking a pretty_printer *.
      	(dump_context::dump_loc): Call end_any_optinfo.  Dump the location
      	to any test pretty-printer.
      	(make_item_for_dump_gimple_stmt): New function, adapted from
      	optinfo::add_gimple_stmt.
      	(dump_context::dump_gimple_stmt): Call it, and use the result,
      	eliminating the direct usage of dump_file and alt_dump_file in
      	favor of indirectly using them via emit_item.
      	(make_item_for_dump_gimple_expr): New function, adapted from
      	optinfo::add_gimple_expr.
      	(dump_context::dump_gimple_expr): Call it, and use the result,
      	eliminating the direct usage of dump_file and alt_dump_file in
      	favor of indirectly using them via emit_item.
      	(make_item_for_dump_generic_expr): New function, adapted from
      	optinfo::add_tree.
      	(dump_context::dump_generic_expr): Call it, and use the result,
      	eliminating the direct usage of dump_file and alt_dump_file in
      	favor of indirectly using them via emit_item.
      	(make_item_for_dump_printf_va): New function, adapted from
      	optinfo::add_printf_va.
      	(make_item_for_dump_printf): New function.
      	(dump_context::dump_printf_va): Call make_item_for_dump_printf_va,
      	and use the result, eliminating the direct usage of dump_file and
      	alt_dump_file in favor of indirectly using them via emit_item.
      	(make_item_for_dump_dec): New function.
      	(dump_context::dump_dec): Call it, and use the result,
      	eliminating the direct usage of dump_file and alt_dump_file in
      	favor of indirectly using them via emit_item.
      	(make_item_for_dump_symtab_node): New function, adapted from
      	optinfo::add_symtab_node.
      	(dump_context::dump_symtab_node): Call it, and use the result,
      	eliminating the direct usage of dump_file and alt_dump_file in
      	favor of indirectly using them via emit_item.
      	(dump_context::begin_scope): Reimplement, avoiding direct usage
      	of dump_file and alt_dump_file in favor of indirectly using them
      	via emit_item.
      	(dump_context::emit_item): New member function.
      	(temp_dump_context::temp_dump_context): Add param "test_pp_flags".
      	Set up test pretty-printer on the underlying context.  Call
      	refresh_dumps_are_enabled.
      	(temp_dump_context::~temp_dump_context): Call
      	refresh_dumps_are_enabled.
      	(temp_dump_context::get_dumped_text): New member function.
      	(selftest::verify_dumped_text): New function.
      	(ASSERT_DUMPED_TEXT_EQ): New macro.
      	(selftest::test_capture_of_dump_calls): Run all tests twice, with
      	and then without optinfo enabled.  Add uses of
      	ASSERT_DUMPED_TEXT_EQ to all tests.  Add test of nested scopes.
      	* dumpfile.h: Update comment for the dump_* API.
      	* optinfo-emit-json.cc
      	(selftest::test_building_json_from_dump_calls): Update for new
      	param for temp_dump_context ctor.
      	* optinfo.cc (optinfo_item::optinfo_item): Remove "owned" param
      	and "m_owned" field.
      	(optinfo_item::~optinfo_item): Likewise.
      	(optinfo::add_item): New member function.
      	(optinfo::emit): Update comment.
      	(optinfo::add_string): Delete.
      	(optinfo::add_printf): Delete.
      	(optinfo::add_printf_va): Delete.
      	(optinfo::add_gimple_stmt): Delete.
      	(optinfo::add_gimple_expr): Delete.
      	(optinfo::add_tree): Delete.
      	(optinfo::add_symtab_node): Delete.
      	(optinfo::add_dec): Delete.
      	* optinfo.h (class dump_context): New forward decl.
      	(optinfo::add_item): New decl.
      	(optinfo::add_string): Delete.
      	(optinfo::add_printf): Delete.
      	(optinfo::add_printf_va): Delete.
      	(optinfo::add_gimple_stmt): Delete.
      	(optinfo::add_gimple_expr): Delete.
      	(optinfo::add_tree): Delete.
      	(optinfo::add_symtab_node): Delete.
      	(optinfo::add_dec): Delete.
      	(optinfo::add_poly_int): Delete.
      	(optinfo_item::optinfo_item): Remove "owned" param.
      	(class optinfo_item): Remove field "m_owned".
      
      From-SVN: r263178
      David Malcolm committed
    • re PR middle-end/86705 (pr45678-2.c ICE with msp430-elf -mlarge) · b06e1dce
      	PR middle-end/86705
      
      	* gcc/cfgexpand.c (set_parm_rtl): Use the alignment of Pmode when
      	MAX_SUPPORTED_STACK_ALIGNMENT would otherwise be exceeded by the
      	requested variable alignment.
      	(expand_one_ssa_partition): Likewise.
      	(expand_one_var): Likewise.
      
      From-SVN: r263177
      Jozef Lawrynowicz committed
    • pdp11 - example of a port not needing a speculation barrier · 31f52518
      This patch is intended as an example of all that is needed if the
      target system doesn't support CPUs that have speculative execution.
      I've chosen the pdp11 port on the basis that it's old enough that this
      is likely to be true for all existing implementations and that there
      is also little chance of that changing in future!
      
      	* config/pdp11/pdp11.c (TARGET_HAVE_SPECULATION_SAFE_VALUE): Redefine
      	to speculation_safe_value_not_needed.
      
      From-SVN: r263176
      Richard Earnshaw committed
    • targhooks - provide an alternative hook for targets that never execute speculatively · f3debef3
      This hook adds an alternative implementation for the target hook
      TARGET_HAVE_SPECULATION_SAFE_VALUE; it can be used by targets that have no
      CPU implementations that execute code speculatively.  All that is needed for
      such targets now is to add:
      
       #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
       #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed.
      
      to where you have your other target hooks and you're done.
      
      gcc:
      	* targhooks.h (speculation_safe_value_not_needed): New prototype.
      	* targhooks.c (speculation_safe_value_not_needed): New function.
      	* target.def (have_speculation_safe_value): Update documentation.
      	* doc/tm.texi: Regenerated.
      
      From-SVN: r263175
      Richard Earnshaw committed
    • AArch64 - use CSDB based sequences if speculation tracking is enabled · c0111dc4
      In this final patch, now that we can track speculation through conditional
      branches, we can use this information to use a less expensive CSDB based
      speculation barrier.
      
      	* config/aarch64/iterators.md (ALLI_TI): New iterator.
      	* config/aarch64/aarch64.md (despeculate_copy<ALLI_TI:mode>): New
      	expand.
      	(despeculate_copy<ALLI:mode>_insn): New insn.
      	(despeculate_copyti_insn): New insn.
      	(despeculate_simple<ALLI:mode>): New insn
      	(despeculate_simpleti): New insn.
      	* config/aarch64/aarch64.c (aarch64_speculation_safe_value): New
      	function.
      	(TARGET_SPECULATION_SAFE_VALUE): Redefine to
      	aarch64_speculation_safe_value.
      	(aarch64_print_operand): Handle const0_rtx in modifier 'H'.
      
      From-SVN: r263174
      Richard Earnshaw committed
    • AArch64 - new pass to add conditional-branch speculation tracking · 3751345d
      This patch is the main part of the speculation tracking code.  It adds
      a new target-specific pass that is run just before the final branch
      reorg pass (so that it can clean up any new edge insertions we make).
      The pass is only run with -mtrack-speculation is passed on the command
      line.
      
      One thing that did come to light as part of this was that the stack pointer
      register was not being permitted in comparision instructions.  We rely on
      that for moving the tracking state between SP and the scratch register at
      function call boundaries.
      
      	* config/aarch64/aarch64-speculation.cc: New file.
      	* config/aarch64/aarch64-passes.def (pass_track_speculation): Add before
      	pass_reorder_blocks.
      	* config/aarch64/aarch64-protos.h (make_pass_track_speculation): Add
      	prototype.
      	* config/aarch64/aarch64.c (aarch64_conditional_register_usage): Fix
      	X14 and X15 when tracking speculation.
      	* config/aarch64/aarch64.md (register name constants): Add
      	SPECULATION_TRACKER_REGNUM and SPECULATION_SCRATCH_REGNUM.
      	(unspec): Add UNSPEC_SPECULATION_TRACKER.
      	(speculation_barrier): New insn attribute.
      	(cmp<mode>): Allow SP in comparisons.
      	(speculation_tracker): New insn.
      	(speculation_barrier): Add speculation_barrier attribute.
      	* config/aarch64/t-aarch64: Add make rule for aarch64-speculation.o.
      	* config.gcc (aarch64*-*-*): Add aarch64-speculation.o to extra_objs.
      	* doc/invoke.texi (AArch64 Options): Document -mtrack-speculation.
      
      From-SVN: r263173
      Richard Earnshaw committed
    • AArch64 - disable CB[N]Z TB[N]Z when tracking speculation · 6e1eaca9
      The CB[N]Z and TB[N]Z instructions do not expose the comparison through
      the condition code flags.  This makes it impossible to track speculative
      execution through such a branch.  We can handle this relatively easily
      by simply disabling the patterns in this case.
      
      A side effect of this is that the split patterns for the atomic operations
      need to also avoid generating these instructions.  They mostly have simple
      fall-backs for this already.
      
      	* config/aarch64/aarch64.md (cb<optab><mode>1): Disable when
      	aarch64_track_speculation is true.
      	(tb<optab><mode>1): Likewise.
      	* config/aarch64/aarch64.c (aarch64_split_compare_regs): Do not
      	generate CB[N]Z when tracking speculation.
      	(aarch64_split_compare_and_swap): Likewise.
      	(aarch64_split_atomic_op): Likewise.
      
      From-SVN: r263172
      Richard Earnshaw committed
    • AArch64 - Add new option -mtrack-speculation · 3b0c2502
      This patch doesn't do anything useful, it simply adds a new command-line
      option -mtrack-speculation to AArch64.  Subsequent patches build on this.
      
      	* config/aarch64/aarch64.opt (mtrack-speculation): New target option.
      
      From-SVN: r263171
      Richard Earnshaw committed
    • AArch64 - add speculation barrier · def745b2
      Similar to Arm, this adds an unconditional speculation barrier for AArch64.
      
      	* config/aarch64.md (unspecv): Add UNSPECV_SPECULAION_BARRIER.
      	(speculation_barrier): New insn.
      
      From-SVN: r263170
      Richard Earnshaw committed
    • Arm - add speculation_barrier pattern · bb8b0096
      This patch defines a speculation barrier for AArch32.
      
      	* config/arm/unspecs.md (unspecv): Add VUNSPEC_SPECULATION_BARRIER.
      	* config/arm/arm.md (speculation_barrier): New expand.
      	(speculation_barrier_insn): New pattern.
      
      From-SVN: r263169
      Richard Earnshaw committed
    • Add __builtin_speculation_safe_value · 425fc685
      This patch defines a new intrinsic function
      __builtin_speculation_safe_value.  A generic default implementation is
      defined which will attempt to use the backend pattern
      "speculation_safe_barrier".  If this pattern is not defined, or if it
      is not available, then the compiler will emit a warning, but
      compilation will continue.
      
      Note that the test spec-barrier-1.c will currently fail on all
      targets.  This is deliberate, the failure will go away when
      appropriate action is taken for each target backend.
      
      gcc:
      	* builtin-types.def (BT_FN_PTR_PTR_VAR): New function type.
      	(BT_FN_I1_I1_VAR, BT_FN_I2_I2_VAR, BT_FN_I4_I4_VAR): Likewise.
      	(BT_FN_I8_I8_VAR, BT_FN_I16_I16_VAR): Likewise.
      	* builtin-attrs.def (ATTR_NOVOPS_NOTHROW_LEAF_LIST): New attribute
      	list.
      	* builtins.def (BUILT_IN_SPECULATION_SAFE_VALUE_N): New builtin.
      	(BUILT_IN_SPECULATION_SAFE_VALUE_PTR): New internal builtin.
      	(BUILT_IN_SPECULATION_SAFE_VALUE_1): Likewise.
      	(BUILT_IN_SPECULATION_SAFE_VALUE_2): Likewise.
      	(BUILT_IN_SPECULATION_SAFE_VALUE_4): Likewise.
      	(BUILT_IN_SPECULATION_SAFE_VALUE_8): Likewise.
      	(BUILT_IN_SPECULATION_SAFE_VALUE_16): Likewise.
      	* builtins.c (expand_speculation_safe_value): New function.
      	(expand_builtin): Call it.
      	* doc/cpp.texi: Document predefine __HAVE_SPECULATION_SAFE_VALUE.
      	* doc/extend.texi: Document __builtin_speculation_safe_value.
      	* doc/md.texi: Document "speculation_barrier" pattern.
      	* doc/tm.texi.in: Pull in TARGET_SPECULATION_SAFE_VALUE and
      	TARGET_HAVE_SPECULATION_SAFE_VALUE.
      	* doc/tm.texi: Regenerated.
      	* target.def (have_speculation_safe_value, speculation_safe_value): New
      	hooks.
      	* targhooks.c (default_have_speculation_safe_value): New function.
      	(default_speculation_safe_value): New function.
      	* targhooks.h (default_have_speculation_safe_value): Add prototype.
      	(default_speculation_safe_value): Add prototype.
      
      c-family:
      	* c-common.c (speculation_safe_resolve_call): New function.
      	(speculation_safe_resolve_params): New function.
      	(speculation_safe_resolve_return): New function.
      	(resolve_overloaded_builtin): Handle __builtin_speculation_safe_value.
      	* c-cppbuiltin.c (c_cpp_builtins): Add pre-define for
      	__HAVE_SPECULATION_SAFE_VALUE.
      
      testsuite:
      	* c-c++-common/spec-barrier-1.c: New test.
      	* c-c++-common/spec-barrier-2.c: New test.
      	* gcc.dg/spec-barrier-3.c: New test.
      
      From-SVN: r263168
      Richard Earnshaw committed
    • Simplify dump_context by adding a dump_loc member function · 1d8693a0
      This patch removes some duplicated code in dumpfile.c by
      reimplementing the various dump_foo_loc calls in terms of dump_foo.
      
      gcc/ChangeLog:
      	* dump-context.h (dump_context::dump_loc): New decl.
      	* dumpfile.c (dump_context::dump_loc): New member function.
      	(dump_context::dump_gimple_stmt_loc): Reimplement using dump_loc
      	and dump_gimple_stmt.
      	(dump_context::dump_gimple_expr_loc): Likewise, using
      	dump_gimple_expr.
      	(dump_context::dump_generic_expr_loc): Likewise, using
      	dump_generic_expr.
      	(dump_context::dump_printf_loc_va): Likewise, using
      	dump_printf_va.
      	(dump_context::begin_scope): Explicitly using the global function
      	"dump_loc", rather than the member function.
      
      From-SVN: r263167
      David Malcolm committed
    • PR tree-optimization/86741 - ICE in -Warray-bounds indexing into an object of incomplete type · 8e73e614
      gcc/ChangeLog:
      
      	PR tree-optimization/86741
      	* tree-vrp.c (vrp_prop::check_mem_ref): Avoid incomplete types.
      
      gcc/testsuite/ChangeLog:
      
      	PR tree-optimization/86741
      	* gcc.dg/Warray-bounds-33.c: New test.
      
      From-SVN: r263166
      Martin Sebor committed
    • S/390: Don't emit prefetch instructions for clrmem · 4de3a1e1
      gcc/ChangeLog:
      
      2018-07-31  Andreas Krebbel  <krebbel@linux.ibm.com>
      
      	* config/s390/s390.c (s390_expand_setmem): Make the unrolling to
      	depend on whether prefetch instructions will be emitted or not.
      	Use TARGET_SETMEM_PFD for checking whether prefetch instructions
      	will be emitted or not.
      	* config/s390/s390.h (TARGET_SETMEM_PREFETCH_DISTANCE)
      	(TARGET_SETMEM_PFD): New macros.
      
      gcc/testsuite/ChangeLog:
      
      2018-07-31  Andreas Krebbel  <krebbel@linux.ibm.com>
      
      	* gcc.target/s390/memset-1.c: Improve testcase.
      
      From-SVN: r263165
      Andreas Krebbel committed
    • [c++] Fix DECL_BY_REFERENCE of clone parms · 77b46042
      Consider test.C compiled at -O0 -g:
      ...
      class string {
      public:
        string (const char *p) { this->p = p ; }
        string (const string &s) { this->p = s.p; }
      
      private:
        const char *p;
      };
      
      class foo {
      public:
        foo (string dir_hint) {}
      };
      
      int
      main (void)
      {
        std::string s = "This is just a string";
        foo bar(s);
        return 0;
      }
      ...
      
      When parsing foo::foo, the dir_hint parameter gets a DECL_ARG_TYPE of
      'struct string & restrict'.  Then during finish_struct, we call
      clone_constructors_and_destructors and create clones for foo::foo, and
      set the DECL_ARG_TYPE in the same way.
      
      Later on, during finish_function, cp_genericize is called for the original
      foo::foo, which sets the type of parm dir_hint to DECL_ARG_TYPE, and sets
      DECL_BY_REFERENCE of dir_hint to 1.
      
      After that, during maybe_clone_body update_cloned_parm is called with:
      ...
      (gdb) call debug_generic_expr (parm.typed.type)
      struct string & restrict
      (gdb) call debug_generic_expr (cloned_parm.typed.type)
      struct string
      ...
      The type of the cloned_parm is then set to the type of parm, but
      DECL_BY_REFERENCE is not set.
      
      When doing cp_genericize for the clone later on,
      TREE_ADDRESSABLE (TREE_TYPE ()) is no longer true for the updated type for
      the parm, so DECL_BY_REFERENCE is not set there either.
      
      The missing DECL_BY_REFERENCE on cloned_parm causes incorrect debug info to be
      generated.
      
      This patch fixes the problem by copying DECL_BY_REFERENCE in update_cloned_parm.
      
      Bootstrapped and reg-tested on x86_64.
      
      2018-07-31  Tom de Vries  <tdevries@suse.de>
      
      	PR debug/86687
      	* optimize.c (update_cloned_parm): Copy DECL_BY_REFERENCE.
      
      	* g++.dg/guality/pr86687.C: New test.
      
      From-SVN: r263164
      Tom de Vries committed
    • Improve libstdc++ docs w.r.t newer C++ standards · 3e64a626
      Instead of repeating all the old headers for every new standard I've
      changed the docs to only list the new headers for each standard.
      
      	* doc/xml/manual/test.xml: Improve documentation on writing tests for
      	newer standards.
      	* doc/xml/manual/using.xml: Document all headers for C++11 and later.
      	* doc/html/*: Regenerate.
      
      From-SVN: r263163
      Jonathan Wakely committed
    • Replace safe bool idiom with explicit operator bool · 77a6c969
      	* include/ext/pointer.h [__cplusplus >= 201103L]
      	(_Pointer_adapter::operator bool): Add explicit conversion operator
      	to replace safe bool idiom.
      
      From-SVN: r263162
      Jonathan Wakely committed
    • [46/46] Turn stmt_vec_info back into a typedef · ddf98a96
      This patch removes the stmt_vec_info wrapper class added near the
      beginning of the series and turns stmt_vec_info back into a typedef.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (stmt_vec_info): Turn back into a typedef.
      	(NULL_STMT_VEC_INFO): Delete.
      	(stmt_vec_info::operator*): Likewise.
      	(stmt_vec_info::operator gimple *): Likewise.
      	* tree-vect-loop.c (vectorizable_reduction): Use NULL instead
      	of NULL_STMT_VEC_INFO.
      	* tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
      	(vect_reassociating_reduction_p): Likewise.
      	* tree-vect-stmts.c (vect_build_gather_load_calls): Likewise.
      	(vectorizable_store): Likewise.
      	* tree-vectorizer.c (vec_info::set_vinfo_for_stmt): Likewise.
      	(vec_info::free_stmt_vec_infos): Likewise.
      
      From-SVN: r263161
      Richard Sandiford committed
    • [45/46] Remove vect_stmt_in_region_p · dddecc5c
      Unlike the old vinfo_for_stmt, vec_info::lookup_stmt can cope with
      any statement, so there's no need to check beforehand that the statement
      is part of the vectorisable region.  This means that there are no longer
      any calls to vect_stmt_in_region_p.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vect_stmt_in_region_p): Delete.
      	* tree-vectorizer.c (vect_stmt_in_region_p): Likewise.
      
      From-SVN: r263160
      Richard Sandiford committed
    • [44/46] Remove global vinfo_for_stmt-related routines · 6ef709e5
      There are no more direct uses of:
      
      - new_stmt_vec_info
      - set_vinfo_for_stmt
      - free_stmt_vec_infos
      - free_stmt_vec_info
      
      outside of vec_info, so they can now be private member functions.
      It also seemed better to put them in tree-vectorizer.c, along with the
      other vec_info routines.
      
      We can also get rid of:
      
      - vinfo_for_stmt
      - stmt_vec_info_vec
      - set_stmt_vec_info_vec
      
      since nothing now uses them.  This was the main goal of the series.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::new_vinfo_for_stmt)
      	(vec_info::set_vinfo_for_stmt, vec_info::free_stmt_vec_infos)
      	(vec_info::free_stmt_vec_info): New private member functions.
      	(set_stmt_vec_info_vec, free_stmt_vec_infos, vinfo_for_stmt)
      	(set_vinfo_for_stmt, new_stmt_vec_info, free_stmt_vec_info): Delete.
      	* tree-parloops.c (gather_scalar_reductions): Remove calls to
      	set_stmt_vec_info_vec and free_stmt_vec_infos.
      	* tree-vect-loop.c (_loop_vec_info): Remove call to
      	set_stmt_vec_info_vec.
      	* tree-vect-stmts.c (new_stmt_vec_info, set_stmt_vec_info_vec)
      	(free_stmt_vec_infos, free_stmt_vec_info): Delete in favor of...
      	* tree-vectorizer.c (vec_info::new_stmt_vec_info)
      	(vec_info::set_vinfo_for_stmt, vec_info::free_stmt_vec_infos)
      	(vec_info::free_stmt_vec_info): ...these new functions.  Remove
      	assignments in {vec_info::,}new_stmt_vec_info that are redundant
      	with the clearing in the xcalloc.
      	(stmt_vec_info_vec): Delete.
      	(vec_info::vec_info): Don't call set_stmt_vec_info_vec.
      	(vectorize_loops): Likewise.
      	(vec_info::~vec_info): Remove argument from call to
      	free_stmt_vec_infos.
      	(vec_info::add_stmt): Remove vinfo argument from call to
      	new_stmt_vec_info.
      
      From-SVN: r263159
      Richard Sandiford committed
    • [43/46] Make free_stmt_vec_info take a stmt_vec_info · 458135c0
      This patch makes free_stmt_vec_info take the stmt_vec_info that
      it's supposed to free and makes it free only that stmt_vec_info.
      Callers need to update the statement mapping where necessary
      (but now there are only a couple of callers).
      
      This in turns means that we can leave ~vec_info to do the actual
      freeing, since there's no longer a need to do it before resetting
      the gimple_uids.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (free_stmt_vec_info): Take a stmt_vec_info
      	rather than a gimple stmt.
      	* tree-vect-stmts.c (free_stmt_vec_info): Likewise.  Don't free
      	information for pattern statements when passed the original
      	statement; instead wait to be passed the pattern statement itself.
      	Don't call set_vinfo_for_stmt here.
      	(free_stmt_vec_infos): Update call to free_stmt_vec_info.
      	* tree-vect-loop.c (_loop_vec_info::~loop_vec_info): Don't free
      	stmt_vec_infos here.
      	* tree-vect-slp.c (_bb_vec_info::~bb_vec_info): Likewise.
      	* tree-vectorizer.c (vec_info::remove_stmt): Nullify the statement's
      	stmt_vec_infos entry.
      
      From-SVN: r263158
      Richard Sandiford committed
    • [42/46] Add vec_info::replace_stmt · 9d97912b
      This patch adds a helper for replacing a stmt_vec_info's statement with
      a new statement.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::replace_stmt): Declare.
      	* tree-vectorizer.c (vec_info::replace_stmt): New function.
      	* tree-vect-slp.c (vect_remove_slp_scalar_calls): Use it.
      	* tree-vect-stmts.c (vectorizable_call): Likewise.
      	(vectorizable_simd_clone_call): Likewise.
      
      From-SVN: r263157
      Richard Sandiford committed
    • [41/46] Add vec_info::remove_stmt · b5b56c2a
      This patch adds a new helper function for permanently removing a
      statement and its associated stmt_vec_info.
      
      2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::remove_stmt): Declare.
      	* tree-vectorizer.c (vec_info::remove_stmt): New function.
      	* tree-vect-loop-manip.c (vect_set_loop_condition): Use it.
      	* tree-vect-loop.c (vect_transform_loop): Likewise.
      	* tree-vect-slp.c (vect_schedule_slp): Likewise.
      	* tree-vect-stmts.c (vect_remove_stores): Likewise.
      
      From-SVN: r263156
      Richard Sandiford committed
    • [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