1. 15 Nov, 2019 17 commits
    • re PR fortran/69654 (ICE in gfc_trans_structure_assign) · 8eea62d8
      2019-11-15  Paul Thomas  <pault@gcc.gnu.org>
      
      	PR fortran/69654
      	* trans-expr.c (gfc_trans_structure_assign): Move assignment to
      	'cm' after treatment of C pointer types and test that the type
      	has been completely built before it. Add an assert that the
      	backend_decl for each component exists.
      
      2019-11-15  Paul Thomas  <pault@gcc.gnu.org>
      
      	PR fortran/69654
      	* gfortran.dg/derived_init_6.f90: New test.
      
      From-SVN: r278287
      Paul Thomas committed
    • libstdc++: Fix changelog whitespace · 381835c8
      From-SVN: r278286
      Jonathan Wakely committed
    • [mid-end][__RTL] Set global epilogue_completed in skip_pass · 62396659
      Set global epilogue_completed when skipping pro_and_epilogue pass
      
      When compiling RTL functions marked to start at a pass after the reload
      pass, `skip_pass` is used to mark the reload pass as having completed
      since many patterns use the `reload_completed` variable to determine
      whether to run or not.
      
      Here we do the same for the `epilogue_completed` variable and the
      pro_and_epilogue pass.
      
      Also include a testcase that relies on the availability of a
      define_split in the aarch64 backend that is conditioned on this
      `epilogue_completed` variable.
      
      regtest done on native aarch64
      regtest done on native x64_86
      
      gcc/ChangeLog:
      
      2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
      
      	* passes.c (skip_pass): Set epilogue_completed if skipping the
      	pro_and_epilogue pass.
      
      gcc/testsuite/ChangeLog:
      
      2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
      
      	* gcc.dg/rtl/aarch64/test-epilogue-set.c: New test.
      
      From-SVN: r278285
      Matthew Malcomson committed
    • Add tests for print from offload target. · 8916ba87
      2019-11-15  Andrew Stubbs  <ams@codesourcery.com>
      
      	libgomp/
      	* testsuite/libgomp.c/target-print-1.c: New file.
      	* testsuite/libgomp.fortran/target-print-1.f90: New file.
      	* testsuite/libgomp.oacc-c/print-1.c: New file.
      	* testsuite/libgomp.oacc-fortran/print-1.f90: New file.
      
      From-SVN: r278284
      Andrew Stubbs committed
    • [mid-end][__RTL] Clean state despite invalid __RTL startwith passes · 3739bcc8
      
      Hi there,
      
      When compiling an __RTL function that has an invalid "startwith" pass we
      currently don't run the dfinish cleanup pass. This means we ICE on the next
      function.
      
      This change ensures that all state is cleaned up for the next function
      to run correctly.
      
      As an example, before this change the following code would ICE when compiling
      the function `foo2` because the "peephole2" pass is not run at optimisation
      level -O0.
      
      When compiled with
      ./aarch64-none-linux-gnu-gcc -O0 -S missed-pass-error.c -o test.s
      
      ```
      int __RTL (startwith ("peephole2")) badfoo ()
      {
      (function "badfoo"
        (insn-chain
          (block 2
            (edge-from entry (flags "FALLTHRU"))
            (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK)
            (cinsn 101 (set (reg:DI x19) (reg:DI x0)))
            (cinsn 10 (use (reg/i:SI x19)))
            (edge-to exit (flags "FALLTHRU"))
          ) ;; block 2
        ) ;; insn-chain
      ) ;; function "foo2"
      }
      
      int __RTL (startwith ("final")) foo2 ()
      {
      (function "foo2"
        (insn-chain
          (block 2
            (edge-from entry (flags "FALLTHRU"))
            (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK)
            (cinsn 101 (set (reg:DI x19) (reg:DI x0)))
            (cinsn 10 (use (reg/i:SI x19)))
            (edge-to exit (flags "FALLTHRU"))
          ) ;; block 2
        ) ;; insn-chain
      ) ;; function "foo2"
      }
      ```
      
      Now it silently ignores the __RTL function and successfully compiles foo2.
      
      regtest done on aarch64
      regtest done on x86_64
      
      OK for trunk?
      
      gcc/ChangeLog:
      
      2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
      
      	* passes.c (should_skip_pass_p): Always run "dfinish".
      
      gcc/testsuite/ChangeLog:
      
      2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
      
      	* gcc.dg/rtl/aarch64/missed-pass-error.c: New test.
      
      From-SVN: r278283
      Matthew Malcomson committed
    • ipa-inline.c (inline_small_functions): Move assignment to next before call destroying edge. · 2e98ac86
      2019-11-15  Richard Biener  <rguenther@suse.de>
      
      	* ipa-inline.c (inline_small_functions): Move assignment
      	to next before call destroying edge.
      
      From-SVN: r278282
      Richard Biener committed
    • re PR tree-optimization/92039 (Spurious -Warray-bounds warnings building 32-bit glibc) · f0af4848
      2019-11-15  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/92039
      	PR tree-optimization/91975
      	* tree-ssa-loop-ivcanon.c (constant_after_peeling): Revert
      	previous change, treat invariants consistently as non-constant.
      	(tree_estimate_loop_size): Ternary ops with just the first op
      	constant are not optimized away.
      
      	* gcc.dg/tree-ssa/cunroll-2.c: Revert to state previous to
      	unroller adjustment.
      	* g++.dg/tree-ssa/ivopts-3.C: Likewise.
      
      From-SVN: r278281
      Richard Biener committed
    • gimplify.c (gimplify_call_expr): Don't call omp_resolve_declare_variant after gimplification. · 0227ffa9
      	* gimplify.c (gimplify_call_expr): Don't call
      	omp_resolve_declare_variant after gimplification.
      	* omp-general.c (omp_context_selector_matches): For isa that might
      	match in some other function, defer if in declare simd function.
      	(omp_context_compute_score): Don't look for " score" in construct
      	trait set.  Set *score to -1 if it can't ever match.
      	(omp_resolve_declare_variant): If any variants need to be deferred,
      	don't punt immediately, but compute scores of all variants and if
      	ther eis a score winner that doesn't need to be deferred, return that.
      
      	* c-c++-common/gomp/declare-variant-13.c: New test.
      
      From-SVN: r278280
      Jakub Jelinek committed
    • re PR testsuite/92520 (new test case gcc/testsuite/gcc.dg/ipa/inline-9.c in r278220 is unresolved) · 1c9676e2
      	PR testsuite/92520
      	* gcc.dg/ipa/inline-9.c: Fix template.
      
      From-SVN: r278279
      Jan Hubicka committed
    • Fix comments typo · 53dd3bcc
      gcc/ChangeLog:
      
      	2019-11-15  Luo Xiong Hu  <luoxhu@linux.ibm.com>
      
      	* ipa-comdats.c: Fix comments typo.
      	* ipa-profile.c: Fix comments typo.
      	* tree-profile.c (gimple_gen_ic_profiler): Use the new variable
      	__gcov_indirect_call.counters and __gcov_indirect_call.callee.
      	(gimple_gen_ic_func_profiler): Likewise.
      	(pass_ipa_tree_profile::gate): Fix comments typo.
      
      From-SVN: r278278
      Luo Xiong Hu committed
    • Update iterator of next · 2aae99f7
      next is initialized only in the loop before, it is never updated
      in it's own loop.
      
      gcc/ChangeLog:
      
      	2019-11-15  Xiong Hu Luo  <luoxhu@linux.ibm.com>
      
      	* ipa-inline.c (inline_small_functions): Update iterator of next.
      
      From-SVN: r278277
      Xiong Hu Luo committed
    • compiler: fix buglet in function inlining related to sink names · f543bdd3
          
          When the compiler writes an inlinable function to the export data,
          parameter names are written out (in Export::write_name) using the
          Gogo::message_name as opposed to a raw/encoded name. This means that
          sink parameters (those named "_") get created with the name "_"
          instead of "._" (the name created by the lexer/parser). This confuses
          Gogo::is_sink_name, which looks for the latter sequence and not just
          "_". This can cause issues later on if an inlinable function is
          imported and fed through the rest of the compiler (things that are
          sinks are no recognized as such). To fix these issues, change
          Gogo::is_sink_name to return true for either variants ("_" or "._").
          
          Fixes golang/go#35586.
          
          Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/207259
      
      From-SVN: r278275
      Ian Lance Taylor committed
    • Support for jthread and stop_token · 942c4b32
              * include/Makefile.am: Add <stop_token> header.
              * include/Makefile.in: Regenerate.
              * include/std/condition_variable: Add overloads for stop_token support
              to condition_variable_any.
              * include/std/stop_token: New file.
              * include/std/thread: Add jthread type.
              * include/std/version (__cpp_lib_jthread): New value.
              * testsuite/30_threads/condition_variable_any/stop_token/1.cc: New test.
              * testsuite/30_threads/condition_variable_any/stop_token/2.cc: New test.
              * testsuite/30_threads/condition_variable_any/stop_token/wait_on.cc: New test.
              * testsuite/30_threads/jthread/1.cc: New test.
              * testsuite/30_threads/jthread/2.cc: New test.
              * testsuite/30_threads/jthread/jthread.cc: New test.
              * testsuite/30_threads/stop_token/1.cc: New test.
              * testsuite/30_threads/stop_token/2.cc: New test.
              * testsuite/30_threads/stop_token/stop_token.cc: New test.
      
      From-SVN: r278274
      Thomas Rodgers committed
    • Improve checks on C2x fallthrough attribute. · f8aea5e3
      When adding C2x attribute support, some [[fallthrough]] support
      appeared as a side-effect because of code for that attribute going
      through separate paths from the normal attribute handling.
      
      However, going through those paths without the normal attribute
      handlers meant that certain checks, such as for the invalid usage
      [[fallthrough()]], did not operate.  This patch improves checks by
      adding this attribute to the standard attribute table, so that the
      parser knows it expects no arguments, along with adding an explicit
      check for "[[fallthrough]];" attribute-declarations at top level.  As
      with other attributes, there are still cases where warnings should be
      pedwarns because C2x constraints are violated, but this patch improves
      the attribute handling.
      
      Bootstrapped with no regressions on x86_64-pc-linux-gnu.
      
      gcc/c:
      	* c-decl.c (std_attribute_table): Add fallthrough.
      	* c-parser.c (c_parser_declaration_or_fndef): Diagnose fallthrough
      	attribute at top level.
      
      gcc/c-family:
      	* c-attribs.c (handle_fallthrough_attribute): Remove static.
      	* c-common.h (handle_fallthrough_attribute): Declare.
      
      gcc/testsuite:
      	* gcc.dg/c2x-attr-fallthrough-2.c,
      	gcc.dg/c2x-attr-fallthrough-3.c: New tests.
      
      From-SVN: r278273
      Joseph Myers committed
    • Daily bump. · d3cb8f00
      From-SVN: r278272
      GCC Administrator committed
    • Implement the <array> part of C++20 p1032 Misc constexpr bits. · 1c09b664
      2019-11-14  Edward Smith-Rowland  <3dw4rd@verizon.net>
      
      	Implement the <array> part of C++20 p1032 Misc constexpr bits.
      	* include/std/array (fill, swap): Make constexpr.
      	* testsuite/23_containers/array/requirements/constexpr_fill.cc: New.
      	* testsuite/23_containers/array/requirements/constexpr_swap.cc: New.
      
      From-SVN: r278269
      Edward Smith-Rowland committed
    • Support C2x [[deprecated]] attribute. · 2cc94aa8
      This patch adds support for the C2x [[deprecated]] attribute.  All the
      actual logic for generating warnings can be identical to the GNU
      __attribute__ ((deprecated)), as can the attribute handler, so this is
      just a matter of wiring things up appropriately and adding the checks
      specified in the standard.  Unlike for C++, this patch gives
      "deprecated" an entry in a table of standard attributes rather than
      remapping it internally to the GNU attribute, as that seems a cleaner
      approach to me.
      
      Specifically, the only form of arguments to the attribute permitted in
      the standard is (string-literal); empty parentheses are not permitted
      in the case of no arguments, and a string literal (which includes
      concatenated adjacent string literals, because concatenation is an
      earlier phase of translation) cannot have further redundant
      parentheses around it.  For the case of empty parentheses, this patch
      makes the C parser disallow them for all known attributes using the
      [[]] syntax, as done for C++.  For string literals (where the C++
      front end is missing the check to avoid redundant parentheses, 92521
      filed for that issue), a special case is inserted in the C parser.
      
      A known issue that I think can be addressed later as a bug fix is that
      the warnings for the attribute being ignored in certain cases
      (attribute declarations, statements, most uses on types) ought to be
      pedwarns, as those usages are constraint violations.
      
      Bad handling of wide string literals with this attribute is also a
      pre-existing bug (91182 - although that's filed as a C++ bug, the code
      in question is language-independent, in tree.c).
      
      Bootstrapped with no regressions on x86_64-pc-linux-gnu.
      
      gcc/c:
      	* c-decl.c (std_attribute_table): New.
      	(c_init_decl_processing): Register attributes from
      	std_attribute_table.
      	* c-parser.c (c_parser_attribute_arguments): Add arguments
      	require_string and allow_empty_args.  All callers changed.
      	(c_parser_std_attribute): Set require_string argument for
      	"deprecated" attribute.
      
      gcc/c-family:
      	* c-attribs.c (handle_deprecated_attribute): Remove static.
      	* c-common.h (handle_deprecated_attribute): Declare.
      
      gcc/testsuite:
      	* gcc.dg/c2x-attr-deprecated-1.c, gcc.dg/c2x-attr-deprecated-2.c,
      	gcc.dg/c2x-attr-deprecated-3.c: New tests.
      
      From-SVN: r278268
      Joseph Myers committed
  2. 14 Nov, 2019 23 commits
    • Check suitability of spill register for mode · 1a4ec325
      2019-11-14  Kwok Cheung Yeung  <kcy@codesourcery.com>
      
      	gcc/
      	* lra-spills.c (assign_spill_hard_regs): Check that the spill
      	register is suitable for the mode.
      
      From-SVN: r278267
      Kwok Cheung Yeung committed
    • Change fold_range to return a boolean result. · f674b4a7
      2019-11-14  Andrew MacLeod  <amacleod@redhat.com>
      
      	* range-op.h (range_operator::fold_range): Return a bool.
      	* range-op.cc (range_operator::wi_fold): Assert supported type.
      	(range_operator::fold_range): Assert supported type and return true.
      	(operator_equal::fold_range): Return true.
      	(operator_not_equal::fold_range): Same.
      	(operator_lt::fold_range): Same.
      	(operator_le::fold_range): Same.
      	(operator_gt::fold_range): Same.
      	(operator_ge::fold_range): Same.
      	(operator_plus::op1_range): Adjust call to fold_range.
      	(operator_plus::op2_range): Same.
      	(operator_minus::op1_range): Same.
      	(operator_minus::op2_range): Same.
      	(operator_exact_divide::op1_range): Same.
      	(operator_lshift::fold_range): Return true and adjust fold_range call.
      	(operator_rshift::fold_range): Same.
      	(operator_cast::fold_range): Return true.
      	(operator_logical_and::fold_range): Same.
      	(operator_logical_or::fold_range): Same.
      	(operator_logical_not::fold_range): Same.
      	(operator_bitwise_not::fold_range): Adjust call to fold_range.
      	(operator_bitwise_not::op1_range): Same.
      	(operator_cst::fold_range): Return true.
      	(operator_identity::fold_range): Return true.
      	(operator_negate::fold_range): Return true and adjust fold_range call.
      	(operator_addr_expr::fold_range): Return true.
      	(operator_addr_expr::op1_range): Adjust call to fold_range.
      	(range_cast): Same.
      	* tree-vrp.c (range_fold_binary_symbolics_p): Adjust call to fold_range.
      	(range_fold_unary_symbolics_p): Same.
      
      From-SVN: r278266
      Andrew MacLeod committed
    • Support UTF-8 character constants for C2x. · 7c5890cc
      C2x adds u8'' character constants to C.  This patch adds the
      corresponding GCC support.
      
      Most of the support was already present for C++ and just needed
      enabling for C2x.  However, in C2x these constants have type unsigned
      char, which required corresponding adjustments in the compiler and the
      preprocessor to give them that type for C.
      
      For C, it seems clear to me that having type unsigned char means the
      constants are unsigned in the preprocessor (and thus treated as having
      type uintmax_t in #if conditionals), so this patch implements that.  I
      included a conditional in the libcpp change to avoid affecting
      signedness for C++, but I'm not sure if in fact these constants should
      also be unsigned in the preprocessor for C++ in which case that
      !CPP_OPTION (pfile, cplusplus) conditional would not be needed.
      
      Bootstrapped with no regressions on x86_64-pc-linux-gnu.
      
      gcc/c:
      	* c-parser.c (c_parser_postfix_expression)
      	(c_parser_check_literal_zero): Handle CPP_UTF8CHAR.
      	* gimple-parser.c (c_parser_gimple_postfix_expression): Likewise.
      
      gcc/c-family:
      	* c-lex.c (lex_charconst): Make CPP_UTF8CHAR constants unsigned
      	char for C.
      
      gcc/testsuite:
      	* gcc.dg/c11-utf8char-1.c, gcc.dg/c2x-utf8char-1.c,
      	gcc.dg/c2x-utf8char-2.c, gcc.dg/c2x-utf8char-3.c,
      	gcc.dg/gnu2x-utf8char-1.c: New tests.
      
      libcpp:
      	* charset.c (narrow_str_to_charconst): Make CPP_UTF8CHAR constants
      	unsigned for C.
      	* init.c (lang_defaults): Set utf8_char_literals for GNUC2X and
      	STDC2X.
      
      From-SVN: r278265
      Joseph Myers committed
    • Tweak gcc.dg/vect/bb-slp-4[01].c (PR92366) · 37710332
      gcc.dg/vect/bb-slp-40.c was failing on some targets because the
      explicit dg-options overrode things like -maltivec.  This patch
      uses dg-additional-options instead.
      
      Also, it seems safer not to require exactly 1 instance of each message,
      since that depends on the target vector length.
      
      gcc.dg/vect/bb-slp-41.c contained invariant constructors that are
      vectorised on AArch64 (foo) and constructors that aren't (bar).
      This meant that the number of times we print "Found vectorizable
      constructor" depended on how many vector sizes we try, since we'd
      print it for each failed attempt.
      
      In foo, we create invariant { b[0], ... } and { b[1], ... },
      and the test is making sure that the two separate invariant vectors
      can be fed from the same vector load at b.  This is a different case
      from bb-slp-40.c, where the constructors are naturally separate.
      (The expected count is 4 rather than 2 because we can vectorise the
      epilogue too.)
      
      However, due to limitations in the loop vectoriser, we still do the
      addition of { b[0], ... } and { b[1], ... } in the loop.  Hopefully
      that'll be fixed at some point, so this patch adds an alternative test
      that directly needs 4 separate invariant constructors.  E.g. with Joel's
      SLP optimisation, the new test generates:
      
              ldr     q4, [x1]
              dup     v7.4s, v4.s[0]
              dup     v6.4s, v4.s[1]
              dup     v5.4s, v4.s[2]
              dup     v4.4s, v4.s[3]
      
      instead of the somewhat bizarre:
      
              ldp     s6, s5, [x1, 4]
              ldr     s4, [x1, 12]
              ld1r    {v7.4s}, [x1]
              dup     v6.4s, v6.s[0]
              dup     v5.4s, v5.s[0]
              dup     v4.4s, v4.s[0]
      
      The patch then disables vectorisation of the original foo in
      bb-vect-slp-41.c, so that we get the same correctness testing
      for bar but don't need to test for specific counts.
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/testsuite/
      	PR testsuite/92366
      	* gcc.dg/vect/bb-slp-40.c: Use dg-additional-options instead
      	of dg-options.  Remove expected counts.
      	* gcc.dg/vect/bb-slp-41.c: Remove dg-options and explicit
      	dg-do run.  Suppress vectorization of foo.
      	* gcc.dg/vect/bb-slp-42.c: New test.
      
      From-SVN: r278262
      Richard Sandiford committed
    • re PR tree-optimization/92506 (Wrong code with -fwrapv since r277979) · bbc85eb9
      2019-11-14  Andrew MacLeod  <amacleod@redhat.com>
      
      	PR tree-optimization/92506
      	* range-op.cc (range_operator::fold_range): Start with range undefined.
      	(operator_abs::wi_fold): Fix wrong line copy... With wrapv, abs with
      	overflow is varying.
      
      From-SVN: r278259
      Andrew MacLeod committed
    • Remove range_intersect, range_invert, and range_union. · fae08a05
      From-SVN: r278258
      Aldy Hernandez committed
    • libstdc++: Implement new predicate concepts from P1716R3 · 270082a7
      	* include/bits/iterator_concepts.h (__iter_concept_impl): Add
      	comments.
      	(indirect_relation): Rename to indirect_binary_predicate and adjust
      	definition as per P1716R3.
      	(indirect_equivalence_relation): Define.
      	(indirectly_comparable): Adjust definition.
      	* include/std/concepts (equivalence_relation): Define.
      	* testsuite/std/concepts/concepts.callable/relation.cc: Add tests for
      	equivalence_relation.
      
      From-SVN: r278256
      Jonathan Wakely committed
    • libstdc++: Rename disable_sized_sentinel [P1871R1] · d99828ee
      	* include/bits/iterator_concepts.h (disable_sized_sentinel): Rename to
      	disable_sized_sentinel_for.
      	* testsuite/24_iterators/headers/iterator/synopsis_c++20.cc: Adjust.
      
      From-SVN: r278255
      Jonathan Wakely committed
    • Make flag_thread_jumps a gate of pass_jump_after_combine · d19df8b2
      This is a follow-up to
      https://gcc.gnu.org/ml/gcc-patches/2019-11/msg00919.html (r278095).
      Dominance info is deleted even if we don't perform jump threading.
      Since the whole point of this pass is to perform jump threading (other
      cleanups are not valuable at this point), skip it completely when
      flag_thread_jumps is not set.
      
      gcc/ChangeLog:
      
      2019-11-14  Ilya Leoshkevich  <iii@linux.ibm.com>
      
      	PR rtl-optimization/92430
      	* cfgcleanup.c (pass_jump_after_combine::gate): New function.
      	(pass_jump_after_combine::execute): Perform jump threading
      	unconditionally.
      
      From-SVN: r278254
      Ilya Leoshkevich committed
    • Update the arm-*-vxworks* support · 27204060
      2019-11-13  Jerome Lambourg  <lambourg@adacore.com>
                  Doug Rupp <rupp@adacore.com>
                  Olivier Hainque  <hainque@adacore.com>
      
      	gcc/
      	* config.gcc: Collapse the arm-vxworks entries into
      	a single arm-wrs-vxworks7* one, bpabi based.  Update
      	the default cpu from arm8 to armv7-a
      	* config/arm/vxworks.h (CC1_SPEC): Simplify, knowing that
      	we always use ARM_UNWIND_INFO.
      	(DWARF2_UNWIND_INFO): Remove redefinition.
      	(ARM_TARGET2_DWARF_FORMAT): Likewise.
      	(VXWORKS_PERSONALITY): Define, to "llvm".
      	(VXWORKS_EXTRA_LIBS_RTP): Define, to "-lllvm".
      
      	libgcc/
      	* config.host: Collapse the arm-vxworks entries into
      	a single arm-wrs-vxworks7* one.
      	* config/arm/unwind-arm-vxworks.c: Update comments.  Provide
      	__gnu_Unwind_Find_exidx and a weak dummy __cxa_type_match for
      	kernel modules, to be overriden by libstdc++ when we link with
      	it.  Rely on externally provided __exidx_start/end.
      
      Co-Authored-By: Doug Rupp <rupp@adacore.com>
      Co-Authored-By: Olivier Hainque <hainque@adacore.com>
      
      From-SVN: r278253
      Jerome Lambourg committed
    • Housekeeping on TARGET_OS_CPP_BUILTINS for arm-vxworks · 071ef254
      2019-11-14  Jerome Lambourg  <lambourg@adacore.com>
      
              * config/arm/vxworks.h (TARGET_OS_CPP_BUILTINS): Use
              _VX_CPU instead of CPU and handle arm_arch8.
      
      From-SVN: r278252
      Jerome Lambourg committed
    • Base support for vxworks 7 on aarch64 · 3004f893
      2019-11-14  Doug Rupp  <rupp@adacore.com>
                 Olivier Hainque  <hainque@adacore.com>
                 Jerome Lambourg  <lambourg@adacore.com>
      
             gcc/
             * config.gcc: Handle aarch64*-wrs-vxworks7*.
             * config/aarch64/aarch64-vxworks.h: New file.
             * config/aarch64/t-aarch64-vxworks: New file.
      
             libgcc/
             * config.host: Handle aarch64*-wrs-vxworks7*.
      
      Co-Authored-By: Jerome Lambourg <lambourg@adacore.com>
      Co-Authored-By: Olivier Hainque <hainque@adacore.com>
      
      From-SVN: r278251
      Doug Rupp committed
    • Update the libgcc support for VxWorks AE/653 · 36e5f4d4
      2019-11-12  Olivier Hainque  <hainque@adacore.com>
      
      	libgcc/
      
              * config/t-gthr-vxworksae: New file, add all the gthr-vxworks
              sources except the cxx0x support to LIB2ADDEH.  We don't support
              cxx0x on AE/653.
              * config/t-vxworksae: New file.
      
              * config.host: Handle *-*-vxworksae: Add the two aforementioned
      	Makefile fragment files at their expected position in the tmake_file
      	list, in accordance with what is done for other VxWorks variants.
      
      From-SVN: r278250
      Olivier Hainque committed
    • Improve the thread support for VxWorks · 806dd047
      2019-11-12  Corentin Gay  <gay@adacore.com>
      	    Jerome Lambourg  <lambourg@adacore.com>
      	    Olivier Hainque  <hainque@adacore.com>
      
      	libgcc/
      
      	* config/t-gthr-vxworks: New file, add all the gthr-vxworks
      	sources to LIB2ADDEH.
      	* config/t-vxworks: Remove adjustments to LIB2ADDEH.
      	* config/t-vxworks7: Likewise.
      
      	* config.host: Append a block at the end of the file to add the
      	t-gthr files to the tmake_file list for VxWorks after everything
      	else.
      
      	* config/vxlib.c: Rename as gthr-vxworks.c.
      	* config/vxlib-tls.c: Rename as gthr-vxworks-tls.c.
      
      	* config/gthr-vxworks.h: Simplify a few comments.  Expose a TAS
      	API and a basic error checking API, both internal.  Simplify the
      	__gthread_once_t type definition and initializers.  Add sections
      	for condition variables support and for the C++0x thread support,
      	conditioned against Vx653 for the latter.
      
      	* config/gthr-vxworks.c (__gthread_once): Simplify comments and
      	implementation, leveraging the TAS internal API.
      	* config/gthr-vxworks-tls.c: Introduce an internal TLS data access
      	API, leveraging the general availability of TLS services in VxWorks7
      	post SR6xxx.
      	(__gthread_setspecific, __gthread_setspecific): Use it.
      	(tls_delete_hook): Likewise, and simplify the enter/leave dtor logic.
      	* config/gthr-vxworks-cond.c: New file.  GTHREAD_COND variable
      	support based on VxWorks primitives.
      	* config/gthr-vxworks-thread.c: New file.  GTHREAD_CXX0X support
      	based on VxWorks primitives.
      
      Co-Authored-By: Jerome Lambourg <lambourg@adacore.com>
      Co-Authored-By: Olivier Hainque <hainque@adacore.com>
      
      From-SVN: r278249
      Corentin Gay committed
    • Introduce vxworks specific crtstuff support · 78e49fb1
      2019-11-06  Jerome Lambourg  <lambourg@adacore.com>
                  Olivier Hainque  <hainque@adacore.com>
      
      	libgcc/
      	* config/vxcrtstuff.c: New file.
      	* config/t-vxcrtstuff: New Makefile fragment.
      	* config.host: Append t-vxcrtstuff to the tmake_file list
      	on all VxWorks ports using dwarf for table based EH.
      
      	gcc/
      	* config/vx-common.h (USE_TM_CLONE_REGISTRY): Remove
      	definition, pointless with a VxWorks specific version
      	of crtstuff.
      	(DWARF2_UNWIND_INFO): Conditionalize on !ARM_UNWIND_INFO.
      	* config/vxworks.h (VX_CRTBEGIN_SPEC, VX_CRTEND_SPEC):
      	New local macros, controlling the addition of vxworks specific
      	crtstuff objects depending on the EH mechanism and kind of
      	module being linked.
      	(VXWORKS_STARTFILE_SPEC, VXWORKS_ENDFILE_SPEC): Use them.
      
      Co-Authored-By: Olivier Hainque <hainque@adacore.com>
      
      From-SVN: r278248
      Jerome Lambourg committed
    • Common ground work for vxworks7 ports updates · ebcdba9c
      2019-11-06  Pat Bernardi  <bernardi@adacore.com>
                  Jerome Lambourg  <lambourg@adacore.com>
                  Olivier Hainque  <hainque@adacore.com>
      
      	gcc/
      	* config.gcc: Add comment to introduce the TARGET_VXWORKS
      	commong macro definitions, conveying VXWORKS7 or 64bit general
      	variations.  Add a block to set gcc_cv_initfini_array
      	unconditionally to "yes" for VxWorks7.
      	config/vx-common.h (VXWORKS_CC1_SPEC): New macro, empty string
      	by default.  Update some comments.
      	config/vxworks.h (VXWORKS_EXTRA_LIBS_RTP): New macro, empty by
      	default, to be added the end of VXWORKS_LIBS_RTP.
      	(VXWORKS_LIBS_RTP): Replace hardcoded part by VXWORKS_BASE_LIBS_RTP
      	and append VXWORKS_EXTRA_LIBS_RTP, both of which specific ports may
      	redefine.
      	(VXWORKS_NET_LIBS_RTP): Account for VxWorks7 specificities.
      	(VXWORKS_CC1_SPEC): Common base definition, with VxWorks7 variation
      	to account for the now available TLS abilities.
      	(TARGET_LIBC_HAS_FUNCTION): Account for VxWorks7 abilities.
      	(VXWORKS_HAVE_TLS): Likewise.
      
      Co-Authored-By: Jerome Lambourg <lambourg@adacore.com>
      Co-Authored-By: Olivier Hainque <hainque@adacore.com>
      
      From-SVN: r278247
      Pat Bernardi committed
    • Consider building nodes from scalars in vect_slp_analyze_node_operations · 60838d63
      If the statements in an SLP node aren't similar enough to be vectorised,
      or aren't something the vectoriser has code to handle, the BB vectoriser
      tries building the vector from scalars instead.  This patch does the
      same thing if we're able to build a viable-looking tree but fail later
      during the analysis phase, e.g. because the target doesn't support a
      particular vector operation.
      
      This is needed to avoid regressions with a later patch.
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-slp.c (vect_contains_pattern_stmt_p): New function.
      	(vect_slp_convert_to_external): Likewise.
      	(vect_slp_analyze_node_operations): If analysis fails, try building
      	the node from scalars instead.
      
      gcc/testsuite/
      	* gcc.dg/vect/bb-slp-div-2.c: New test.
      
      From-SVN: r278246
      Richard Sandiford committed
    • Vectorise conversions between differently-sized integer vectors · 9c437a10
      This patch adds AArch64 patterns for converting between 64-bit and
      128-bit integer vectors, and makes the vectoriser and expand pass
      use them.
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-cfg.c (verify_gimple_assign_unary): Handle conversions
      	between vector types.
      	* tree-vect-stmts.c (vectorizable_conversion): Extend the
      	non-widening and non-narrowing path to handle standard
      	conversion codes, if the target supports them.
      	* expr.c (convert_move): Try using the extend and truncate optabs
      	for vectors.
      	* optabs-tree.c (supportable_convert_operation): Likewise.
      	* config/aarch64/iterators.md (Vnarroqw): New iterator.
      	* config/aarch64/aarch64-simd.md (<optab><Vnarrowq><mode>2)
      	(trunc<mode><Vnarrowq>2): New patterns.
      
      gcc/testsuite/
      	* gcc.dg/vect/bb-slp-pr69907.c: Do not expect BB vectorization
      	to fail for aarch64 targets.
      	* gcc.dg/vect/no-scevccp-outer-12.c: Expect the test to pass
      	on aarch64 targets.
      	* gcc.dg/vect/vect-double-reduc-5.c: Likewise.
      	* gcc.dg/vect/vect-outer-4e.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_5.c: New test.
      	* gcc.target/aarch64/vect_mixed_sizes_6.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_7.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_8.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_9.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_10.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_11.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_12.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_13.c: Likewise.
      
      From-SVN: r278245
      Richard Sandiford committed
    • Allow mixed vector sizes within a single vectorised stmt · 05101d1b
      Although a previous patch allowed mixed vector sizes within a vector
      region, we generally still required equal vector sizes within a vector
      stmt.  Specifically, vect_get_vector_types_for_stmt computes two vector
      types: the vector type corresponding to STMT_VINFO_VECTYPE and the
      vector type that determines the minimum vectorisation factor for the
      stmt ("nunits_vectype").  It then required these two types to be
      the same size.
      
      There doesn't seem to be any need for that restriction though.  AFAICT,
      all vectorizable_* functions either do their own compatibility checks
      or don't need to do them (because gimple guarantees that the scalar
      types are compatible).
      
      It should always be the case that nunits_vectype has at least as many
      elements as the other vectype, but that's something we can assert for.
      
      I couldn't resist a couple of other tweaks while there:
      
      - there's no need to compute nunits_vectype if its element type is
        the same as STMT_VINFO_VECTYPE's.
      
      - it's useful to distinguish the nunits_vectype from the main vectype
        in dump messages
      
      - when reusing the existing STMT_VINFO_VECTYPE, it's useful to say so
        in the dump, and say what the type is
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-stmts.c (vect_get_vector_types_for_stmt): Don't
      	require vectype and nunits_vectype to have the same size;
      	instead assert that nunits_vectype has at least as many
      	elements as vectype.  Don't compute a separate nunits_vectype
      	if the scalar type is obviously the same as vectype's.
      	Tweak dump messages.
      
      From-SVN: r278244
      Richard Sandiford committed
    • [AArch64] Support vectorising with multiple vector sizes · 74166aab
      This patch makes the vectoriser try mixtures of 64-bit and 128-bit
      vector modes on AArch64.  It fixes some existing XFAILs and allows
      kernel 24 from the Livermore Loops test to be vectorised (by using
      a mixture of V2DF and V2SI).
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_vectorize_related_mode): New
      	function.
      	(aarch64_autovectorize_vector_modes): Also add V4HImode and V2SImode.
      	(TARGET_VECTORIZE_RELATED_MODE): Define.
      
      gcc/testsuite/
      	* gcc.dg/vect/vect-outer-4f.c: Expect the test to pass on aarch64
      	targets.
      	* gcc.dg/vect/vect-outer-4g.c: Likewise.
      	* gcc.dg/vect/vect-outer-4k.c: Likewise.
      	* gcc.dg/vect/vect-outer-4l.c: Likewise.
      	* gfortran.dg/vect/vect-8.f90: Expect kernel 24 to be vectorized
      	for aarch64.
      	* gcc.target/aarch64/vect_mixed_sizes_1.c: New test.
      	* gcc.target/aarch64/vect_mixed_sizes_2.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_3.c: Likewise.
      	* gcc.target/aarch64/vect_mixed_sizes_4.c: Likewise.
      
      From-SVN: r278243
      Richard Sandiford committed
    • Avoid retrying with the same vector modes · a55d8232
      A later patch makes the AArch64 port add four entries to
      autovectorize_vector_modes.  Each entry describes a different
      vector mode assignment for vector code that mixes 8-bit, 16-bit,
      32-bit and 64-bit elements.  But if (as usual) the vector code has
      fewer element sizes than that, we could end up trying the same
      combination of vector modes multiple times.  This patch adds a
      check to prevent that.
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vec_info::mode_set): New typedef.
      	(vec_info::used_vector_mode): New member variable.
      	(vect_chooses_same_modes_p): Declare.
      	* tree-vect-stmts.c (get_vectype_for_scalar_type): Record each
      	chosen vector mode in vec_info::used_vector_mode.
      	(vect_chooses_same_modes_p): New function.
      	* tree-vect-loop.c (vect_analyze_loop): Use it to avoid trying
      	the same vector statements multiple times.
      	* tree-vect-slp.c (vect_slp_bb_region): Likewise.
      
      From-SVN: r278242
      Richard Sandiford committed
    • Support vectorisation with mixed vector sizes · df7c2283
      After previous patches, it's now possible to make the vectoriser
      support multiple vector sizes in the same vector region, using
      related_vector_mode to pick the right vector mode for a given
      element mode.  No port yet takes advantage of this, but I have
      a follow-on patch for AArch64.
      
      This patch also seemed like a good opportunity to add some more dump
      messages: one to make it clear which vector size/mode was being used
      when analysis passed or failed, and another to say when we've decided
      to skip a redundant vector size/mode.
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* machmode.h (opt_machine_mode::operator==): New function.
      	(opt_machine_mode::operator!=): Likewise.
      	* tree-vectorizer.h (vec_info::vector_mode): Update comment.
      	(get_related_vectype_for_scalar_type): Delete.
      	(get_vectype_for_scalar_type_and_size): Declare.
      	* tree-vect-slp.c (vect_slp_bb_region): Print dump messages to say
      	whether analysis passed or failed, and with what vector modes.
      	Use related_vector_mode to check whether trying a particular
      	vector mode would be redundant with the autodetected mode,
      	and print a dump message if we decide to skip it.
      	* tree-vect-loop.c (vect_analyze_loop): Likewise.
      	(vect_create_epilog_for_reduction): Use
      	get_related_vectype_for_scalar_type instead of
      	get_vectype_for_scalar_type_and_size.
      	* tree-vect-stmts.c (get_vectype_for_scalar_type_and_size): Replace
      	with...
      	(get_related_vectype_for_scalar_type): ...this new function.
      	Take a starting/"prevailing" vector mode rather than a vector size.
      	Take an optional nunits argument, with the same meaning as for
      	related_vector_mode.  Use related_vector_mode when not
      	auto-detecting a mode, falling back to mode_for_vector if no
      	target mode exists.
      	(get_vectype_for_scalar_type): Update accordingly.
      	(get_same_sized_vectype): Likewise.
      	* tree-vectorizer.c (get_vec_alignment_for_array_type): Likewise.
      
      From-SVN: r278240
      Richard Sandiford committed
    • Require equal type sizes for vectorised calls · 7f52eb89
      As explained in the comment, vectorizable_call needs more work to
      support mixtures of sizes.  This avoids testsuite fallout for
      later SVE patches.
      
      2019-11-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vect-stmts.c (vectorizable_call): Require the types
      	to have the same size.
      
      From-SVN: r278239
      Richard Sandiford committed