Skip to content
Snippets Groups Projects
  1. Nov 11, 2020
    • GCC Administrator's avatar
      Daily bump. · bb622641
      GCC Administrator authored
      bb622641
    • Ilya Leoshkevich's avatar
      IBM Z: Fix bootstrap breakage due to HAVE_TF macro · 778087e0
      Ilya Leoshkevich authored
      Commit e627cda5 ("IBM Z: Store long doubles in vector registers
      when possible") introduced HAVE_TF macro which expands to a logical
      "or" of HAVE_ constants.  Not all of these constants are available in
      GENERATOR_FILE context, so a hack was used: simply expand to true in
      this case, because the actual value matters only during compiler
      runtime and not during generation.
      
      However, one aspect of this value matters during generation after all:
      whether or not it's a constant, which in this case it appears to be.
      This results in incorrect values in insn-flags.h and broken bootstrap
      for some configurations.
      
      Fix by using a dummy value that is not a constant.
      
      gcc/ChangeLog:
      
      2020-11-10  Ilya Leoshkevich  <iii@linux.ibm.com>
      
      	* config/s390/s390.h (HAVE_TF): Use opaque value when
      	GENERATOR_FILE is defined.
      778087e0
  2. Nov 10, 2020
    • Jonathan Wakely's avatar
      libstdc++: Avoid bad_alloc exceptions when changing locales · 5dfbc522
      Jonathan Wakely authored
      For the --enable-clocale=generic configuration, the current code can
      fail with a bad_alloc exception. This patch uses the nothrow version of
      operator new and reports allocation failures by setting failbit in the
      iostate variable.
      
      	* config/locale/generic/c_locale.cc (__set_C_locale()): New function
      	to set the "C" locale and return the name of the previous locale.
      	(__convert_to_v<float>, __convert_to_v<double>)
      	(__convert_to_v<long double>): Use __set_C_locale and set failbit on
      	error.
      5dfbc522
    • Marek Polacek's avatar
      c++: Improve static_assert diagnostic [PR97518] · 8c0c83fe
      Marek Polacek authored
      Currently, when a static_assert fails, we only say "static assertion failed".
      It would be more useful if we could also print the expression that
      evaluated to false; this is especially useful when the condition uses
      template parameters.  Consider the motivating example, in which we have
      this line:
      
        static_assert(is_same<X, Y>::value);
      
      if this fails, the user has to play dirty games to get the compiler to
      print the template arguments.  With this patch, we say:
      
        error: static assertion failed
        note: 'is_same<int*, int>::value' evaluates to false
      
      which I think is much better.  However, always printing the condition that
      evaluated to 'false' wouldn't be very useful: e.g. noexcept(fn) is
      always parsed to true/false, so we would say "'false' evaluates to false"
      which doesn't help.  So I wound up only printing the condition when it was
      instantiation-dependent, that is, we called finish_static_assert from
      tsubst_expr.
      
      Moreover, this patch also improves the diagnostic when the condition
      consists of a logical AND.  Say you have something like this:
      
        static_assert(fn1() && fn2() && fn3() && fn4() && fn5());
      
      where fn4() evaluates to false and the other ones to true.  Highlighting
      the whole thing is not that helpful because it won't say which clause
      evaluated to false.  With the find_failing_clause tweak in this patch
      we emit:
      
        error: static assertion failed
          6 | static_assert(fn1() && fn2() && fn3() && fn4() && fn5());
            |                                          ~~~^~
      
      so you know right away what's going on.  Unfortunately, when you combine
      both things, that is, have an instantiation-dependent expr and && in
      a static_assert, we can't yet quite point to the clause that failed.  It
      is because when we tsubstitute something like is_same<X, Y>::value, we
      generate a VAR_DECL that doesn't have any location.  It would be awesome
      if we could wrap it with a location wrapper, but I didn't see anything
      obvious.
      
      In passing, I've cleaned up some things:
      * use iloc_sentinel when appropriate,
      * it's nicer to call contextual_conv_bool instead of the rather verbose
        perform_implicit_conversion_flags,
      * no need to check for INTEGER_CST before calling integer_zerop.
      
      gcc/cp/ChangeLog:
      
      	PR c++/97518
      	* cp-tree.h (finish_static_assert): Adjust declaration.
      	* parser.c (cp_parser_static_assert): Pass false to
      	finish_static_assert.
      	* pt.c (tsubst_expr): Pass true to finish_static_assert.
      	* semantics.c (find_failing_clause_r): New function.
      	(find_failing_clause): New function.
      	(finish_static_assert): Add a bool parameter.  Use
      	iloc_sentinel.  Call contextual_conv_bool instead of
      	perform_implicit_conversion_flags.  Don't check for INTEGER_CST before
      	calling integer_zerop.  Call find_failing_clause and maybe use its
      	location.  Print the original condition or the failing clause if
      	SHOW_EXPR_P.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/97518
      	* g++.dg/diagnostic/pr87386.C: Adjust expected output.
      	* g++.dg/diagnostic/static_assert1.C: New test.
      	* g++.dg/diagnostic/static_assert2.C: New test.
      
      libcc1/ChangeLog:
      
      	PR c++/97518
      	* libcp1plugin.cc (plugin_add_static_assert): Pass false to
      	finish_static_assert.
      8c0c83fe
    • Marek Polacek's avatar
      c++: Add 5 unfixed tests. · a210d404
      Marek Polacek authored
      A couple of dg-ice tests.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/52830
      	PR c++/88982
      	PR c++/90799
      	PR c++/87765
      	PR c++/89565
      	* g++.dg/cpp0x/constexpr-52830.C: New test.
      	* g++.dg/cpp0x/vt-88982.C: New test.
      	* g++.dg/cpp1z/class-deduction76.C: New test.
      	* g++.dg/cpp1z/constexpr-lambda26.C: New test.
      	* g++.dg/cpp2a/nontype-class39.C: New test.
      a210d404
    • Jonathan Wakely's avatar
      libstdc++: Reorder constructors in <sstream> · f7c41c57
      Jonathan Wakely authored
      This groups all the constructors together, consistent with the synopses
      in the C++20 standard.
      
      libstdc++-v3/ChangeLog:
      
      	* include/std/sstream (basic_stringbug, basic_istringstream)
      	(basic_ostringstream, basic_stringstream): Reorder C++20
      	constructors to be declared next to other constructors.
      f7c41c57
    • Jonathan Wakely's avatar
      libstdc++: Add remaining C++20 additions to <sstream> [P0408R7] · 95cb0fc8
      Jonathan Wakely authored
      This adds the new overloads of basic_stringbuf::str, and the
      corresponding overloads to basic_istringstream, basic_ostringstream and
      basic_stringstream.
      
      libstdc++-v3/ChangeLog:
      
      	* config/abi/pre/gnu.ver (GLIBCXX_3.4.21): Tighten patterns.
      	(GLIBCXX_3.4.29): Export new symbols.
      	* include/bits/alloc_traits.h (__allocator_like): New concept.
      	* include/std/sstream (basic_stringbuf::swap): Add exception
      	specification.
      	(basic_stringbuf::str() const): Add ref-qualifier. Use new
      	_M_high_mark function.
      	(basic_stringbuf::str(const SAlloc&) const): Define new function.
      	(basic_stringbuf::str() &&): Likewise.
      	(basic_stringbuf::str(const basic_string<C,T,SAlloc>&)):
      	Likewise.
      	(basic_stringbuf::str(basic_string<C,T,Alloc>&&)): Likewise.
      	(basic_stringbuf::view() const): Use _M_high_mark.
      	(basic_istringstream::str, basic_ostringstream::str)
      	(basic_stringstream::str): Define new overloads.
      	* src/c++20/sstream-inst.cc (basic_stringbuf::str)
      	(basic_istringstream::str, basic_ostringstream::str)
      	(basic_stringstream::str): Explicit instantiation definitions
      	for new overloads.
      	* testsuite/27_io/basic_istringstream/view/char/1.cc: Add more
      	checks.
      	* testsuite/27_io/basic_istringstream/view/wchar_t/1.cc:
      	Likewise.
      	* testsuite/27_io/basic_ostringstream/view/char/1.cc:
      	Likewise.
      	* testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc:
      	Likewise.
      	* testsuite/27_io/basic_stringstream/view/char/1.cc:
      	Likewise.
      	* testsuite/27_io/basic_stringstream/view/wchar_t/1.cc:
      	Likewise.
      	* testsuite/27_io/basic_istringstream/str/char/2.cc: New test.
      	* testsuite/27_io/basic_istringstream/str/wchar_t/2.cc: New test.
      	* testsuite/27_io/basic_ostringstream/str/char/3.cc: New test.
      	* testsuite/27_io/basic_ostringstream/str/wchar_t/3.cc: New test.
      	* testsuite/27_io/basic_stringbuf/str/char/4.cc: New test.
      	* testsuite/27_io/basic_stringbuf/str/wchar_t/4.cc: New test.
      	* testsuite/27_io/basic_stringstream/str/char/5.cc: New test.
      	* testsuite/27_io/basic_stringstream/str/wchar_t/5.cc.cc: New test.
      95cb0fc8
    • Jonathan Wakely's avatar
      libstdc++: Fix more unspecified comparisons to null pointer [PR 97415] · ced70eba
      Jonathan Wakely authored
      This adds some more null checks to avoid a relational comparison with a
      null pointer, similar to 78198b60.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/97415
      	* include/std/sstream (basic_stringbuf::_M_update_egptr)
      	(basic_stringbuf::__xfer_bufptrs::__xfer_bufptrs): Check for
      	null before comparing pointers.
      ced70eba
    • Strager Neds's avatar
      Refactor copying decl section names · 8b9a92f7
      Strager Neds authored
      gcc/
      
      	* cgraph.h (symtab_node::get_section): Constify.
      	(symtab_node::set_section): Declare new overload.
      	* symtab.c (symtab_node::set_section): Define new overload.
      	(symtab_node::copy_visibility_from): Use new overload of
      	symtab_node::set_section.
      	(symtab_node::resolve_alias): Same.
      	* tree.h (set_decl_section_name): Declare new overload.
      	* tree.c (set_decl_section_name): Define new overload.
      	* tree-emutls.c (get_emutls_init_templ_addr): Same.
      	* cgraphclones.c (cgraph_node::create_virtual_clone): Use new
      	overload of symtab_node::set_section.
      	(cgraph_node::create_version_clone_with_body): Same.
      	* trans-mem.c (ipa_tm_create_version): Same.
      
      gcc/c
      	* c-decl.c (merge_decls): Use new overload of
      	set_decl_section_name.
      
      gcc/cp
      	* decl.c (duplicate_decls): Use new overload of
      	set_decl_section_name.
      	* method.c (use_thunk): Same.
      	* optimize.c (maybe_clone_body): Same.
      	* coroutines.cc (act_des_fn): Same.
      
      gcc/d
      	* decl.cc (finish_thunk): Use new overload of
      	set_decl_section_name
      8b9a92f7
    • Aldy Hernandez's avatar
      Early exit from irange::set for poly ints. · 5e41e7f0
      Aldy Hernandez authored
      My previous cleanups to irange::set moved the early exit when
      VARYING.  This caused poly int varyings to be created with
      incorrect min/max.
      
      We can just set varying and exit for all poly ints.
      
      gcc/ChangeLog:
      
      	* value-range.cc (irange::set): Early exit for poly ints.
      5e41e7f0
    • Martin Liska's avatar
      analyzer: remove dead code · c710051a
      Martin Liska authored
      gcc/analyzer/ChangeLog:
      
      	* constraint-manager.cc (constraint_manager::merge): Remove
      	unused code.
      	* constraint-manager.h: Likewise.
      	* program-state.cc (sm_state_map::sm_state_map): Likewise.
      	(program_state::program_state): Likewise.
      	(test_sm_state_map): Likewise.
      	* program-state.h: Likewise.
      	* region-model-reachability.cc (reachable_regions::reachable_regions): Likewise.
      	* region-model-reachability.h: Likewise.
      	* region-model.cc (region_model::handle_unrecognized_call): Likewise.
      	(region_model::get_reachable_svalues): Likewise.
      	(region_model::can_merge_with_p): Likewise.
      c710051a
    • Tobias Burnus's avatar
      Fortran: OpenMP 5.0 (in_,task_)reduction clause extensions · e929ef53
      Tobias Burnus authored
      gcc/fortran/ChangeLog:
      
      	* dump-parse-tree.c (show_omp_clauses): Handle new reduction enums.
      	* gfortran.h (OMP_LIST_REDUCTION_INSCAN, OMP_LIST_REDUCTION_TASK,
      	OMP_LIST_IN_REDUCTION, OMP_LIST_TASK_REDUCTION): Add enums.
      	* openmp.c (enum omp_mask1): Add OMP_CLAUSE_IN_REDUCTION
      	and OMP_CLAUSE_TASK_REDUCTION.
      	(gfc_match_omp_clause_reduction): Extend reduction handling;
      	moved from ...
      	(gfc_match_omp_clauses): ... here. Add calls to it.
      	(OMP_TASK_CLAUSES, OMP_TARGET_CLAUSES, OMP_TASKLOOP_CLAUSES):
      	Add OMP_CLAUSE_IN_REDUCTION.
      	(gfc_match_omp_taskgroup): Add task_reduction matching.
      	(resolve_omp_clauses): Update for new reduction clause changes;
      	remove removed nonmonotonic-schedule restrictions.
      	(gfc_resolve_omp_parallel_blocks): Add new enums to switch.
      	* trans-openmp.c (gfc_omp_clause_default_ctor,
      	gfc_trans_omp_reduction_list, gfc_trans_omp_clauses,
      	gfc_split_omp_clauses): Handle updated reduction clause.
      
      gcc/ChangeLog:
      
      	* gimplify.c (gimplify_scan_omp_clauses, gimplify_omp_loop): Use 'do'
      	instead of 'for' in error messages for Fortran.
      	* omp-low.c (check_omp_nesting_restrictions): Likewise
      
      gcc/testsuite/ChangeLog:
      
      	* gfortran.dg/gomp/schedule-modifiers-2.f90: Remove some dg-error.
      	* gfortran.dg/gomp/reduction4.f90: New test.
      	* gfortran.dg/gomp/reduction5.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-1.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-2.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-3.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-4.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-5.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-6.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-7.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-8.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-9.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-10.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-11.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-12.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-13.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-14.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-15.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-16.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-17.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-18.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-19.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-20.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-21.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-22.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-23.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-24.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-25.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-26.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-27.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-28.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-29.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-30.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-31.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-32.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-33.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-34.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-35.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-36.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-37.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-38.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-39.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-40.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-41.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-42.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-43.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-44.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-45.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-46.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-47.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-48.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-49.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-50.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-51.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-52.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-53.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-54.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-55.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-56.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-57.f90: New test.
      	* gfortran.dg/gomp/workshare-reduction-58.f90: New test.
      e929ef53
    • Matthew Malcomson's avatar
      opts: Change `is incompatible with` messages to have standard parametrised form · 2cca9751
      Matthew Malcomson authored
      Hello,
      
      In a recent review for one of the hwasan patches Richard S. noticed there are
      quite a few errors of the form "%<someflag%> is incompatible with
      <otherflag%>".
      https://gcc.gnu.org/pipermail/gcc-patches/2020-October/556137.html
      
      In order to avoid this creating extra work for translators we would like to
      change these error messages to use the form "%qs is incompatible with %qs" and
      pass the flag as format arguments.
      
      This patch implements that change.
      There is only one change in the output the compiler produces from this patch,
      an error message of "-fsanitize=address and -fsanitize=kernel-address are
      incompatible with -fsanitize=thread" has been changed to "-fsanitize=thread is
      incompatible with -fsanitize=address|kernel-address".
      This matches the similar error messages for live patching which use the
      messages "-f<something> is incompatible with
      -flive-patching=inline-only-static|inline-clone".
      
      Ok for trunk?
      
      gcc/ChangeLog:
      
      	* opts.c (control_options_for_live_patching): Reform 'is incompatible
      	with' error messages to use a standard message with differing format
      	arguments.
      	(finish_options): Likewise.
      
      gcc/testsuite/ChangeLog:
      
      	* c-c++-common/ubsan/sanitize-recover-7.c: Update testcase.
      2cca9751
    • Jeff Law's avatar
      Fix minor whitespace issues · 831f24a7
      Jeff Law authored
      libgcc/
      
      	* libgcc2.c: Fix whitespace issues in most recent change.
      831f24a7
    • Stefan Kanthak's avatar
      Improve generated code for various libgcc2.c routines · ebc4cd54
      Stefan Kanthak authored
      libgcc/
      
      	* libgcc2.c (__addvSI3): Use overflow builtins.
      	(__addvsi3, __addvDI3 ,__subvSI3, __subvsi3): Likewise.
      	(__subvDI3 __mulvSI3, __mulvsi3, __negvSI2): Likewise.
      	(__negvsi2, __negvDI2): Likewise.
      	(__cmpdi2, __ucmpdi2): Adjust implementation to improve
      	generated code.
      	* libgcc2.h (__ucmpdi2): Adjust prototype.
      ebc4cd54
    • Ian Lance Taylor's avatar
    • Jakub Jelinek's avatar
      c, c++: Fix up -Wunused-value on COMPLEX_EXPRs [PR97748] · 0000ea4f
      Jakub Jelinek authored
      The -Wunused-value warning in both C and C++ FEs (implemented
      significantly differently between the two) sees the COMPLEX_EXPRs created
      e.g. for complex pre/post increment and many other expressions as useless
      and warns about it.
      
      For the C warning implementation, on e.g.
      COMPLEX_EXPR < ++REALPART_EXPR <x>, IMAGPART_EXPR <x>>;
      would warn even on the IMAGPART_EXPR <x> there alone etc., so what works
      is check if we'd warn about both operands of COMPLEX_EXPR and if yes,
      warn on the whole COMPLEX_EXPR, otherwise don't warn.
      
      The C++ warning implementation is significantly different and for that one
      the only warn if both would be warned about doesn't really work,
      we then miss warnings e.g. about
      COMPLEX_EXPR <REALPART_EXPR <SAVE_EXPR <x>> + 1.0e+0, IMAGPART_EXPR <SAVE_EXPR <x>>> >>>>>
      The patch replaces the warning_at call with call to the c-family
      warn_if_unused_value function.
      
      On the testcase which after the initial new tests contains pretty much
      everything from gcc.dg/Wunused-value-1.c both approaches seem to work
      nicely.
      
      2020-11-10  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c/97748
      gcc/c-family/
      	* c-common.h (warn_if_unused_value): Add quiet argument defaulted
      	to false.
      	* c-warn.c (warn_if_unused_value): Likewise.  Pass it down
      	recursively and just return true instead of warning if it is true.
      	Handle COMPLEX_EXPR.
      gcc/cp/
      	* cvt.c (convert_to_void): Check (complain & tf_warning) in the outer
      	if rather than twice times in the inner one.  Use warn_if_unused_value.
      	Formatting fix.
      gcc/testsuite/
      	* c-c++-common/Wunused-value-1.c: New test.
      0000ea4f
    • Richard Biener's avatar
      tree-optimization/97769 - fix assert in peeling for alignment · 16937463
      Richard Biener authored
      The following removes an assert that can not easily be adjusted to
      cover the additional cases we now handle after the removal of
      the same-align DRs vector.
      
      2020-11-10  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/97769
      	* tree-vect-data-refs.c (vect_update_misalignment_for_peel):
      	Remove assert.
      
      	* gcc.dg/vect/pr97769.c: New testcase.
      16937463
    • Richard Biener's avatar
      tree-optimization/97780 - fix ICE in fini_pre · 960c4712
      Richard Biener authored
      This deals with blocks elimination added.
      
      2020-11-10  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/97780
      	* tree-ssa-pre.c (fini_pre): Deal with added basic blocks
      	when freeing PHI_TRANS_TABLE.
      960c4712
    • zhengnannan's avatar
      AArch64: Add FLAG for tbl/tbx intrinsics [PR94442] · 1900707e
      zhengnannan authored
      2020-11-10  Zhiheng Xie  <xiezhiheng@huawei.com>
      	    Nannan Zheng  <zhengnannan@huawei.com>
      
      gcc/ChangeLog:
      
      	* config/aarch64/aarch64-simd-builtins.def: Add proper FLAG
      	for tbl/tbx intrinsics.
      1900707e
    • Chung-Lin Tang's avatar
      openmp: Implement OpenMP 5.0 base-pointer attachement and clause ordering · 9e628024
      Chung-Lin Tang authored
      This patch implements some parts of the target variable mapping changes
      specified in OpenMP 5.0, including base-pointer attachment/detachment
      behavior for array section list-items in map clauses, and ordering of
      map clauses according to map kind.
      
      2020-11-10  Chung-Lin Tang  <cltang@codesourcery.com>
      
      gcc/c-family/ChangeLog:
      
      	* c-common.h (c_omp_adjust_map_clauses): New declaration.
      	* c-omp.c (struct map_clause): Helper type for c_omp_adjust_map_clauses.
      	(c_omp_adjust_map_clauses): New function.
      
      gcc/c/ChangeLog:
      
      	* c-parser.c (c_parser_omp_target_data): Add use of
      	new c_omp_adjust_map_clauses function. Add GOMP_MAP_ATTACH_DETACH as
      	handled map clause kind.
      	(c_parser_omp_target_enter_data): Likewise.
      	(c_parser_omp_target_exit_data): Likewise.
      	(c_parser_omp_target): Likewise.
      	* c-typeck.c (handle_omp_array_sections): Adjust COMPONENT_REF case to
      	use GOMP_MAP_ATTACH_DETACH map kind for C_ORT_OMP region type.
      	(c_finish_omp_clauses): Adjust bitmap checks to allow struct decl and
      	same struct field access to co-exist on OpenMP construct.
      
      gcc/cp/ChangeLog:
      
      	* parser.c (cp_parser_omp_target_data): Add use of
      	new c_omp_adjust_map_clauses function. Add GOMP_MAP_ATTACH_DETACH as
      	handled map clause kind.
      	(cp_parser_omp_target_enter_data): Likewise.
      	(cp_parser_omp_target_exit_data): Likewise.
      	(cp_parser_omp_target): Likewise.
      	* semantics.c (handle_omp_array_sections): Adjust COMPONENT_REF case to
      	use GOMP_MAP_ATTACH_DETACH map kind for C_ORT_OMP region type. Fix
      	interaction between reference case and attach/detach.
      	(finish_omp_clauses): Adjust bitmap checks to allow struct decl and
      	same struct field access to co-exist on OpenMP construct.
      
      gcc/ChangeLog:
      
      	* gimplify.c (is_or_contains_p): New static helper function.
      	(omp_target_reorder_clauses): New function.
      	(gimplify_scan_omp_clauses): Add use of omp_target_reorder_clauses to
      	reorder clause list according to OpenMP 5.0 rules. Add handling of
      	GOMP_MAP_ATTACH_DETACH for OpenMP cases.
      	* omp-low.c (is_omp_target): New static helper function.
      	(scan_sharing_clauses): Add scan phase handling of GOMP_MAP_ATTACH/DETACH
      	for OpenMP cases.
      	(lower_omp_target): Add lowering handling of GOMP_MAP_ATTACH/DETACH for
      	OpenMP cases.
      
      gcc/testsuite/ChangeLog:
      
      	* c-c++-common/gomp/clauses-2.c: Remove dg-error cases now valid.
      	* gfortran.dg/gomp/map-2.f90: Likewise.
      	* c-c++-common/gomp/map-5.c: New testcase.
      
      libgomp/ChangeLog:
      
      	* libgomp.h (enum gomp_map_vars_kind): Adjust enum values to be bit-flag
      	usable.
      	* oacc-mem.c (acc_map_data): Adjust gomp_map_vars argument flags to
      	'GOMP_MAP_VARS_OPENACC | GOMP_MAP_VARS_ENTER_DATA'.
      	(goacc_enter_datum): Likewise for call to gomp_map_vars_async.
      	(goacc_enter_data_internal): Likewise.
      	* target.c (gomp_map_vars_internal):
      	Change checks of GOMP_MAP_VARS_ENTER_DATA to use bit-and (&). Adjust use
      	of gomp_attach_pointer for OpenMP cases.
      	(gomp_exit_data): Add handling of GOMP_MAP_DETACH.
      	(GOMP_target_enter_exit_data): Add handling of GOMP_MAP_ATTACH.
      	* testsuite/libgomp.c-c++-common/ptr-attach-1.c: New testcase.
      9e628024
    • Ilya Leoshkevich's avatar
      IBM Z: Test long doubles in vector registers · cba3d03d
      Ilya Leoshkevich authored
      gcc/testsuite/ChangeLog:
      
      2020-11-05  Ilya Leoshkevich  <iii@linux.ibm.com>
      
      	* gcc.target/s390/vector/long-double-callee-abi-scan.c: New test.
      	* gcc.target/s390/vector/long-double-caller-abi-run.c: New test.
      	* gcc.target/s390/vector/long-double-caller-abi-scan.c: New test.
      	* gcc.target/s390/vector/long-double-copysign.c: New test.
      	* gcc.target/s390/vector/long-double-fprx2-constant.c: New test.
      	* gcc.target/s390/vector/long-double-from-double.c: New test.
      	* gcc.target/s390/vector/long-double-from-float.c: New test.
      	* gcc.target/s390/vector/long-double-from-i16.c: New test.
      	* gcc.target/s390/vector/long-double-from-i32.c: New test.
      	* gcc.target/s390/vector/long-double-from-i64.c: New test.
      	* gcc.target/s390/vector/long-double-from-i8.c: New test.
      	* gcc.target/s390/vector/long-double-from-u16.c: New test.
      	* gcc.target/s390/vector/long-double-from-u32.c: New test.
      	* gcc.target/s390/vector/long-double-from-u64.c: New test.
      	* gcc.target/s390/vector/long-double-from-u8.c: New test.
      	* gcc.target/s390/vector/long-double-to-double.c: New test.
      	* gcc.target/s390/vector/long-double-to-float.c: New test.
      	* gcc.target/s390/vector/long-double-to-i16.c: New test.
      	* gcc.target/s390/vector/long-double-to-i32.c: New test.
      	* gcc.target/s390/vector/long-double-to-i64.c: New test.
      	* gcc.target/s390/vector/long-double-to-i8.c: New test.
      	* gcc.target/s390/vector/long-double-to-u16.c: New test.
      	* gcc.target/s390/vector/long-double-to-u32.c: New test.
      	* gcc.target/s390/vector/long-double-to-u64.c: New test.
      	* gcc.target/s390/vector/long-double-to-u8.c: New test.
      	* gcc.target/s390/vector/long-double-vec-duplicate.c: New test.
      	* gcc.target/s390/vector/long-double-wf.h: New test.
      	* gcc.target/s390/vector/long-double-wfaxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfcxb-0001.c: New test.
      	* gcc.target/s390/vector/long-double-wfcxb-0111.c: New test.
      	* gcc.target/s390/vector/long-double-wfcxb-1011.c: New test.
      	* gcc.target/s390/vector/long-double-wfcxb-1101.c: New test.
      	* gcc.target/s390/vector/long-double-wfdxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfixb.c: New test.
      	* gcc.target/s390/vector/long-double-wfkxb-0111.c: New test.
      	* gcc.target/s390/vector/long-double-wfkxb-1011.c: New test.
      	* gcc.target/s390/vector/long-double-wfkxb-1101.c: New test.
      	* gcc.target/s390/vector/long-double-wflcxb.c: New test.
      	* gcc.target/s390/vector/long-double-wflpxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfmaxb-2.c: New test.
      	* gcc.target/s390/vector/long-double-wfmaxb-3.c: New test.
      	* gcc.target/s390/vector/long-double-wfmaxb-disabled.c: New test.
      	* gcc.target/s390/vector/long-double-wfmaxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfmsxb-disabled.c: New test.
      	* gcc.target/s390/vector/long-double-wfmsxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfmxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfnmaxb-disabled.c: New test.
      	* gcc.target/s390/vector/long-double-wfnmaxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfnmsxb-disabled.c: New test.
      	* gcc.target/s390/vector/long-double-wfnmsxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfsqxb.c: New test.
      	* gcc.target/s390/vector/long-double-wfsxb-1.c: New test.
      	* gcc.target/s390/vector/long-double-wfsxb.c: New test.
      	* gcc.target/s390/vector/long-double-wftcixb-1.c: New test.
      	* gcc.target/s390/vector/long-double-wftcixb.c: New test.
      cba3d03d
    • Ilya Leoshkevich's avatar
      IBM Z: Store long doubles in vector registers when possible · e627cda5
      Ilya Leoshkevich authored
      On z14+, there are instructions for working with 128-bit floats (long
      doubles) in vector registers.  It's beneficial to use them instead of
      instructions that operate on floating point register pairs, because it
      allows to store 4 times more data in registers at a time, relieving
      register pressure.  The raw performance of the new instructions is
      almost the same as that of the new ones.
      
      Implement by storing TFmode values in vector registers on z14+.  Since
      not all operations are available with the new instructions, keep the
      old ones available using the new FPRX2 mode, and convert between it and
      TFmode when necessary (this is called "forwarder" expanders below).
      Change the existing TFmode expanders to call either new- or old-style
      ones depending on whether we are on z14+ or older machines
      ("dispatcher" expanders).
      
      gcc/ChangeLog:
      
      2020-11-03  Ilya Leoshkevich  <iii@linux.ibm.com>
      
      	* config/s390/s390-modes.def (FPRX2): New mode.
      	* config/s390/s390-protos.h (s390_fma_allowed_p): New function.
      	* config/s390/s390.c (s390_fma_allowed_p): Likewise.
      	(s390_build_signbit_mask): Support 128-bit masks.
      	(print_operand): Support printing the second word of a TFmode
      	operand as vector register.
      	(constant_modes): Add FPRX2mode.
      	(s390_class_max_nregs): Return 1 for TFmode on z14+.
      	(s390_is_fpr128): New function.
      	(s390_is_vr128): Likewise.
      	(s390_can_change_mode_class): Use s390_is_fpr128 and
      	s390_is_vr128 in order to determine whether mode refers to a FPR
      	pair or to a VR.
      	(s390_emit_compare): Force TFmode operands into registers on
      	z14+.
      	* config/s390/s390.h (HAVE_TF): New macro.
      	(EXPAND_MOVTF): New macro.
      	(EXPAND_TF): Likewise.
      	* config/s390/s390.md (PFPO_OP_TYPE_FPRX2): PFPO_OP_TYPE_TF
      	alias.
      	(ALL): Add FPRX2.
      	(FP_ALL): Add FPRX2 for z14+, restrict TFmode to z13-.
      	(FP): Likewise.
      	(FP_ANYTF): New mode iterator.
      	(BFP): Add FPRX2 for z14+, restrict TFmode to z13-.
      	(TD_TF): Likewise.
      	(xde): Add FPRX2.
      	(nBFP): Likewise.
      	(nDFP): Likewise.
      	(DSF): Likewise.
      	(DFDI): Likewise.
      	(SFSI): Likewise.
      	(DF): Likewise.
      	(SF): Likewise.
      	(fT0): Likewise.
      	(bt): Likewise.
      	(_d): Likewise.
      	(HALF_TMODE): Likewise.
      	(tf_fpr): New mode_attr.
      	(type): New mode_attr.
      	(*cmp<mode>_ccz_0): Use type instead of mode with fsimp.
      	(*cmp<mode>_ccs_0_fastmath): Likewise.
      	(*cmptf_ccs): New pattern for wfcxb.
      	(*cmptf_ccsfps): New pattern for wfkxb.
      	(mov<mode>): Rename to mov<mode><tf_fpr>.
      	(signbit<mode>2): Rename to signbit<mode>2<tf_fpr>.
      	(isinf<mode>2): Renamed to isinf<mode>2<tf_fpr>.
      	(*TDC_insn_<mode>): Use type instead of mode with fsimp.
      	(fixuns_trunc<FP:mode><GPR:mode>2): Rename to
      	fixuns_trunc<FP:mode><GPR:mode>2<FP:tf_fpr>.
      	(fix_trunctf<mode>2): Rename to fix_trunctf<mode>2_fpr.
      	(floatdi<mode>2): Rename to floatdi<mode>2<tf_fpr>, use type
      	instead of mode with itof.
      	(floatsi<mode>2): Rename to floatsi<mode>2<tf_fpr>, use type
      	instead of mode with itof.
      	(*floatuns<GPR:mode><FP:mode>2): Use type instead of mode for
      	itof.
      	(floatuns<GPR:mode><FP:mode>2): Rename to
      	floatuns<GPR:mode><FP:mode>2<tf_fpr>.
      	(trunctf<mode>2): Rename to trunctf<mode>2_fpr, use type instead
      	of mode with fsimp.
      	(extend<DSF:mode><BFP:mode>2): Rename to
      	extend<DSF:mode><BFP:mode>2<BFP:tf_fpr>.
      	(<FPINT:fpint_name><BFP:mode>2): Rename to
      	<FPINT:fpint_name><BFP:mode>2<BFP:tf_fpr>, use type instead of
      	mode with fsimp.
      	(rint<BFP:mode>2): Rename to rint<BFP:mode>2<BFP:tf_fpr>, use
      	type instead of mode with fsimp.
      	(<FPINT:fpint_name><DFP:mode>2): Use type instead of mode for
      	fsimp.
      	(rint<DFP:mode>2): Likewise.
      	(trunc<BFP:mode><DFP_ALL:mode>2): Rename to
      	trunc<BFP:mode><DFP_ALL:mode>2<BFP:tf_fpr>.
      	(trunc<DFP_ALL:mode><BFP:mode>2): Rename to
      	trunc<DFP_ALL:mode><BFP:mode>2<BFP:tf_fpr>.
      	(extend<BFP:mode><DFP_ALL:mode>2): Rename to
      	extend<BFP:mode><DFP_ALL:mode>2<BFP:tf_fpr>.
      	(extend<DFP_ALL:mode><BFP:mode>2): Rename to
      	extend<DFP_ALL:mode><BFP:mode>2<BFP:tf_fpr>.
      	(add<mode>3): Rename to add<mode>3<tf_fpr>, use type instead of
      	mode with fsimp.
      	(*add<mode>3_cc): Use type instead of mode with fsimp.
      	(*add<mode>3_cconly): Likewise.
      	(sub<mode>3): Rename to sub<mode>3<tf_fpr>, use type instead of
      	mode with fsimp.
      	(*sub<mode>3_cc): Use type instead of mode with fsimp.
      	(*sub<mode>3_cconly): Likewise.
      	(mul<mode>3): Rename to mul<mode>3<tf_fpr>, use type instead of
      	mode with fsimp.
      	(fma<mode>4): Restrict using s390_fma_allowed_p.
      	(fms<mode>4): Restrict using s390_fma_allowed_p.
      	(div<mode>3): Rename to div<mode>3<tf_fpr>, use type instead of
      	mode with fdiv.
      	(neg<mode>2): Rename to neg<mode>2<tf_fpr>.
      	(*neg<mode>2_cc): Use type instead of mode with fsimp.
      	(*neg<mode>2_cconly): Likewise.
      	(*neg<mode>2_nocc): Likewise.
      	(*neg<mode>2): Likeiwse.
      	(abs<mode>2): Rename to abs<mode>2<tf_fpr>, use type instead of
      	mode with fdiv.
      	(*abs<mode>2_cc): Use type instead of mode with fsimp.
      	(*abs<mode>2_cconly): Likewise.
      	(*abs<mode>2_nocc): Likewise.
      	(*abs<mode>2): Likewise.
      	(*negabs<mode>2_cc): Likewise.
      	(*negabs<mode>2_cconly): Likewise.
      	(*negabs<mode>2_nocc): Likewise.
      	(*negabs<mode>2): Likewise.
      	(sqrt<mode>2): Rename to sqrt<mode>2<tf_fpr>, use type instead
      	of mode with fsqrt.
      	(cbranch<mode>4): Use FP_ANYTF instead of FP.
      	(copysign<mode>3): Rename to copysign<mode>3<tf_fpr>, use type
      	instead of mode with fsimp.
      	* config/s390/s390.opt (flag_vx_long_double_fma): New
      	undocumented option.
      	* config/s390/vector.md (V_HW): Add TF for z14+.
      	(V_HW2): Likewise.
      	(VFT): Likewise.
      	(VF_HW): Likewise.
      	(V_128): Likewise.
      	(tf_vr): New mode_attr.
      	(tointvec): Add TF.
      	(mov<mode>): Rename to mov<mode><tf_vr>.
      	(movetf): New dispatcher.
      	(*vec_tf_to_v1tf): Rename to *vec_tf_to_v1tf_fpr, restrict to
      	z13-.
      	(*vec_tf_to_v1tf_vr): New pattern for z14+.
      	(*fprx2_to_tf): Likewise.
      	(*mov_tf_to_fprx2_0): Likewise.
      	(*mov_tf_to_fprx2_1): Likewise.
      	(add<mode>3): Rename to add<mode>3<tf_vr>.
      	(addtf3): New dispatcher.
      	(sub<mode>3): Rename to sub<mode>3<tf_vr>.
      	(subtf3): New dispatcher.
      	(mul<mode>3): Rename to mul<mode>3<tf_vr>.
      	(multf3): New dispatcher.
      	(div<mode>3): Rename to div<mode>3<tf_vr>.
      	(divtf3): New dispatcher.
      	(sqrt<mode>2): Rename to sqrt<mode>2<tf_vr>.
      	(sqrttf2): New dispatcher.
      	(fma<mode>4): Restrict using s390_fma_allowed_p.
      	(fms<mode>4): Likewise.
      	(neg_fma<mode>4): Likewise.
      	(neg_fms<mode>4): Likewise.
      	(neg<mode>2): Rename to neg<mode>2<tf_vr>.
      	(negtf2): New dispatcher.
      	(abs<mode>2): Rename to abs<mode>2<tf_vr>.
      	(abstf2): New dispatcher.
      	(float<mode>tf2_vr): New forwarder.
      	(float<mode>tf2): New dispatcher.
      	(floatuns<mode>tf2_vr): New forwarder.
      	(floatuns<mode>tf2): New dispatcher.
      	(fix_trunctf<mode>2_vr): New forwarder.
      	(fix_trunctf<mode>2): New dispatcher.
      	(fixuns_trunctf<mode>2_vr): New forwarder.
      	(fixuns_trunctf<mode>2): New dispatcher.
      	(<FPINT:fpint_name><VF_HW:mode>2<VF_HW:tf_vr>): New pattern.
      	(<FPINT:fpint_name>tf2): New forwarder.
      	(rint<mode>2<tf_vr>): New pattern.
      	(rinttf2): New forwarder.
      	(*trunctfdf2_vr): New pattern.
      	(trunctfdf2_vr): New forwarder.
      	(trunctfdf2): New dispatcher.
      	(trunctfsf2_vr): New forwarder.
      	(trunctfsf2): New dispatcher.
      	(extenddftf2_vr): New pattern.
      	(extenddftf2): New dispatcher.
      	(extendsftf2_vr): New forwarder.
      	(extendsftf2): New dispatcher.
      	(signbittf2_vr): New forwarder.
      	(signbittf2): New dispatchers.
      	(isinftf2_vr): New forwarder.
      	(isinftf2): New dispatcher.
      	* config/s390/vx-builtins.md (*vftci<mode>_cconly): Use VF_HW
      	instead of VECF_HW, add missing constraint, add vw support.
      	(vftci<mode>_intcconly): Use VF_HW instead of VECF_HW.
      	(*vftci<mode>): Rename to vftci<mode>, use VF_HW instead of
      	VECF_HW, and vw support.
      	(vftci<mode>_intcc): Use VF_HW instead of VECF_HW.
      e627cda5
    • Eric Botcazou's avatar
      Fix wrong code for boolean negation in condition at -O2 · 61dd8dab
      Eric Botcazou authored
      The problem is the bitwise/logical dichotomy for operators and the
      transition from the former to the latter for boolean types: if they
      are 1-bit, that's straightforward but, if they are larger, then you
      need to be careful because you cannot, on the one hand, turn a bitwise
      AND into a logical AND and, on the other hand, *not* turn e.g. a
      bitwise NOT into a logical NOT if they occur in the same computation,
      as the first change will drop the masking that may need to be applied
      after the bitwise NOT if it is not also changed.
      
      Given that the ranger turns bitwise AND/OR into logical AND/OR for
      booleans,  the patch does the same for bitwise NOT.
      
      gcc/ChangeLog:
      	* range-op.cc (operator_logical_not::fold_range): Tidy up.
      	(operator_logical_not::op1_range): Call above method.
      	(operator_bitwise_not::fold_range): If the type is compatible
      	with boolean, call op_logical_not.fold_range.
      	(operator_bitwise_not::op1_range): If the type is compatible
      	with boolean, call op_logical_not.op1_range.
      
      gcc/testsuite/ChangeLog:
      	* gnat.dg/opt88.adb: New test.
      61dd8dab
    • Richard Biener's avatar
      More PRE TLC · 15e5f41a
      Richard Biener authored
      This makes get_expr_value_id cheap and completes the
      constant value-id simplification by turning the constant_value_expressions
      into a direct map instead of a set of pre_exprs for the value.
      
      2020-11-10  Richard Biener  <rguenther@suse.de>
      
      	* tree-ssa-pre.c (pre_expr_d::value_id): Add.
      	(constant_value_expressions): Turn into an array of pre_expr.
      	(get_or_alloc_expr_for_nary): New function.
      	(get_or_alloc_expr_for_reference): Likewise.
      	(add_to_value): For constant values only ever add a single
      	CONSTANT.
      	(get_expr_value_id): Return the new value_id member.
      	(vn_valnum_from_value_id): Split out and simplify constant
      	value id handling.
      	(get_or_alloc_expr_for_constant): Set the value_id member.
      	(phi_translate_1): Use get_or_alloc_expr_for_*.
      	(compute_avail): Likewise.
      	(bitmap_find_leader): Simplify constant value id handling.
      15e5f41a
    • David Candler's avatar
      aarch64: Skip arm targets in vq*shr*n_high_n intrinsic tests · 9693749b
      David Candler authored
      These tests should be skipped for arm targets as the instrinsics
      are only supported on aarch64.
      
      gcc/testsuite/ChangeLog
      
      2020-11-10  David Candler  <david.candler@arm.com>
      
      	* gcc.target/aarch64/advsimd-intrinsics/vqrshrn_high_n.c: Added skip
      	directive.
      	* gcc.target/aarch64/advsimd-intrinsics/vqrshrun_high_n.c: Likewise.
      	* gcc.target/aarch64/advsimd-intrinsics/vqshrn_high_n.c: Likewise.
      	* gcc.target/aarch64/advsimd-intrinsics/vqshrun_high_n.c: Likewise.
      9693749b
    • Alex Coplan's avatar
      doc: Fix grammar in description of earlyclobber · 61fecd4d
      Alex Coplan authored
      gcc/ChangeLog:
      
      	* doc/md.texi (Modifiers): Fix grammar in description of
      	earlyclobber constraint modifier.
      61fecd4d
    • Jakub Jelinek's avatar
      sccvn: Fix up push_partial_def little-endian bitfield handling [PR97764] · c69325a5
      Jakub Jelinek authored
      This patch fixes a thinko in the left-endian push_partial_def path.
      As the testcase shows, we have 3 bitfields in the struct,
      bitoff  bitsize
      0       3
      3       28
      31      1
      the corresponding read is the byte at offset 3 (i.e. 24 bits)
      and push_partial_def first handles the full store ({}) to all bits
      and then is processing the store to the middle bitfield with value of -1.
      Here are the interesting spots:
        pd.offset -= offseti;
      this adjusts the pd to { -21, 28 }, the (for little-endian lowest) 21
      bits aren't interesting to us, we only care about the upper 7.
                len = native_encode_expr (pd.rhs, this_buffer, bufsize,
                                          MAX (0, -pd.offset) / BITS_PER_UNIT);
      native_encode_expr has the offset parameter in bytes and we tell it
      that we aren't interested in the first (lowest) two bytes of the number.
      It encodes 0xff, 0xff with len == 2 then.
            HOST_WIDE_INT size = pd.size;
            if (pd.offset < 0)
              size -= ROUND_DOWN (-pd.offset, BITS_PER_UNIT);
      we get 28 - 16, i.e. 12 - the 16 is subtracting those 2 bytes that we
      omitted in native_encode_expr.
                size = MIN (size, (HOST_WIDE_INT) needed_len * BITS_PER_UNIT);
      needed_len is how many bytes the read at most needs, and that is 1,
      so we get size 8 and copy all 8 bits (i.e. a single byte plus nothing)
      from the native_encode_expr filled this_buffer; this incorrectly sets
      the byte to 0xff when we want 0x7f.  The above line is correct for the
      pd.offset >= 0 case when we don't skip anything, but for the pd.offset < 0
      case we need to subtract also the remainder of the bits we aren't interested
      in (the code shifts the bytes by that number of bits).
      If it weren't for the big-endian path, we could as well do
            if (pd.offset < 0)
              size += pd.offset;
      but the big-endian path needs it differently.
      With the following patch, amnt is 3 and we subtract from 12 the (8 - 3)
      bits and thus get the 7 which is the value we want.
      
      2020-11-10  Jakub Jelinek  <jakub@redhat.com>
      
      	PR tree-optimization/97764
      	* tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): For
      	little-endian stores with negative pd.offset, subtract
      	BITS_PER_UNIT - amnt from size if amnt is non-zero.
      
      	* gcc.c-torture/execute/pr97764.c: New test.
      c69325a5
    • Tobias Burnus's avatar
      Fortran: Fix function decl's location [PR95847] · 2d595931
      Tobias Burnus authored
      gcc/fortran/ChangeLog:
      
      	PR fortran/95847
      	* trans-decl.c (gfc_get_symbol_decl): Do not (re)set the location
      	of an external procedure.
      	(build_entry_thunks, generate_coarray_init, create_main_function,
      	gfc_generate_function_code): Use fndecl's location in BIND_EXPR.
      
      gcc/testsuite/ChangeLog:
      
      	PR fortran/95847
      	* gfortran.dg/coverage.f90: New test.
      2d595931
    • Richard Biener's avatar
      tree-optimization/97760 - reduction paths with unhandled live stmt · 2686de56
      Richard Biener authored
      This makes sure we reject reduction paths with a live stmt that
      is not the last one altering the value.  This is because we do not
      handle this in the epilogue unless there's a scalar epilogue loop.
      
      2020-11-09  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/97760
      	* tree-vect-loop.c (check_reduction_path): Reject
      	reduction paths we do not handle in epilogue generation.
      
      	* gcc.dg/vect/pr97760.c: New testcase.
      2686de56
    • Aldy Hernandez's avatar
      Normalize VARYING for -fstrict-enums. · 3d3470e2
      Aldy Hernandez authored
      The problem here is that the representation for VARYING in
      -fstrict-enums is different between value_range and irange.
      
      The helper function irange::normalize_min_max() will normalize to
      VARYING only if setting the range to the entire domain of the
      underlying type.  That is, [0, 0xff..ff], not the domain as defined by
      -fstrict-enums.  This causes problems because the multi-range version
      of varying_p() will return true if the range is the domain as defined
      by -fstrict-enums.  Thus, normalize_min_max and varying_p have
      different concepts of varying for multi-ranges.
      
      (BTW, legacy ranges are different because they never look at the
      extremes of a range to determine varying-ness.  They only look at the
      kind field.)
      
      One approach is to change all the code to limit ranges to the domain
      in the -fstrict-enums world, but this won't work because there are
      various instances of gimple where the values assigned or compared are
      beyond the limits of TYPE_{MIN,MAX}_VALUE.  One example is the
      addition of 0xffffffff to represent subtraction.
      
      This patch fixes multi-range varying_p() and set_varying() to agree
      with the normalization code, using the extremes of the underlying type,
      to represent varying.
      
      gcc/ChangeLog:
      
      	PR tree-optimization/97767
      	* value-range.cc (dump_bound_with_infinite_markers): Use
      	wi::min_value and wi::max_value.
      	(range_tests_strict_enum): New.
      	(range_tests): Call range_tests_strict_enum.
      	* value-range.h (irange::varying_p): Use wi::min_value
      	and wi::max_value.
      	(irange::set_varying): Same.
      	(irange::normalize_min_max): Remove comment.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/opt/pr97767.C: New test.
      3d3470e2
    • hongyuw1's avatar
      Adjust Keylocker regex pattern for darwin, and add missing aesenc256kl test. · fb54c303
      hongyuw1 authored
      gcc/testsuite/ChangeLog
      
      	* gcc.target/i386/keylocker-aesdec128kl.c: Adjust regex patterns.
      	* gcc.target/i386/keylocker-aesdec256kl.c: Likewise.
      	* gcc.target/i386/keylocker-aesdecwide128kl.c: Likewise.
      	* gcc.target/i386/keylocker-aesdecwide256kl.c: Likewise.
      	* gcc.target/i386/keylocker-aesenc128kl.c: Likewise.
      	* gcc.target/i386/keylocker-aesencwide128kl.c: Likewise.
      	* gcc.target/i386/keylocker-aesencwide256kl.c: Likewise.
      	* gcc.target/i386/keylocker-encodekey128.c: Likewise.
      	* gcc.target/i386/keylocker-encodekey256.c: Likewise.
      	* gcc.target/i386/keylocker-aesenc256kl.c: New test.
      fb54c303
    • Andrew MacLeod's avatar
      Fix logical_combine OR operation. Again. · 7d26a337
      Andrew MacLeod authored
      The original fix was incorrect and results in loss of opportunities.
      Revert the original fix. When processing logical chains, do not
      follow chains outside of the current basic block.  Use the import
      value instead.
      
      	gcc/
      	PR tree-optimization/97567
      	* gimple-range-gori.cc: (gori_compute::logical_combine): False
      	OR operations should intersect the 2 results.
      	(gori_compute::compute_logical_operands_in_chain): If def chains
      	are outside the current basic block, don't follow them.
      	gcc/testsuite/
      	* gcc.dg/pr97567-2.c: New.
      7d26a337
    • GCC Administrator's avatar
      Daily bump. · 2bee28dd
      GCC Administrator authored
      2bee28dd
  3. Nov 09, 2020
    • Marek Polacek's avatar
      c++: DR 1914 - Allow duplicate standard attributes. · 04126e46
      Marek Polacek authored
      Following Joseph's change for C to allow duplicate C2x standard attributes
      <https://gcc.gnu.org/pipermail/gcc-patches/2020-October/557272.html>,
      this patch does a similar thing for C++.  This is DR 1914, to be resolved by
      <wg21.link/p2156>, which is not part of the standard yet, but has wide
      support so looks like a shoo-in.  The duplications now produce warnings
      instead, but only if the attribute wasn't specified via a macro.
      
      gcc/c-family/ChangeLog:
      
      	DR 1914
      	* c-common.c (attribute_fallthrough_p): Tweak the warning
      	message.
      
      gcc/cp/ChangeLog:
      
      	DR 1914
      	* parser.c (cp_parser_check_std_attribute): Return bool.  Add a
      	location_t parameter.  Return true if the attribute wasn't duplicated.
      	Give a warning instead of an error.  Check more attributes.
      	(cp_parser_std_attribute_list): Don't add duplicated attributes to
      	the list.  Pass location to cp_parser_check_std_attribute.
      
      gcc/testsuite/ChangeLog:
      
      	DR 1914
      	* c-c++-common/attr-fallthrough-2.c: Adjust dg-warning.
      	* g++.dg/cpp0x/fallthrough2.C: Likewise.
      	* g++.dg/cpp0x/gen-attrs-60.C: Turn dg-error into dg-warning.
      	* g++.dg/cpp1y/attr-deprecated-2.C: Likewise.
      	* g++.dg/cpp2a/attr-likely2.C: Adjust dg-warning.
      	* g++.dg/cpp2a/nodiscard-once.C: Turn dg-error into dg-warning.
      	* g++.dg/cpp0x/gen-attrs-72.C: New test.
      04126e46
    • Patrick Palka's avatar
      c++: Consider only relevant template arguments in sat_hasher · d3fd75d8
      Patrick Palka authored
      A large source of cache misses in satisfy_atom is caused by the identity
      of an (atom,args) pair within the satisfaction cache being determined by
      the entire set of supplied template arguments rather than by the subset
      of template arguments that the atom actually depends on.  For instance,
      consider
      
        template <class T> concept range = range_v<T>;
        template <class U> void foo () requires range<U>;
        template <class U, class V> void bar () requires range<U>;
      
      The associated constraints of foo and bar are equivalent: they both
      consist of the atom range_v<T> (with mapping T -> U).  But the sat_cache
      currently will never reuse a satisfaction value between the two atoms
      because foo has one template parameter and bar has two, and the
      satisfaction cache conservatively assumes that all template parameters
      of the constrained decl are relevant to a satisfaction value of one of
      its atoms.
      
      This patch eliminates this assumption and makes the sat_cache instead
      care about just the subset of args of an (atom,args) pair that is
      relevant to satisfaction.
      
      This patch additionally fixes a seemingly latent bug that was found when
      testing against range-v3.  In the testcase concepts-decltype2.C below,
      during normalization of f's constraints we end up forming a TARGET_EXPR
      whose _SLOT has a DECL_CONTEXT that points to g instead of f because
      current_function_decl is not updated before we start normalizing.
      This patch fixes this accordingly, and also adds a sanity check to
      keep_template_parm to verify each found parameter has a valid index.
      
      With this patch, compile time and memory usage for the cmcstl2 test
      test/algorithm/set_symmetric_difference4.cpp drops from 8.5s/1.2GB to
      3.5s/0.4GB.
      
      gcc/cp/ChangeLog:
      
      	* constraint.cc (norm_info::norm_info): Initialize orig_decl.
      	(norm_info::orig_decl): New data member.
      	(normalize_atom): When caching an atom for the first time,
      	compute a list of template parameters used in the targets of the
      	parameter mapping and store it in the TREE_TYPE of the mapping.
      	(get_normalized_constraints_from_decl): Set current_function_decl
      	appropriately when normalizing.  As an optimization, don't
      	set up a push_nested_class_guard when decl has no constraints.
      	(sat_hasher::hash): Use this list to hash only the template
      	arguments that are relevant to the atom.
      	(satisfy_atom): Use this list to compare only the template
      	arguments that are relevant to the atom.
      	* pt.c (keep_template_parm): Do a sanity check on the parameter's
      	index when flag_checking.
      d3fd75d8
    • Patrick Palka's avatar
      c++: Use two levels of caching in satisfy_atom · 3d56e969
      Patrick Palka authored
      This improves the effectiveness of caching in satisfy_atom by querying
      the cache again after we've instantiated the atom's parameter mapping.
      
      Before instantiating its mapping, the identity of an (atom,args) pair
      within the satisfaction cache is determined by idiosyncratic things like
      the level and index of each template parameter used in targets of the
      parameter mapping.  For example, the associated constraints of foo in
      
        template <class T> concept range = range_v<T>;
        template <class U, class V> void foo () requires range<U> && range<V>;
      
      are range_v<T> (with mapping T -> U) /\ range_v<T> (with mapping T -> V).
      If during satisfaction the template arguments supplied for U and V are
      the same, then the satisfaction value of these two atoms will be the
      same (despite their uninstantiated parameter mappings being different).
      
      But sat_cache doesn't see this because it compares the uninstantiated
      parameter mapping and the supplied template arguments of sat_entry's
      independently.  So satisy_atom on this latter atom will end up fully
      evaluating it instead of reusing the satisfaction value of the former.
      
      But there is a point when the two atoms do look the same to sat_cache,
      and that's after instantiating their parameter mappings.  By querying
      the cache again at this point, we can avoid substituting the same
      instantiated parameter mapping into the same expression a second time
      around.
      
      With this patch, compile time and memory usage for the cmcstl2 test
      test/algorithm/set_symmetric_diference4.cpp drops from 11s/1.4GB to
      8.5s/1.2GB with an --enable-checking=release compiler.
      
      gcc/cp/ChangeLog:
      
      	* cp-tree.h (ATOMIC_CONSTR_MAP_INSTANTIATED_P): Define this flag
      	for ATOMIC_CONSTRs.
      	* constraint.cc (sat_hasher::hash): Use hash_atomic_constraint
      	if the flag is set, otherwise keep using a pointer hash.
      	(sat_hasher::equal): Return false if the flag's setting differs
      	on two atoms.  Call atomic_constraints_identical_p if the flag
      	is set, otherwise keep using a pointer equality test.
      	(satisfy_atom): After instantiating the parameter mapping, form
      	another ATOMIC_CONSTR using the instantiated mapping and query
      	the cache again.  Cache the satisfaction value of both atoms.
      	(diagnose_atomic_constraint): Simplify now that the supplied
      	atom has an instantiated mapping.
      3d56e969
    • Patrick Palka's avatar
      c++: Reuse identical ATOMIC_CONSTRs during normalization · 2096ebd3
      Patrick Palka authored
      Profiling revealed that sat_hasher::equal accounts for nearly 40% of
      compile time in some cmcstl2 tests.
      
      This patch eliminates this bottleneck by caching the ATOMIC_CONSTRs
      returned by normalize_atom.  This in turn allows us to replace the
      expensive atomic_constraints_identical_p check in sat_hasher::equal
      with cheap pointer equality, with no loss in cache hit rate.
      
      With this patch, compile time for the cmcstl2 test
      test/algorithm/set_symmetric_difference4.cpp drops from 19s to 11s with
      an --enable-checking=release compiler.
      
      gcc/cp/ChangeLog:
      
      	* constraint.cc (atom_cache): Define this deletable hash_table.
      	(normalize_atom): Use it to cache ATOMIC_CONSTRs when not
      	generating diagnostics.
      	(sat_hasher::hash): Use htab_hash_pointer instead of
      	hash_atomic_constraint.
      	(sat_hasher::equal): Test for pointer equality instead of
      	atomic_constraints_identical_p.
      	* cp-tree.h (struct atom_hasher): Moved and renamed from ...
      	* logic.cc (struct constraint_hash): ... here.
      	(clause::m_set): Adjust accordingly.
      2096ebd3
    • Patrick Palka's avatar
      c++: Fix ICE with variadic concepts and aliases [PR93907] · 71a80407
      Patrick Palka authored
      This patch (naively) extends the PR93907 fix to also apply to variadic
      concepts invoked with a type argument pack.  Without this, we ICE on
      the below testcase (a variadic version of concepts-using2.C) in the same
      manner as we used to on concepts-using2.C before r10-7133.
      
      gcc/cp/ChangeLog:
      
      	PR c++/93907
      	* constraint.cc (tsubst_parameter_mapping): Also canonicalize
      	the type arguments of a TYPE_ARGUMENT_PACk.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/93907
      	* g++.dg/cpp2a/concepts-using3.C: New test, based off of
      	concepts-using2.C.
      71a80407
    • Pat Bernardi's avatar
      MAINTAINERS: Add myself for write after approval · 32ff3309
      Pat Bernardi authored
      2020-11-09  Pat Bernardi  <bernardi@adacore.com>
      
      	* MAINTAINERS (Write After Approval): Add myself.
      32ff3309
Loading