1. 24 Apr, 2020 16 commits
    • d: Fix order of precedence for -defaultlib and -debuglib · 0b471895
      The order of precedence used by the upstream reference compiler for
      determining what library to link against is:
      - No library if -nophoboslib or -fno-druntime was seen.
      - The library passed to -debuglib if -g was also seen.
      - The library passed to -defaultlib
      - The in-tree libgphobos library.
      
      This aligns the D language driver to follow the same rules.
      
      gcc/d/ChangeLog:
      
      	* d-spec.cc (need_phobos): Remove.
      	(lang_specific_driver): Replace need_phobos with phobos_library.
      	Reorder -debuglib and -defaultlib to have precedence over libphobos.
      	(lang_specific_pre_link): Remove test for need_phobos.
      Iain Buclaw committed
    • amdgcn: Fix wrong-code bug in 64-bit masked add · 28b733ea
      2020-04-24  Andrew Stubbs  <ams@codesourcery.com>
      
      	gcc/
      	* config/gcn/gcn-valu.md (add<mode>_zext_dup2_exec): Fix merge
      	of high-part.
      	(add<mode>_sext_dup2_exec): Likewise.
      Andrew Stubbs committed
    • rs6000: Properly handle LE index munging in vec_shr (PR94710) · 9c725245
      The PR shows the compiler crashing with -mvsx -mlittle -O0.  This turns
      out to be caused by a failure to make of the higher bits in an index
      endian conversion.
      
      2020-04-24  Segher Boessenkool  <segher@kernel.crashing.org>
      
      	PR target/94710
      	* config/rs6000/vector.md (vec_shr_<mode> for VEC_L): Correct little
      	endian byteshift_val calculation.
      Segher Boessenkool committed
    • testsuite: C++14 vs. C++17 struct-layout-1.exp testing with ALT_CXX_UNDER_TEST [PR94383] · 9407f0c3
      > I haven't added (yet) checks if the alternate compiler does support these
      > options (I think that can be done incrementally), so for now this testing is
      > done only if the alternate compiler is not used.
      
      This patch does that, so now when testing against not too old compiler
      it can do the -std=c++14 vs. -std=c++17 testing also between under test and
      alt compilers.
      
      2020-04-24  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/94383
      	* g++.dg/compat/struct-layout-1.exp: Use the -std=c++14 vs. -std=c++17
      	ABI compatibility testing even with ALT_CXX_UNDER_TEST, as long as
      	that compiler accepts -std=c++14 and -std=c++17 options.
      Jakub Jelinek committed
    • amdgcn: Split 64-bit constant loads post-reload · 01f5d5e8
      This helps avoid spilling 64-bit constant loads to stack by simplifying the
      code that LRA sees.
      
      2020-04-24  Andrew Stubbs  <ams@codesourcery.com>
      
      	gcc/
      	* config/gcn/gcn.md (*mov<mode>_insn): Only split post-reload.
      Andrew Stubbs committed
    • amdgcn: Testsuite tweaks · cf3a909c
      The vector size chosen here is for V64DImode. The concept of this setting is
      not well adapted for GCN, in which the vector size varies with the number of
      lanes, not the other way around, but this is ok for now.
      
      2020-04-24  Andrew Stubbs  <ams@codesourcery.com>
      
      	gcc/testsuite/
      	* lib/target-supports.exp (available_vector_sizes): Add amdgcn.
      	(check_effective_target_vect_cmdline_needed): Disable for amdgcn.
      	(check_effective_target_vect_pack_trunc): Add amdgcn.
      Andrew Stubbs committed
    • libstdc++: Make net::service_already_exists default constructible · 00082ff8
      The LWG issue I created is Tentatively Ready and proposes to declare a
      public default constructor, rather than the private one I added
      recently.
      
      	* include/experimental/executor (service_already_exists): Make default
      	constructor public (LWG 3414).
      	* testsuite/experimental/net/execution_context/make_service.cc: Check
      	the service_already_exists can be default constructed.
      Jonathan Wakely committed
    • coroutines, testsuite: Add test for fixed pr [PR94288] · 1d072f3e
      This is a version of the reproducer in the PR, usable on
      multiple platforms.
      Iain Sandoe committed
    • introduce target fileio and require it in tests that use tmpnam · 3685c5ad
      Some target C libraries that aren't recognized as freestanding don't
      have filesystem support, so calling tmpnam, fopen/open and
      remove/unlink fails to link.
      
      This patch introduces a fileio effective target to the testsuite, and
      requires it in the tests that call tmpnam.
      
      
      for  gcc/testsuite/ChangeLog
      
      	* lib/target-supports.exp (check_effective_target_fileio): New.
      	* gcc.c-torture/execute/fprintf-2.c: Require it.
      	* gcc.c-torture/execute/printf-2.c: Likewise.
      	* gcc.c-torture/execute/user-printf.c: Likewise.
      Alexandre Oliva committed
    • aarch64: Add an extra comment to arm_sve.h · c508fd07
      I've had a couple of conversations now in which the shortness
      of arm_sve.h was causing confusion, with people thinking that
      the types and intrinsics were missing.  It seems worth adding
      a comment to explain what's going on.
      
      2020-04-24  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/arm_sve.h: Add a comment.
      Richard Sandiford committed
    • rtl combine should consider NaNs when generate fp min/max [PR94708] · cbd2a10d
          As discussed on PR94708, it's unsafe for rtl combine to generate fp
          min/max under -funsafe-math-optimizations, considering NaNs. In
          addition to flag_unsafe_math_optimizations check, we also need to
          do extra mode feature testing here: && !HONOR_NANS (mode)
          && !HONOR_SIGNED_ZEROS (mode)
      
          2020-04-24  Haijian Zhang <z.zhanghaijian@huawei.com>
      
          gcc/
      	PR rtl-optimization/94708
      	* combine.c (simplify_if_then_else): Add check for
      	!HONOR_NANS (mode) && !HONOR_SIGNED_ZEROS (mode).
          gcc/testsuite/
      	PR fortran/94708
      	* gfortran.dg/pr94708.f90: New test.
      Haijian Zhang committed
    • Remove CHECKING_P in coroutines.cc for release checking. · 6f6c7992
      	* coroutines.cc: Fix compilation error for release checking
      	where we miss declaration of ‘coro_body_contains_bind_expr_p’.
      Martin Liska committed
    • gotest: increase the test timeout · ef8dc9d2
      The default test timeout duration of the gc compiler is 10 minutes,
      and the current default timeout duration of gofrontend is 240 seconds,
      which is not long enough for some big tests. This CL changes it to
      600s, so that all tests have enough time to complete.
      
      Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/229657
      eric fang committed
    • testsuite: Skip 90020.c on AIX. · 4da02559
      Like HP/UX, AIX does not support undefined weak, so skip this test
      in the testsuite.
      
      	* gcc.dg/torture/pr90020.c: Skip on AIX..
      David Edelsohn committed
    • testsuite: Require LTO support for pr94426-1.C · 3b9e4bc9
      The testcase uses the -flto option but does not ensure that LTO support
      is enabled. This patch adds the test to the testcase.
      
              * g++.dg/cpp0x/lambda/pr94426-1.C: Require LTO.
      David Edelsohn committed
    • Daily bump. · cd5dc922
      GCC Administrator committed
  2. 23 Apr, 2020 24 commits
    • libstdc++: Fix constructor constraints for std::any (PR 90415) · d1462b07
      This removes a non-standard extension to std::any which causes errors
      for valid code, due to recursive instantiation of a trait that isn't
      supposed to be in the constraints.
      
      It also removes some incorrect constraints on the in_place_type<T>
      constructors and emplace members, which were preventing creating a
      std::any object with another std::any as the contained value.
      
      2020-04-24  Kamlesh Kumar  <kamleshbhalui@gmail.com>
      	    Jonathan Wakely  <jwakely@redhat.com>
      
      	PR libstdc++/90415
      	PR libstdc++/92156
      	* include/std/any (any): Rename template parameters for consistency
      	with the standard.
      	(any::_Decay): Rename to _Decay_if_not_any.
      	(any::any(T&&):: Remove is_constructible from constraints. Remove
      	non-standard overload.
      	(any::any(in_place_type_t<T>, Args&&...))
      	(any::any(in_place_type_t<T>, initializer_list<U>, Args&&...))
      	(any::emplace(Args&&...))
      	(any::emplace(initializer_list<U>, Args&&...)):
      	Use decay_t instead of _Decay.
      	* testsuite/20_util/any/cons/90415.cc: New test.
      	* testsuite/20_util/any/cons/92156.cc: New Test.
      	* testsuite/20_util/any/misc/any_cast_neg.cc: Make dg-error directives
      	more robust.
      	* testsuite/20_util/any/modifiers/92156.cc: New test.
      Jonathan Wakely committed
    • PR driver/90983 - manual documents `-Wno-stack-usage` flag but it is unrecognized · ae962e57
      gcc/ChangeLog:
      
      	PR driver/90983
      	* common.opt (-Wno-frame-larger-than): New option.
      	(-Wno-larger-than, -Wno-stack-usage): Same.
      
      gcc/testsuite/ChangeLog:
      
      	PR driver/90983
      	* gcc.dg/Wframe-larger-than-3.c: New test.
      	* gcc.dg/Wlarger-than4.c: New test.
      	* gcc.dg/Wstack-usage.c: New test.
      Martin Sebor committed
    • c++: zero_init_expr_p of dependent expression · 9a453da5
      This fixes an ICE coming from mangle.c:write_expression when building the
      testsuite of range-v3; the added testcase is a reduced reproducer for the ICE.
      
      gcc/cp/ChangeLog:
      
      	* tree.c (zero_init_expr_p): Use uses_template_parms instead of
      	dependent_type_p.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp0x/dependent3.C: New test.
      Patrick Palka committed
    • c++: Lambda in friend of constrained class [PR94645] · f9f16625
      In the testcase below, when grokfndecl processes the operator() decl for the
      lambda inside the friend function foo, processing_template_decl is rightly 1,
      but template_class_depth on the lambda's closure type incorrectly returns 0
      instead of 1.
      
      Since processing_template_decl > template_class_depth, this makes grokfndecl
      think that the operator() has its own set of template arguments, and so we
      attach the innermost set of constraints -- those belonging to struct l -- to the
      operator() decl.  We then get confused when checking constraints_satisfied_p on
      the operator() because it doesn't have template information and yet has
      constraints associated with it.
      
      This patch fixes template_class_depth to return the correct template nesting
      level in cases like these, in that when it hits a friend function it walks into
      the DECL_FRIEND_CONTEXT of the friend rather than into the CP_DECL_CONTEXT.
      
      gcc/cp/ChangeLog:
      
      	PR c++/94645
      	* pt.c (template_class_depth): Walk into the DECL_FRIEND_CONTEXT of a
      	friend declaration rather than into its CP_DECL_CONTEXT.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/94645
      	* g++.dg/cpp2a/concepts-lambda6.C: New test.
      Patrick Palka committed
    • amdgcn: Swap mov<mode>_exec operands · b7886845
      Every other *_exec insn has the exec operand last.  This being the other way
      around is a cause of bugs, and prevents use in macro templates.
      
      2020-04-23  Andrew Stubbs  <ams@codesourcery.com>
      
      	gcc/
      	* config/gcn/gcn-valu.md (mov<mode>_exec): Swap the numbers on operands
      	2 and 3.
      	(mov<mode>_exec): Likewise.
      	(trunc<vndi><mode>2_exec): Swap parameters to gen_mov<mode>_exec.
      	(<convop><mode><vndi>2_exec): Likewise.
      Andrew Stubbs committed
    • libstdc++: Mark experimental::net::system_context ctor deleted · 8c9d69ba
                 * include/experimental/net/executor (system_context): Mark
                 system_context::system_context() = delete.
                 * testsuite/experimental/net/executor/1.cc: Add new
                 test to check system_context is not default constructible.
      Thomas Rodgers committed
    • libstdc++: Update C++20 library status docs · be0363c8
      This reorganises the C++20 status table, grouping the proposals by
      category. It also adds more proposals, and documents all the feature
      test macros for C++20 library changes.
      
      	* doc/xml/manual/status_cxx2020.xml: Update C++20 status table.
      	* doc/html/*: Regenerate.
      Jonathan Wakely committed
    • libstdc++: Change __cpp_lib_array_constexpr for C++17 again · 40541efe
      This partially reverts my previous change related to this macro. The
      C++20 constexpr iterator requirements are always met by array:iterator,
      because it's just a pointer. So the macro can be set to 201803 even in
      C++17 mode.
      
      	* include/bits/stl_iterator.h (__cpp_lib_array_constexpr): Revert
      	value for C++17 to 201803L because P0858R0 is supported for C++17.
      	* include/std/version (__cpp_lib_array_constexpr): Likewise.
      	* testsuite/23_containers/array/element_access/constexpr_c++17.cc:
      	Check for value corresponding to P0031R0 features being tested.
      	* testsuite/23_containers/array/requirements/constexpr_iter.cc:
      	Check for value corresponding to P0858R0 features being tested.
      Jonathan Wakely committed
    • libstdc++: Define __cpp_lib_three_way_comparison for freestanding · a2dcb56c
      The <compare> header is always supported, not only for hosted configs.
      
      	* include/std/version (__cpp_lib_three_way_comparison): Define for
      	freestanding builds.
      Jonathan Wakely committed
    • Fix segfault with -O2 -fnon-call-exceptions -ftracer · cb76fcd7
      The GIMPLE SSA store merging pass blows up when it is rewriting the
      stores because it didn't realize that they don't belong to the same
      EH region.  Fixed by refusing to merge them.
      
      	PR tree-optimization/94717
      	* gimple-ssa-store-merging.c (try_coalesce_bswap): Return false if
      	one of the stores doesn't have the same landing pad number as the
      	first.
      	(coalesce_immediate_stores): Do not try to coalesce the store using
      	bswap if it doesn't have the same landing pad number as the first.
      Eric Botcazou committed
    • rs6000: Replace outdated link to ELFv2 ABI · 431ee358
      A user reported that we are still referring to a public review
      draft of the ELFv2 ABI specification.  Replace that by a permalink.
      
      2020-04-24  Bill Schmidt  <wschmidt@linux.ibm.com>
      
      	* gcc/doc/extend.texi (PowerPC AltiVec/VSX Built-in Functions):
      	Replace outdated link to ELFv2 ABI.
      Bill Schmidt committed
    • Shortcut identity VEC_PERM expansion [PR94710] · f51be2fb
      This PR is about the rs6000 backend emitting wrong assembly
      for whole vector shift by 0, and while I think it is desirable
      to fix the backend, I don't see a point why the expander should
      try to emit that, whole vector shift by 0 is identity, we can just
      return the operand.
      
      2020-04-23  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/94710
      	* optabs.c (expand_vec_perm_const): For shift_amt const0_rtx
      	just return v2.
      Jakub Jelinek committed
    • coroutines: Fix handling of conditional statements [PR94288] · 3dbc7721
      Normally, when we find a statement containing an await expression
      this will be expanded to a statement list implementing the control
      flow implied.  The expansion process successively replaces each
      await expression in a statement with the result of its await_resume().
      
      In the case of conditional statements (if, while, do, switch) the
      expansion of the condition (or expression in the case of do-while)
      cannot take place 'inline', leading to the PR.
      
      The solution is to evaluate the expression separately, and to
      transform while and do-while loops into endless loops with a break
      on the required condition.
      
      In fixing this, I realised that I'd also made a thinko in the case
      of expanding truth-and/or-if expressions, where one arm of the
      expression might need to be short-circuited.  The mechanism for
      expanding via the tree walk will not work correctly in this case and
      we need to pre-expand any truth-and/or-if with an await expression
      on its conditionally-taken arm.  This applies to any statement with
      truth-and/or-if expressions, so can be handled generically.
      
      gcc/cp/ChangeLog:
      
      2020-04-23  Iain Sandoe  <iain@sandoe.co.uk>
      
      	PR c++/94288
      	* coroutines.cc (await_statement_expander): Simplify cases.
      	(struct susp_frame_data): Add fields for truth and/or if
      	cases, rename one field.
      	(analyze_expression_awaits): New.
      	(expand_one_truth_if): New.
      	(add_var_to_bind): New helper.
      	(coro_build_add_if_not_cond_break): New helper.
      	(await_statement_walker): Handle conditional expressions,
      	handle expansion of truth-and/or-if cases.
      	(bind_expr_find_in_subtree): New, checking-only.
      	(coro_body_contains_bind_expr_p): New, checking-only.
      	(morph_fn_to_coro): Ensure that we have a top level bind
      	expression.
      
      gcc/testsuite/ChangeLog:
      
      2020-04-23  Iain Sandoe  <iain@sandoe.co.uk>
      
      	PR c++/94288
      	* g++.dg/coroutines/torture/co-await-18-if-cond.C: New test.
      	* g++.dg/coroutines/torture/co-await-19-while-cond.C: New test.
      	* g++.dg/coroutines/torture/co-await-20-do-while-cond.C: New test.
      	* g++.dg/coroutines/torture/co-await-21-switch-value.C: New test.
      	* g++.dg/coroutines/torture/co-await-22-truth-and-of-if.C: New test.
      	* g++.dg/coroutines/torture/co-ret-16-simple-control-flow.C: New test.
      Iain Sandoe committed
    • c-family: Fix ICE on attribute with -fgnu-tm [PR94733] · 7291b2ed
      find_tm_attribute was using TREE_PURPOSE to get the attribute name,
      which is breaking now that we preserve the C++11-style attribute
      format past decl_attributes.  So use get_attribute_name which can
      handle both formats of attributes.
      
      	PR c++/94733
      	* c-attribs.c (find_tm_attribute): Use get_attribute_name instead of
      	TREE_PURPOSE.
      
      	* g++.dg/tm/attrib-5.C: New test.
      Marek Polacek committed
    • tree: Fix up get_narrower [PR94724] · bca558de
      In the recent get_narrower change, I wanted it to be efficient and avoid
      recursion if there are many nested COMPOUND_EXPRs.  That builds the
      COMPOUND_EXPR nest with the right arguments, but as build2_loc computes some
      flags like TREE_SIDE_EFFECTS, TREE_CONSTANT and TREE_READONLY, when it
      is called with something that will not be the argument in the end, those
      flags are computed incorrectly.
      So, this patch instead uses an auto_vec and builds them in the reverse order
      so when they are built, they are built with the correct operands.
      
      2020-04-23  Jakub Jelinek  <jakub@redhat.com>
      
      	PR middle-end/94724
      	* tree.c (get_narrower): Instead of creating COMPOUND_EXPRs
      	temporarily with non-final second operand and updating it later,
      	push COMPOUND_EXPRs into a vector and process it in reverse,
      	creating COMPOUND_EXPRs with the final operands.
      
      	* gcc.c-torture/execute/pr94724.c: New test.
      Jakub Jelinek committed
    • Fix PR 93956, wrong pointer when returned via function. · 06eca1ac
      This one took a bit of detective work.  When array pointers point
      to components of derived types, we currently set the span field
      and then create an array temporary when we pass the array
      pointer to a procedure as a non-pointer or non-target argument.
      (This is inefficient, but that's for another release).
      
      Now, the compiler detected this case when there was a direct assignment
      like p => a%b, but not when p was returned either as a function result
      or via an argument.  This patch fixes that.
      
      2020-04-23  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/93956
      	* expr.c (gfc_check_pointer_assign): Also set subref_array_pointer
      	when a function returns a pointer.
      	* interface.c (gfc_set_subref_array_pointer_arg): New function.
      	(gfc_procedure_use): Call it.
      
      2020-04-23  Thomas Koenig  <tkoenig@gcc.gnu.org>
      
      	PR fortran/93956
      	* gfortran.dg/pointer_assign_13.f90: New test.
      Thomas König committed
    • coroutines, libstdc++-v3: Update to n4861 C++20 DIS. · dcf69ac5
      Update the inline namespace to __n4861.
      Add '__cpp_lib_coroutine' defined to 201902L per n4861.
      
      libstdc++-v3/ChangeLog:
      
      2020-04-23  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* include/std/coroutine: Update the inline namespace to __n4861.
      	Add the __cpp_lib_coroutine define, set to 201902L.
      	* include/std/version: Add __cpp_lib_coroutine, set to 201902L.
      
      gcc/testsuite/ChangeLog:
      
      2020-04-23  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* g++.dg/coroutines/coro-bad-alloc-00-bad-op-new.C: Adjust for
      	changed inline namespace.
      	* g++.dg/coroutines/coro-bad-alloc-01-bad-op-del.C: Likewise.
      	* g++.dg/coroutines/coro-bad-alloc-02-no-op-new-nt.C: Likewise
      	* g++.dg/coroutines/coro.h: Likewise
      Iain Sandoe committed
    • aarch64: ensure bti c is emitted at function start [PR94697] · f7e4641a
      The bti pass currently first emits bti c at function start
      if there is no paciasp (which also acts as indirect call
      landing pad), then bti j is emitted at jump labels, however
      if there is a label right before paciasp then the function
      start can end up like
      
        foo:
        label:
          bti j
          paciasp
          ...
      
      This patch is a minimal fix that just moves the bti c handling
      after the bti j handling so we end up with
      
        foo:
          bti c
        label:
          bti j
          paciasp
          ...
      
      This could be improved by emitting bti jc in this case, or by
      detecting that the label is not in fact an indirect jump target
      and then this situation would be much less common.
      
      Needs to be backported to gcc-9 branch.
      
      gcc/ChangeLog:
      
      	PR target/94697
      	* config/aarch64/aarch64-bti-insert.c (rest_of_insert_bti): Swap
      	bti c and bti j handling.
      
      gcc/testsuite/ChangeLog:
      
      	PR target/94697
      	* gcc.target/aarch64/pr94697.c: New test.
      Szabolcs Nagy committed
    • testsuite: Add extra aarch64 predefine tests · 857d1fa3
      Add extra testing in the following two tests to make sure CPP predefines
      redefinitions on #pragma works as expected when -mgeneral-regs-only
      option is specified (See PR94678):
      gcc.target/aarch64/pragma_cpp_predefs_2.c
      gcc.target/aarch64/pragma_cpp_predefs_3.c
      
      2020-04-23  Felix Yang  <felix.yang@huawei.com>
      
      gcc/testsuite/
      	PR target/94678
      	* gcc.target/aarch64/pragma_cpp_predefs_2.c: Fix typos, pop_pragma ->
      	pop_options. Add tests for general-regs-only.
      	* gcc.target/aarch64/pragma_cpp_predefs_3.c: Add tests for
      	general-regs-only.
      Fei Yang committed
    • OpenACC: Avoid ICE in type-cast 'async', 'wait' clauses · ee9fcee3
      2020-04-23  Andrew Stubbs  <ams@codesourcery.com>
      	    Thomas Schwinge  <thomas@codesourcery.com>
      
      	PR middle-end/93488
      
      	gcc/
      	* omp-expand.c (expand_omp_target): Use force_gimple_operand_gsi on
      	t_async and the wait arguments.
      
      	gcc/testsuite/
      	* c-c++-common/goacc/pr93488.c: New file.
      
      Reviewed-by: Thomas Schwinge <thomas@codesourcery.com>
      Andrew Stubbs committed
    • vect: Fix comparisons between invariant booleans [PR94727] · 901f5289
      This PR was caused by mismatched expectations between
      vectorizable_comparison and SLP.  We had a "<" comparison
      between two booleans that were leaves of the SLP tree, so
      vectorizable_comparison fell back on:
      
        /* Invariant comparison.  */
        if (!vectype)
          {
            vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (rhs1),
                                                   slp_node);
            if (maybe_ne (TYPE_VECTOR_SUBPARTS (vectype), nunits))
              return false;
          }
      
      rhs1 and rhs2 were *unsigned* boolean types, so we got back a vector
      of unsigned integers.  This in itself was OK, and meant that "<"
      worked as expected without the need for the boolean fix-ups:
      
        /* Boolean values may have another representation in vectors
           and therefore we prefer bit operations over comparison for
           them (which also works for scalar masks).  We store opcodes
           to use in bitop1 and bitop2.  Statement is vectorized as
             BITOP2 (rhs1 BITOP1 rhs2) or
             rhs1 BITOP2 (BITOP1 rhs2)
           depending on bitop1 and bitop2 arity.  */
        bool swap_p = false;
        if (VECTOR_BOOLEAN_TYPE_P (vectype))
          {
      
      However, vectorizable_comparison then used vect_get_slp_defs to get
      the actual operands.  The request went to vect_get_constant_vectors,
      which also has logic to calculate the vector type.  The problem was
      that this type was different from the one chosen above:
      
        if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (op))
            && vect_mask_constant_operand_p (stmt_vinfo))
          vector_type = truth_type_for (stmt_vectype);
        else
          vector_type = get_vectype_for_scalar_type (vinfo, TREE_TYPE (op), op_node);
      
      So the function gave back a vector of mask types, which here are vectors
      of *signed* booleans.  This meant that "<" gave:
      
        true (-1) < false (0)
      
      and so the boolean fixup above was needed after all.
      
      Fixed by making vectorizable_comparison also pick a mask type in
      this case.
      
      2020-04-23  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR tree-optimization/94727
      	* tree-vect-stmts.c (vectorizable_comparison): Use mask_type when
      	comparing invariant scalar booleans.
      
      gcc/testsuite/
      	PR tree-optimization/94727
      	* gcc.dg/vect/pr94727.c: New test.
      Richard Sandiford committed
    • [AArch64] (PR94383) Avoid C++17 empty base field checking for HVA/HFA · e73a32d6
      In C++17, an empty class deriving from an empty base is not an
      aggregate, while in C++14 it is.  In order to implement this, GCC adds
      an artificial field to such classes.
      
      This artificial field has no mapping to Fundamental Data Types in the
      AArch64 PCS ABI and hence should not count towards determining whether an
      object can be passed using the vector registers as per section
      "6.4.2 Parameter Passing Rules" in the AArch64 PCS.
      https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst#the-base-procedure-call-standard
      
      This patch avoids counting this artificial field in
      aapcs_vfp_sub_candidate, and hence calculates whether such objects
      should be passed in vector registers in the same manner as C++14 (where
      the artificial field does not exist).
      
      Before this change, the test below would pass the arguments to `f` in
      general registers.  After this change, the test passes the arguments to
      `f` using the vector registers.
      
      The new behaviour matches the behaviour of `armclang`, and also matches
      the behaviour when run with `-std=gnu++14`.
      
      > gcc -std=gnu++17 test.cpp
      
      ``` test.cpp
      struct base {};
      
      struct pair : base
      {
        float first;
        float second;
        pair (float f, float s) : first(f), second(s) {}
      };
      
      void f (pair);
      int main()
      {
        f({3.14, 666});
        return 1;
      }
      ```
      
      We add a `-Wpsabi` warning to catch cases where this fix has changed the ABI for
      some functions.  Unfortunately this warning is not emitted twice for multiple
      calls to the same function, but I feel this is not much of a problem and can be
      fixed later if needs be.
      
      (i.e. if `main` called `f` twice in a row we only emit a diagnostic for the
      first).
      
      Testing:
          Bootstrap and regression test on aarch64-linux.
          All struct-layout-1 tests now pass.
      
      gcc/ChangeLog:
      
      2020-04-23  Matthew Malcomson  <matthew.malcomson@arm.com>
      	    Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/94383
      	* config/aarch64/aarch64.c (aapcs_vfp_sub_candidate): Account for C++17
      	empty base class artificial fields.
      	(aarch64_vfp_is_call_or_return_candidate): Warn when ABI PCS decision is
      	different after this fix.
      Matthew Malcomson committed
    • Protect the trigd functions in libgfortran from unavailable math functions. · e8eecc2a
      libgfortran/ChangeLog:
      
      2020-04-22  Fritz Reese  <foreese@gcc.gnu.org>
      
      	PR libfortran/94694
      	PR libfortran/94586
      	* intrinsics/trigd.c, intrinsics/trigd_lib.inc, intrinsics/trigd.inc:
      	Guard against unavailable math functions.
      	Use suffixes from kinds.h based on the REAL kind.
      
      gcc/fortran/ChangeLog:
      
      2020-04-22  Fritz Reese  <foreese@gcc.gnu.org>
      
      	* trigd_fe.inc: Use mpfr to compute cosd(30) rather than a host-
      	precision floating point literal based on an invalid macro.
      Fritz Reese committed
    • amdgcn: Check HSA return codes [PR94629] · 966de09b
      Ensure that the returned status values are not ignored.  The old code was
      not broken, but this is both safer and satisfies static analysis.
      
      2020-04-23  Andrew Stubbs  <ams@codesourcery.com>
      
      	PR other/94629
      
      	libgomp/
      	* plugin/plugin-gcn.c (init_hsa_context): Check return value from
      	hsa_iterate_agents.
      	(GOMP_OFFLOAD_init_device): Check return values from both calls to
      	hsa_agent_iterate_regions.
      Andrew Stubbs committed