summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* xtensa: Make use of IN_RANGE macro where appropriateTakayuki 'January June' Suwa2022-05-264-16/+15
| | | | | | | | | | | | | | | No functional changes. gcc/ChangeLog: * config/xtensa/constraints.md (M, O): Use the macro. * config/xtensa/predicates.md (addsubx_operand, extui_fldsz_operand, sext_fldsz_operand): Ditto. * config/xtensa/xtensa.cc (xtensa_simm8, xtensa_simm8x256, xtensa_simm12b, xtensa_uimm8, xtensa_uimm8x2, xtensa_uimm8x4, xtensa_mask_immediate, smalloffset_mem_p, printx, xtensa_call_save_reg, xtensa_expand_prologue): Ditto. * config/xtensa/xtensa.h (FUNCTION_ARG_REGNO_P): Ditto.
* xtensa: Simplify EXTUI instruction maskimm validationsTakayuki 'January June' Suwa2022-05-262-22/+4
| | | | | | | | | | No functional changes. gcc/ChangeLog: * config/xtensa/predicates.md (extui_fldsz_operand): Simplify. * config/xtensa/xtensa.cc (xtensa_mask_immediate, print_operand): Ditto.
* libstdc++: Add constexpr to std::counted_iterator post-increment (LWG 3643)Jonathan Wakely2022-05-262-2/+28
| | | | | | | | libstdc++-v3/ChangeLog: * include/bits/stl_iterator.h (counted_iterator::operator++(int)): Add 'constexpr' as per LWG 3643. * testsuite/24_iterators/counted_iterator/lwg3643.cc: New test.
* c++: constrained partial spec forward decl [PR96363]Patrick Palka2022-05-266-24/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Here during cp_parser_single_declaration for #2, we were calling associate_classtype_constraints for TPL<T> (the primary template type) before maybe_process_partial_specialization could get a chance to notice that we're in fact declaring a distinct constrained partial spec and not redeclaring the primary template. This caused us to emit a bogus error about differing constraints b/t the primary template and #2's constraints. This patch fixes this by moving the call to associate_classtype_constraints after the call to shadow_tag (which calls maybe_process_partial_specialization) and adjusting shadow_tag to use the return value of m_p_p_s. Moreover, if we later try to define a constrained partial specialization that's been declared earlier (as in the third testcase), then maybe_new_partial_specialization correctly notices it's a redeclaration and returns NULL_TREE. But in this case we also need to update TYPE to point to the redeclared partial spec (it'll otherwise continue pointing to the primary template type, eventually leading to a bogus error). PR c++/96363 gcc/cp/ChangeLog: * decl.cc (shadow_tag): Use the return value of maybe_process_partial_specialization. * parser.cc (cp_parser_single_declaration): Call shadow_tag before associate_classtype_constraints. * pt.cc (maybe_new_partial_specialization): Change return type to bool. Take 'type' argument by mutable reference. Set 'type' to point to the correct constrained specialization when appropriate. (maybe_process_partial_specialization): Adjust accordingly. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-partial-spec12.C: New test. * g++.dg/cpp2a/concepts-partial-spec12a.C: New test. * g++.dg/cpp2a/concepts-partial-spec13.C: New test.
* libstdc++: Refactor includes for unordered containersJonathan Wakely2022-05-267-22/+24
| | | | | | | | | | | | | | | | | | | | | This moves some #include directives to the relevant place. For example, <bits/hashtable_policy.h> needs <bits/stl_pair.h> so should include it directly instead of relying on <unordered_map> and <unordered_set> to do so first. libstdc++-v3/ChangeLog: * include/bits/functional_hash.h (__is_fast_hash): Add doxygen comment. * include/bits/hashtable.h: Do not include <bits/stl_function.h> here. * include/bits/hashtable_policy.h: Include <bits/stl_pair.h> and <bits/functional_hash.h>. * include/bits/unordered_map.h: Include required headers. * include/bits/unordered_set.h: Likewise. * include/std/unordered_map: Do not include headers for indirect dependencies. * include/std/unordered_set: Likewise.
* libstdc++: Remove some unnecessary includesJonathan Wakely2022-05-263-3/+0
| | | | | | | | | | | | | These headers do not use anything in <bits/stl_iterator_base_types.h> directly, and it's included by <bits/stl_iterator_base_funcs.h> and <bits/stl_iterator.h> anyway, because they do need it. libstdc++-v3/ChangeLog: * include/bits/ranges_algobase.h: Do not include <bits/stl_iterator_base_types.h>. * include/std/string: Likewise. * include/std/variant: Likewise.
* libstdc++: Make headers include their prerequisitesNathan Sidwell2022-05-264-0/+6
| | | | | | | | | | | | | | | | These headers were relying on their includers having already included some prerequisites. That makes them unsuitable to be header-units. So directly include the needed headers. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> libstdc++-v3/ChangeLog: * include/bits/hashtable.h: Include required headers. * include/bits/hashtable_policy.h: Likewise. * include/bits/stl_heap.h: Likewise. * include/bits/stl_iterator_base_funcs.h: Likewise.
* libstdc++: Fix printing of std::span for versioned namespaceFrançois Dumont2022-05-261-2/+2
| | | | | | | libstdc++-v3/ChangeLog: * python/libstdcxx/v6/printers.py (StdSpanPrinter.__init__): Strip typename from version namespace.
* libstdc++: Fix printing of std::atomic<shared_ptr<T>> for versioned namespaceJonathan Wakely2022-05-261-1/+2
| | | | | | | libstdc++-v3/ChangeLog: * python/libstdcxx/v6/printers.py (SharedPointerPrinter): Strip versioned namespace from the template argument too.
* libstdc++: Rename tests like .../wchar_t/1.cc to .../wchar_t.ccJonathan Wakely2022-05-2652-0/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There's no need to have directories containing a single test file, we can rename the files to the directory names and remove the directories. The dejagnu proc that filters out wchar_t tests just checks for "wchar_t" anywhere in the path, so will work just as well on wchar_t.cc or constexpr-wchar_t.cc paths. libstdc++-v3/ChangeLog: * testsuite/21_strings/basic_string/modifiers/pop_back/char/1.cc: Moved to... * testsuite/21_strings/basic_string/modifiers/pop_back/char.cc: ...here. * testsuite/21_strings/basic_string/modifiers/pop_back/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/modifiers/pop_back/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/modifiers/swap/wchar_t/constexpr.cc: Moved to... * testsuite/21_strings/basic_string/modifiers/swap/constexpr-wchar_t.cc: ...here. * testsuite/21_strings/basic_string/modifiers/swap/char/constexpr.cc: Moved to... * testsuite/21_strings/basic_string/modifiers/swap/constexpr.cc: ...here. * testsuite/21_strings/basic_string/operations/contains/char/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/contains/char.cc: ...here. * testsuite/21_strings/basic_string/operations/contains/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/contains/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/operations/data/char/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/data/char.cc: ...here. * testsuite/21_strings/basic_string/operations/data/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/data/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/operations/ends_with/char/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/ends_with/char.cc: ...here. * testsuite/21_strings/basic_string/operations/ends_with/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/ends_with/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/operations/starts_with/char/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/starts_with/char.cc: ...here. * testsuite/21_strings/basic_string/operations/starts_with/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/starts_with/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/operations/substr/char/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/substr/char.cc: ...here. * testsuite/21_strings/basic_string/operations/substr/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/operations/substr/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/range_access/char/1.cc: Moved to... * testsuite/21_strings/basic_string/range_access/char.cc: ...here. * testsuite/21_strings/basic_string/range_access/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/range_access/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/modifiers/remove_prefix/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/modifiers/remove_prefix/char.cc: ...here. * testsuite/21_strings/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/modifiers/remove_prefix/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/modifiers/remove_suffix/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/modifiers/remove_suffix/char.cc: ...here. * testsuite/21_strings/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/modifiers/remove_suffix/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/modifiers/swap/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/modifiers/swap/char.cc: ...here. * testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/operations/contains/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/contains/char.cc: ...here. * testsuite/21_strings/basic_string_view/operations/contains/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/contains/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/operations/data/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/data/char.cc: ...here. * testsuite/21_strings/basic_string_view/operations/data/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/data/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/operations/ends_with/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/ends_with/char.cc: ...here. * testsuite/21_strings/basic_string_view/operations/ends_with/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/ends_with/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/operations/starts_with/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/starts_with/char.cc: ...here. * testsuite/21_strings/basic_string_view/operations/starts_with/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/starts_with/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/operations/substr/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/substr/char.cc: ...here. * testsuite/21_strings/basic_string_view/operations/substr/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/operations/substr/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/range_access/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/range_access/char.cc: ...here. * testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/range_access/wchar_t.cc: ...here. * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char/1.cc: Moved to... * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char.cc: ...here. * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char16_t/1.cc: Moved to... * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char16_t.cc: ...here. * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char32_t/1.cc: Moved to... * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char32_t.cc: ...here. * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char8_t/1.cc: Moved to... * testsuite/21_strings/basic_string/requirements/explicit_instantiation/char8_t.cc: ...here. * testsuite/21_strings/basic_string/requirements/explicit_instantiation/1.cc: Moved to... * testsuite/21_strings/basic_string/requirements/explicit_instantiation/int.cc: ...here. * testsuite/21_strings/basic_string/requirements/explicit_instantiation/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string/requirements/explicit_instantiation/wchar_t.cc: ...here. * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char/1.cc: Moved to... * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char.cc: ...here. * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char16_t.cc: ...here. * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char32_t.cc: ...here. * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char8_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/char8_t.cc: ...here. * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/1.cc: Moved to... * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/int.cc: ...here. * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc: Moved to... * testsuite/21_strings/basic_string_view/requirements/explicit_instantiation/wchar_t.cc: ...here. * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char/1.cc: Moved to... * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char.cc: ...here. * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char16_t/1.cc: Moved to... * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char16_t.cc: ...here. * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char32_t/1.cc: Moved to... * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char32_t.cc: ...here. * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char8_t/1.cc: Moved to... * testsuite/21_strings/char_traits/requirements/explicit_instantiation/char8_t.cc: ...here. * testsuite/21_strings/char_traits/requirements/explicit_instantiation/short/1.cc: Moved to... * testsuite/21_strings/char_traits/requirements/explicit_instantiation/short.cc: ...here. * testsuite/21_strings/char_traits/requirements/explicit_instantiation/wchar_t/1.cc: Moved to... * testsuite/21_strings/char_traits/requirements/explicit_instantiation/wchar_t.cc: ...here.
* libstdc++: Remove redundancy in test pathnamesJonathan Wakely2022-05-263-0/+0
| | | | | | | | | | | | | | | | | Repeating "explicit_instantiation" in these long pathnames is not necessary. libstdc++-v3/ChangeLog: * testsuite/20_util/duration/requirements/explicit_instantiation/explicit_instantiation.cc: Moved to... * testsuite/20_util/duration/requirements/explicit_instantiation.cc: ...here. * testsuite/20_util/time_point/requirements/explicit_instantiation/explicit_instantiation.cc: Moved to... * testsuite/20_util/time_point/requirements/explicit_instantiation.cc: ...here. * testsuite/20_util/unique_ptr/requirements/explicit_instantiation/explicit_instantiation.cc: Moved to... * testsuite/20_util/unique_ptr/requirements/explicit_instantiation.cc: ...here.
* Daily bump.GCC Administrator2022-05-2610-1/+239
|
* c++: fix ICE on invalid attributes [PR96637]Marek Polacek2022-05-254-10/+16
| | | | | | | | | | | | | | | | | | | | When chaining attributes, attr_chainon should be used rather than plain chainon, so that we don't end up with a TREE_LIST where one of the elements is error_mark_node, which causes problems. parser.cc has already been fixed to use attr_chainon, but decl.cc has not. Until now. PR c++/96637 gcc/cp/ChangeLog: * cp-tree.h (attr_chainon): Declare. * decl.cc (start_decl): Use attr_chainon. (grokdeclarator): Likewise. * parser.cc (cp_parser_statement): No longer static. gcc/testsuite/ChangeLog: * g++.dg/parse/error64.C: New test.
* c++: CTAD with alias and nested template [PR105655]Jason Merrill2022-05-252-1/+29
| | | | | | | | | | | | | | | | | | | | Here, alias_ctad_tweaks expect tsubst_decl of a FUNCTION_DECL to return a FUNCTION_DECL. A reasonable expectation, but in this case we were replacing the template args of the class-scope deduction guide with equivalent args, so looking in the hash table we found the partial instantiation stored when instantiating A<int>, which is a TEMPLATE_DECL. It's fine for that to be what is stored, but tsubst_function_decl should never return it. PR c++/105655 gcc/cp/ChangeLog: * pt.cc (build_template_decl): Add assert. (tsubst_function_decl): Don't return a template. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/class-deduction-alias13.C: New test.
* c++: deduction from auto fn [PR105623]Jason Merrill2022-05-253-3/+26
| | | | | | | | | | | | | | | | | | Since my patch for PR90451, we defer mark_used of single functions as late as possible. And since my r12-1273, we keep BASELINK from lookup around rather than reconstruct it later. These both made us try to instantiate g with a function type that still had 'auto' as its return type. PR c++/105623 gcc/cp/ChangeLog: * decl2.cc (mark_used): Copy type from fn to BASELINK. * pt.cc (unify_one_argument): Call mark_single_function. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/auto-fn62.C: New test.
* c++: constexpr returning deallocated ptrJason Merrill2022-05-251-0/+5
| | | | | | | | | | In constexpr-new3.C, the f7 function returns a deleted pointer, which we were happily caching because the new and delete are balanced. Don't. gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_call_expression): Check for heap vars in the result.
* c++: strict constexpr and local varsJason Merrill2022-05-253-5/+28
| | | | | | | | | | | | | | | | | | | | | | A change I was working on made constexpr_searcher.cc start to fail, and when I looked at it I wondered why it had been accepted before. This turned out to be because we try to be more flexible about constant-evaluation of static initializers, as allowed, but we were wrongly doing the same for non-static initializers as well. gcc/cp/ChangeLog: * constexpr.cc (maybe_constant_init_1): Only pass false for strict when initializing a variable of static duration. libstdc++-v3/ChangeLog: * testsuite/20_util/function_objects/constexpr_searcher.cc: Add constexpr. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/constexpr-local4.C: New test.
* c++: ICE with temporary of class type in DMI [PR100252]Marek Polacek2022-05-257-0/+582
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Consider struct A { int x; int y = x; }; struct B { int x = 0; int y = A{x}.y; // #1 }; where for #1 we end up with {.x=(&<PLACEHOLDER_EXPR struct B>)->x, .y=(&<PLACEHOLDER_EXPR struct A>)->x} that is, two PLACEHOLDER_EXPRs for different types on the same level in a {}. This crashes because our CONSTRUCTOR_PLACEHOLDER_BOUNDARY mechanism to avoid replacing unrelated PLACEHOLDER_EXPRs cannot deal with it. Here's why we wound up with those PLACEHOLDER_EXPRs: When we're performing cp_parser_late_parsing_nsdmi for "int y = A{x}.y;" we use finish_compound_literal on type=A, compound_literal={((struct B *) this)->x}. When digesting this initializer, we call get_nsdmi which creates a PLACEHOLDER_EXPR for A -- we don't have any object to refer to yet. After digesting, we have {.x=((struct B *) this)->x, .y=(&<PLACEHOLDER_EXPR struct A>)->x} and since we've created a PLACEHOLDER_EXPR inside it, we marked the whole ctor CONSTRUCTOR_PLACEHOLDER_BOUNDARY. f_c_l creates a TARGET_EXPR and returns TARGET_EXPR <D.2384, {.x=((struct B *) this)->x, .y=(&<PLACEHOLDER_EXPR struct A>)->x}> Then we get to B b = {}; and call store_init_value, which digests the {}, which produces {.x=NON_LVALUE_EXPR <0>, .y=(TARGET_EXPR <D.2395, {.x=(&<PLACEHOLDER_EXPR struct B>)->x, .y=(&<PLACEHOLDER_EXPR struct A>)->x}>).y} lookup_placeholder in constexpr won't find an object to replace the PLACEHOLDER_EXPR for B, because ctx->object will be D.2395 of type A, and we cannot search outward from D.2395 to find 'b'. The call to replace_placeholders in store_init_value will not do anything: we've marked the inner { } CONSTRUCTOR_PLACEHOLDER_BOUNDARY, and it's only a sub-expression, so replace_placeholders does nothing, so the <P_E struct B> stays even though now is the perfect time to replace it because we have an object for it: 'b'. Later, in cp_gimplify_init_expr the *expr_p is D.2395 = {.x=(&<PLACEHOLDER_EXPR struct B>)->x, .y=(&<PLACEHOLDER_EXPR struct A>)->x} where D.2395 is of type A, but we crash because we hit <P_E struct B>, which has a different type. My idea was to replace <P_E struct A> with D.2384 after creating the TARGET_EXPR because that means we have an object we can refer to. Then clear CONSTRUCTOR_PLACEHOLDER_BOUNDARY because we no longer have a PLACEHOLDER_EXPR in the {}. Then store_init_value will be able to replace <P_E struct B> with 'b', and we should be good to go. We must be careful not to break guaranteed copy elision, so this replacement happens in digest_nsdmi_init where we can see the whole initializer, and avoid replacing any placeholders in TARGET_EXPRs used in the context of initialization/copy elision. This is achieved via the new function called potential_prvalue_result_of. While fixing this problem, I found PR105550, thus the FIXMEs in the tests. PR c++/100252 gcc/cp/ChangeLog: * typeck2.cc (potential_prvalue_result_of): New. (replace_placeholders_for_class_temp_r): New. (digest_nsdmi_init): Call it. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/nsdmi-aggr14.C: New test. * g++.dg/cpp1y/nsdmi-aggr15.C: New test. * g++.dg/cpp1y/nsdmi-aggr16.C: New test. * g++.dg/cpp1y/nsdmi-aggr17.C: New test. * g++.dg/cpp1y/nsdmi-aggr18.C: New test. * g++.dg/cpp1y/nsdmi-aggr19.C: New test.
* AArch64: Prioritise init_have_lse_atomics constructor [PR 105708]Wilco Dijkstra2022-05-251-1/+3
| | | | | | | | | | Increase the priority of the init_have_lse_atomics constructor so it runs before other constructors. This improves chances that rr works when LSE atomics are supported. libgcc/ PR libgcc/105708 * config/aarch64/lse-init.c: Increase constructor priority.
* Tweak comments.Andrew MacLeod2022-05-254-5/+5
| | | | | | | | | Adjust some mispellings in comments. * gimple-range-cache.cc: Adjust comments. * gimple-range-infer.cc: Adjust comments. * gimple-range-infer.h: Adjust comments. * gimple-range.cc: Adjust comments.
* Use infer instead of side-effect for ranges.Andrew MacLeod2022-05-259-73/+74
| | | | | | | | | | | | | | | | | | | | | | | | | Rename the files and classes to reflect the term infer rather than side-effect. * Makefile.in (OBJS): Use gimple-range-infer.o. * gimple-range-cache.cc (ranger_cache::fill_block_cache): Change msg. (ranger_cache::range_from_dom): Rename var side_effect to infer. (ranger_cache::apply_inferred_ranges): Rename from apply_side_effects. * gimple-range-cache.h: Include gimple-range-infer.h. (class ranger_cache): Adjust prototypes, use infer_range_manager. * gimple-range-infer.cc: Rename from gimple-range-side-effects.cc. (gimple_infer_range::*): Rename from stmt_side_effects. (infer_range_manager::*): Rename from side_effect_manager. * gimple-range-side-effect.cc: Rename. * gimple-range-side-effect.h: Rename. * gimple-range-infer.h: Rename from gimple-range-side-effects.h. (class gimple_infer_range): Rename from stmt_side_effects. (class infer_range_manager): Rename from side_effect_manager. * gimple-range.cc (gimple_ranger::register_inferred_ranges): Rename from register_side_effects. * gimple-range.h (register_inferred_ranges): Adjust prototype. * range-op.h: Adjust comment. * tree-vrp.cc (rvrp_folder::pre_fold_bb): Use register_inferred_ranges. (rvrp_folder::post_fold_bb): Use register_inferred_ranges.
* RISC-V: Don't unconditionally add m,a,f,d in arch-canonicalizeSimon Cook2022-05-251-1/+1
| | | | | | | | | | | This solves an issue where rv32i, etc. are canonicalized to rv32imafd since the g->i addition of 'm', 'a', 'f', 'd' is not actually gated by whether the input was rv32g/rv64g. gcc/ChangeLog: * config/riscv/arch-canonicalize: Only add mafd extension if base was rv32/rv64g.
* GCN: Add gfx908/gfx90a to -march/-mtune in invoke.texiTobias Burnus2022-05-251-1/+6
| | | | | gcc/ * doc/invoke.texi (AMD GCN Options): Add gfx908/gfx90a.
* c: Improve build_component_ref diagnostics [PR91134]Jakub Jelinek2022-05-256-19/+73
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On the following testcase (the first dg-error line) we emit a weird diagnostics and even fixit on pointerpointer->member where pointerpointer is pointer to pointer to struct and we say 'pointerpointer' is a pointer; did you mean to use '->'? The first part is indeed true, but suggesting -> when the code already does use -> is confusing. The following patch adjusts callers so that they tell it if it is from . parsing or from -> parsing and in the latter case suggests to dereference the left operand instead by adding (* before it and ) after it (before ->). Or would a suggestion to add [0] before -> be better? 2022-05-25 Jakub Jelinek <jakub@redhat.com> PR c/91134 gcc/c/ * c-tree.h (build_component_ref): Add ARROW_LOC location_t argument. * c-typeck.cc (build_component_ref): Likewise. If DATUM is INDIRECT_REF and ARROW_LOC isn't UNKNOWN_LOCATION, print a different diagnostic and fixit hint if DATUM has pointer type. * c-parser.cc (c_parser_postfix_expression, c_parser_omp_variable_list): Adjust build_component_ref callers. * gimple-parser.cc (c_parser_gimple_postfix_expression_after_primary): Likewise. gcc/objc/ * objc-act.cc (objc_build_component_ref): Adjust build_component_ref caller. gcc/testsuite/ * gcc.dg/pr91134.c: New test.
* d: add more 'final' and 'override' to gcc/d/*.cc 'visit' implsIain Buclaw2022-05-253-79/+79
| | | | | | | | | | | | | | The first round of adding these missed several more cases in other files where the Visitor pattern is used in the D front-end. gcc/d/ChangeLog: * expr.cc: Add "final" and "override" to all "visit" vfunc decls as appropriate. * imports.cc: Likewise. * typeinfo.cc: Likewise. Signed-off-by: Iain Buclaw <ibuclaw@gdcproject.org>
* Fix misspelled defaultRichard Biener2022-05-253-3/+3
| | | | | | | | | | | This fixes misspelled defaut: in switch statements in three new testcases. 2022-05-25 Richard Biener <rguenther@suse.de> * gcc.dg/loop-unswitch-10.c: Fix misspelled defaut: * gcc.dg/loop-unswitch-11.c: Likewise. * gcc.dg/loop-unswitch-14.c: Likewise.
* asan: Fix up instrumentation of assignments which are both loads and stores ↵Jakub Jelinek2022-05-252-1/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [PR105714] On the following testcase with -Os asan pass sees: <bb 6> [local count: 354334800]: # h_21 = PHI <h_15(6), 0(5)> *c.3_5 = *d.2_4; h_15 = h_21 + 1; if (h_15 != 3) goto <bb 6>; [75.00%] else goto <bb 7>; [25.00%] <bb 7> [local count: 118111600]: *c.3_5 = MEM[(struct a *)&b + 12B]; _13 = c.3_5->x; return _13; It instruments the *c.3_5 = *d.2_4; assignment by adding .ASAN_CHECK (7, c.3_5, 4, 4); .ASAN_CHECK (6, d.2_4, 4, 4); before it (which later lowers to checking the corresponding shadow memory). But when considering instrumentation of *c.3_5 = MEM[(struct a *)&b + 12B]; it doesn't instrument anything, because it sees that *c.3_5 store is already instrumented in a dominating block and so there is no need to instrument *c.3_5 store again (i.e. add another .ASAN_CHECK (7, c.3_5, 4, 4); ). That is true, but misses the fact that we still want to instrument the MEM[(struct a *)&b + 12B] load. The following patch fixes that by changing has_stmt_been_instrumented_p to consider both store and load in the assignment if it does both (returning true iff both have been instrumented). That matches how we handle e.g. builtin calls, where we also perform AND of all the memory locs involved in the call. I've verified that we still don't add the redundant .ASAN_CHECK (7, c.3_5, 4, 4); call but just add _18 = &MEM[(struct a *)&b + 12B]; .ASAN_CHECK (6, _18, 4, 4); to instrument the load. 2022-05-25 Jakub Jelinek <jakub@redhat.com> PR sanitizer/105714 * asan.cc (has_stmt_been_instrumented_p): For assignments which are both stores and loads, return true only if both destination and source have been instrumented. * gcc.dg/asan/pr105714.c: New test.
* libgomp: Fix occassional hangs with taskwait nowait dependJakub Jelinek2022-05-252-1/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Richi reported occassional hangs with taskwait-depend-nowait-1.* tests and I've finally manged to reproduce. The problem is if taskwait depend without nowait is encountered soon after taskwait depend nowait and the former depends on the latter and there is no other work to do, the taskwait depend without nowait is put to sleep, but the empty_task optimization in gomp_task_run_post_handle_dependers wouldn't wake it up in that case. gomp_task_run_post_handle_dependers normally does some wakeups because it schedules more work (another task), which is not the case of empty_task, but we need to do the wakeups that would be done upon task completion so that we awake sleeping threads when the last child is done. So, the taskwait-depend-nowait-1.* testcase is fixed with the else if (__builtin_expect (task->parent_depends_on, 0) part of the patch. The new testcase can hang on another problem, if the empty task is the last task of a taskgroup, we need to use atomic store like elsewhere to decrease the counter to 0, and wake up taskgroup end if needed. Yet another spot which can sleep is normal taskwait (without depend), but I believe nothing needs to be done for that - in that case we await solely until the children's queue has no tasks, tasks still waiting for dependencies aren't accounted in that, but the reason is that if taskwait should wait for something, there needs to be at least one active child doing something (in the children queue), which then possibly awakes some of its siblings when the dependencies are met, or in the empty task case awakes further dependencies, but in any case the child that finished is still handled as active child and will awake taskwait at the end if there is nothing further to do. Last sleeping case are barriers, but that is handled by ++ret and awaking the barrier. 2022-05-25 Jakub Jelinek <jakub@redhat.com> * task.c (gomp_task_run_post_handle_dependers): If empty_task is the last task taskwait depend depends on, wake it up. Similarly if it is the last child of a taskgroup, use atomic store instead of decrement and awak taskgroup wait if any. * testsuite/libgomp.c-c++-common/taskwait-depend-nowait-2.c: New test.
* Add GIMPLE switch support to loop unswitchingMartin Liska2022-05-2522-252/+1288
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch adds support to unswitch loops with switch statements based on invariant index. It furthermore reworks the cost model to allow an overall budget of statements to be created per original loop by all unswitching opportunities in the loop. Compared to the original all unswitching opportunities in a loop are pre-evaluated before the first transform which will allow future changes to select the most profitable candidates first. To efficiently support switch statements the pass now uses ranger to simplify switch statements and conditions in loop copies based on ranges extracted from the recorded set of predicates unswitched. gcc/ChangeLog: * dbgcnt.def (DEBUG_COUNTER): Add loop_unswitch counter. * params.opt (max-unswitch-level): Remove. * doc/invoke.texi (max-unswitch-level): Likewise. * tree-cfg.cc (gimple_lv_add_condition_to_bb): Support not gimplified expressions. * tree-ssa-loop-unswitch.cc (struct unswitch_predicate): New. (tree_may_unswitch_on): Rename to ... (find_unswitching_predicates_for_bb): ... this and handle switch statements. (get_predicates_for_bb): Likewise. (set_predicates_for_bb): Likewise. (init_loop_unswitch_info): Likewise. (tree_ssa_unswitch_loops): Prepare stuff before calling tree_unswitch_single_loop. (tree_unswitch_single_loop): Rework the function using pre-computed predicates and with a per original loop cost model. (merge_last): New. (add_predicate_to_path): Likewise. (find_range_for_lhs): Likewise. (simplify_using_entry_checks): Rename to ... (evaluate_control_stmt_using_entry_checks): ... this, handle switch statements and improve simplifications using ranger. (simplify_loop_version): Rework using evaluate_control_stmt_using_entry_checks. (evaluate_bbs): New. (evaluate_loop_insns_for_predicate): Likewise. (tree_unswitch_loop): Adjust to allow switch statements and pass in the edge to unswitch. (clean_up_after_unswitching): New. (pass_tree_unswitch::execute): Pass down fun. gcc/testsuite/ChangeLog: * gcc.dg/loop-unswitch-7.c: New test. * gcc.dg/loop-unswitch-8.c: New test. * gcc.dg/loop-unswitch-9.c: New test. * gcc.dg/loop-unswitch-10.c: New test. * gcc.dg/loop-unswitch-11.c: New test. * gcc.dg/loop-unswitch-12.c: New test. * gcc.dg/loop-unswitch-13.c: New test. * gcc.dg/loop-unswitch-14.c: New test. * gcc.dg/loop-unswitch-15.c: New test. * gcc.dg/loop-unswitch-16.c: New test. * gcc.dg/loop-unswitch-17.c: New test. * gcc.dg/torture/20220518-1.c: New test. * gcc.dg/torture/20220518-2.c: New test. * gcc.dg/torture/20220525-1.c: New test. * gcc.dg/alias-10.c: Adjust. * gcc.dg/tree-ssa/loop-6.c: Likewise. * gcc.dg/loop-unswitch-1.c: Likewise. Co-authored-by: Richard Biener <rguenther@suse.de>
* aarch64: Fix pac-ret with unusual dwarf in libgcc unwinder [PR104689]Szabolcs Nagy2022-05-253-2/+159
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | The RA_SIGN_STATE dwarf pseudo-register is normally only set using the DW_CFA_AARCH64_negate_ra_state (== DW_CFA_window_save) operation which toggles the return address signedness state (the default state is 0). (It may be set by remember/restore_state CFI too, those save/restore the state of all registers.) However RA_SIGN_STATE can be set directly via DW_CFA_val_expression too. GCC does not generate such CFI but some other compilers reportedly do. Note: the toggle operation must not be mixed with other dwarf register rule CFI within the same CIE and FDE. In libgcc we assume REG_UNSAVED means the RA_STATE is set using toggle operations, otherwise we assume its value is set by other CFI. libgcc/ChangeLog: PR target/104689 * config/aarch64/aarch64-unwind.h (aarch64_frob_update_context): Handle the !REG_UNSAVED case. * unwind-dw2.c (execute_cfa_program): Fail toggle if !REG_UNSAVED. gcc/testsuite/ChangeLog: PR target/104689 * gcc.target/aarch64/pr104689.c: New test.
* Daily bump.GCC Administrator2022-05-259-1/+455
|
* Fix profile count maintenance in vectorizer peeling.Eugene Rozenfeld2022-05-241-11/+24
| | | | | | | | | | | | | | This patch changes the code to save/restore profile counts for the epliog loop (when not using scalar loop in the epilog) instead of scaling them down and then back up, which may lead to problems if we scale down to 0. Tested on x86_64-pc-linux-gnu. gcc/ChangeLog: * tree-vect-loop-manip.cc (vect_do_peeling): Save/restore profile counts for the epilog loop.
* PR middle-end/105604 - ICE: in tree_to_shwi with vla in struct and sprintfMartin Sebor2022-05-245-35/+368
| | | | | | | | | | | | | | | | | | | | | | gcc/ChangeLog: PR middle-end/105604 * gimple-ssa-sprintf.cc (set_aggregate_size_and_offset): Add comments. (get_origin_and_offset_r): Remove null handling. Handle variable array sizes. (get_origin_and_offset): Handle null argument here. Simplify. (alias_offset): Update comment. * pointer-query.cc (field_at_offset): Update comment. Handle members of variable-length types. gcc/testsuite/ChangeLog: PR middle-end/105604 * gcc.dg/Wrestrict-24.c: New test. * gcc.dg/Wrestrict-25.c: New test. * gcc.dg/Wrestrict-26.c: New test. Co-authored-by: Richard Biener <rguenther@suse.de>
* c++: *this folding in constexpr callJason Merrill2022-05-241-5/+6
| | | | | | | | | | | The code in cxx_eval_call_expression to fold *this was doing the wrong thing for array decay; we can use cxx_fold_indirect_ref instead. gcc/cp/ChangeLog: * constexpr.cc (cxx_fold_indirect_ref): Add default arg. (cxx_eval_call_expression): Call it. (cxx_fold_indirect_ref_1): Handle null empty_base.
* gcc.misc-tests/outputs.exp: Use link test to check for -gsplit-dwarf supportJoel Brobecker2022-05-241-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We have noticed that, when running the GCC testsuite on AArch64 RTEMS 6, we have about 150 tests failing due to a link failure. When investigating, we found that all the tests were failing due to the use of -gsplit-dwarf. On this platform, using -gsplit-dwarf currently causes an error during the link: | /[...]/ld: a.out section `.unexpected_sections' will not fit | in region `UNEXPECTED_SECTIONS' | /[...]/ld: region `UNEXPECTED_SECTIONS' overflowed by 56 bytes The error is a bit cryptic, but the source of the issue is that the linker does not currently support the sections generated by -gsplit-dwarf (.debug_gnu_pubnames, .debug_gnu_pubtypes). This means that the -gsplit-dwarf feature itself really isn't supported on this platform, at least for the moment. This commit enhances the -gsplit-dwarf support check to be a compile-and-link check, rather than just a compile check. This allows it to properly detect that this feature isn't supported on platforms such as AArch64 RTEMS where the compilation works, but not the link. Tested on aarch64-rtems, where a little over 150 tests are now passing, instead of failing, as well as on x86_64-linux, where the results are identical, and where the .log file was also manually inspected to make sure that the use of the -gsplit-dwarf option was preserved. gcc/testsuite/ChangeLog: * gcc.misc-tests/outputs.exp: Make the -gsplit-dwarf test a compile-and-link test rather than a compile-only test.
* c++: discarded-value and constexprJason Merrill2022-05-241-90/+108
| | | | | | | | | | | | | | | | | | | | | | I've been thinking for a while that the 'lval' parameter needed a third value for discarded-value expressions; most importantly, cxx_eval_store_expression does extra work for an lvalue result, and we also don't want to do the l->r conversion. Mostly this is pretty mechanical. Apart from the _store_ fix, I also use vc_discard for substatements of a STATEMENT_LIST other than a stmt-expr result, and avoid building _REFs to be ignored in a few other places. gcc/cp/ChangeLog: * constexpr.cc (enum value_cat): New. Change all 'lval' parameters from int to value_cat. Change most false to vc_prvalue, most true to vc_glvalue, cases where the return value is ignored to vc_discard. (cxx_eval_statement_list): Only vc_prvalue for stmt-expr result. (cxx_eval_store_expression): Only build _REF for vc_glvalue. (cxx_eval_array_reference, cxx_eval_component_reference) (cxx_eval_indirect_ref, cxx_eval_constant_expression): Likewise.
* c++: constexpr empty base redux [PR105622]Jason Merrill2022-05-242-2/+21
| | | | | | | | | | | | | | | | | | | | | | | | Here calling the constructor for s.__size_ had ctx->ctor for s itself because cxx_eval_store_expression doesn't create a ctor for the empty field. Then cxx_eval_call_expression returned the s initializer, and my empty base overhaul in r13-160 got confused because the type of init is not an empty class. But that's OK, we should be checking the type of the original LHS instead. We also want to use initialized_type in the condition, in case init is an AGGR_INIT_EXPR. I spent quite a while working on more complex solutions before coming back to this simple one. PR c++/105622 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_store_expression): Adjust assert. Use initialized_type. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/no_unique_address14.C: New test.
* Add new parameter to vec_perm_const hook for specifying operand mode.Prathamesh Kulkarni2022-05-2525-85/+150
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The rationale of the patch is to support vec_perm_expr of the form: lhs = vec_perm_expr<rhs, mask> where lhs and rhs are vector types with different lengths but have same element type. For example, lhs is SVE vector and rhs is corresponding AdvSIMD vector. It would also allow to express extract even/odd and interleave operations with a VEC_PERM_EXPR. The interleave currently has the issue that we have to artificially widen the inputs with "dont-care" elements. gcc/ChangeLog: * target.def (vec_perm_const): Define new parameter op_mode and update doc. * doc/tm.texi: Regenerate. * config/aarch64/aarch64.cc (aarch64_vectorize_vec_perm_const): Adjust vec_perm_const hook to add new parameter op_mode and return false if result and operand modes do not match. * config/arm/arm.cc (arm_vectorize_vec_perm_const): Likewise. * config/gcn/gcn.cc (gcn_vectorize_vec_perm_const): Likewise. * config/ia64/ia64.cc (ia64_vectorize_vec_perm_const): Likewise. * config/mips/mips.cc (mips_vectorize_vec_perm_const): Likewise. * config/rs6000/rs6000.cc (rs6000_vectorize_vec_perm_const): Likewise * config/s390/s390.cc (s390_vectorize_vec_perm_const): Likewise. * config/sparc/sparc.cc (sparc_vectorize_vec_perm_const): Likewise. * config/i386/i386-expand.cc (ix86_vectorize_vec_perm_const): Likewise. * config/i386/i386-expand.h (ix86_vectorize_vec_perm_const): Adjust prototype. * config/i386/sse.md (ashrv4di3): Adjust call to vec_perm_const hook. (ashrv2di3): Likewise. * optabs.cc (expand_vec_perm_const): Likewise. * optabs-query.h (can_vec_perm_const_p): Adjust prototype. * optabs-query.cc (can_vec_perm_const_p): Define new parameter op_mode and pass it to vec_perm_const hook. (can_mult_highpart_p): Adjust call to can_vec_perm_const_p. * match.pd (vec_perm X Y CST): Likewise. * tree-ssa-forwprop.cc (simplify_vector_constructor): Likewise. * tree-vect-data-refs.cc (vect_grouped_store_supported): Likewise. (vect_grouped_load_supported): Likewise. (vect_shift_permute_load_chain): Likewise. * tree-vect-generic.cc (lower_vec_perm): Likewise. * tree-vect-loop-manip.cc (interleave_supported_p): Likewise. * tree-vect-loop.cc (have_whole_vector_shift): Likewise. * tree-vect-patterns.cc (vect_recog_rotate_pattern): Likewise. * tree-vect-slp.cc (can_duplicate_and_interleave_p): Likewise. (vect_transform_slp_perm_load): Likewise. (vectorizable_slp_permutation): Likewise. * tree-vect-stmts.cc (perm_mask_for_reverse): Likewise. (vectorizable_bswap): Likewise. (scan_store_can_perm_p): Likewise. (vect_gen_perm_mask_checked): Likewise.
* x86: Document -mcet-switchH.J. Lu2022-05-242-2/+14
| | | | | | | | | | | | | | | | | | When -fcf-protection=branch is used, the compiler will generate jump tables for switch statements where the indirect jump is prefixed with the NOTRACK prefix, so it can jump to non-ENDBR targets. Since the indirect jump targets are generated by the compiler and stored in read-only memory, this does not result in a direct loss of hardening. But if the jump table index is attacker-controlled, the indirect jump may not be constrained by CET. Document -mcet-switch to generate jump tables for switch statements with ENDBR and skip the NOTRACK prefix for indirect jump. This option should be used when the NOTRACK prefix is disabled. PR target/104816 * config/i386/i386.opt: Remove Undocumented. * doc/invoke.texi: Document -mcet-switch.
* amdgcn: Add gfx90a supportAndrew Stubbs2022-05-2410-24/+100
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds architecture options and multilibs for the AMD GFX90a GPUs. It also tidies up some of the ISA selection code, and corrects a few small mistake in the gfx908 naming. gcc/ChangeLog: * config.gcc (amdgcn): Accept --with-arch=gfx908 and gfx90a. * config/gcn/gcn-opts.h (enum gcn_isa): New. (TARGET_GCN3): Use enum gcn_isa. (TARGET_GCN3_PLUS): Likewise. (TARGET_GCN5): Likewise. (TARGET_GCN5_PLUS): Likewise. (TARGET_CDNA1): New. (TARGET_CDNA1_PLUS): New. (TARGET_CDNA2): New. (TARGET_CDNA2_PLUS): New. (TARGET_M0_LDS_LIMIT): New. (TARGET_PACKED_WORK_ITEMS): New. * config/gcn/gcn.cc (gcn_isa): Change to enum gcn_isa. (gcn_option_override): Recognise CDNA ISA variants. (gcn_omp_device_kind_arch_isa): Support gfx90a. (gcn_expand_prologue): Make m0 init optional. Add support for packed work items. (output_file_start): Support gfx90a. (gcn_hsa_declare_function_name): Support gfx90a metadata. * config/gcn/gcn.h (TARGET_CPU_CPP_BUILTINS):Add __CDNA1__ and __CDNA2__. * config/gcn/gcn.md (<su>mulsi3_highpart): Use TARGET_GCN5_PLUS. (<su>mulsi3_highpart_imm): Likewise. (<su>mulsidi3): Likewise. (<su>mulsidi3_imm): Likewise. * config/gcn/gcn.opt (gpu_type): Add gfx90a. * config/gcn/mkoffload.cc (EF_AMDGPU_MACH_AMDGCN_GFX90a): New. (main): Support gfx90a. * config/gcn/t-gcn-hsa: Add gfx90a multilib. * config/gcn/t-omp-device: Add gfx90a isa. libgomp/ChangeLog: * plugin/plugin-gcn.c (EF_AMDGPU_MACH): Add EF_AMDGPU_MACH_AMDGCN_GFX90a. (gcn_gfx90a_s): New. (isa_hsa_name): Support gfx90a. (isa_code): Likewise.
* amdgcn: Remove LLVM 9 assembler/linker supportAndrew Stubbs2022-05-247-812/+64
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The minimum required LLVM version is now 13.0.1, and is enforced by configure. gcc/ChangeLog: * config.in: Regenerate. * config/gcn/gcn-hsa.h (X_FIJI): Delete. (X_900): Delete. (X_906): Delete. (X_908): Delete. (S_FIJI): Delete. (S_900): Delete. (S_906): Delete. (S_908): Delete. (NO_XNACK): New macro. (NO_SRAM_ECC): New macro. (SRAMOPT): Keep only v4 variant. (HSACO3_SELECT_OPT): Delete. (DRIVER_SELF_SPECS): Delete. (ASM_SPEC): Remove LLVM 9 support. * config/gcn/gcn-valu.md (gather<mode>_insn_2offsets<exec>): Remove assembler bug workaround. (scatter<mode>_insn_2offsets<exec_scatter>): Likewise. * config/gcn/gcn.cc (output_file_start): Remove LLVM 9 support. (print_operand_address): Remove assembler bug workaround. * config/gcn/mkoffload.cc (EF_AMDGPU_XNACK_V3): Delete. (EF_AMDGPU_SRAM_ECC_V3): Delete. (SET_XNACK_ON): Delete v3 variants. (SET_XNACK_OFF): Delete v3 variants. (TEST_XNACK): Delete v3 variants. (SET_SRAM_ECC_ON): Delete v3 variants. (SET_SRAM_ECC_ANY): Delete v3 variants. (SET_SRAM_ECC_OFF): Delete v3 variants. (SET_SRAM_ECC_UNSUPPORTED): Delete v3 variants. (TEST_SRAM_ECC_ANY): Delete v3 variants. (TEST_SRAM_ECC_ON): Delete v3 variants. (copy_early_debug_info): Remove v3 support. (main): Remove v3 support. * configure: Regenerate. * configure.ac: Replace all GCN feature checks with a version check.
* libiberty: remove FINAL and OVERRIDE from ansidecl.hDavid Malcolm2022-05-241-41/+0
| | | | | | | | | | | | | | | | | | | | | | | | libiberty's ansidecl.h provides macros FINAL and OVERRIDE to allow virtual functions to be labelled with the C++11 "final" and "override" specifiers, but with empty implementations on pre-C++11 C++ compilers. We've used the macros in many places in GCC, but as of as of GCC 11 onwards GCC has required a C++11 compiler, such as GCC 4.8 or later. On the assumption that any such compiler correctly implements "final" and "override", I've simplified GCC's codebase by replacing all uses of the FINAL and OVERRIDE macros in GCC's source tree with the lower-case specifiers (via commits r13-690-gff171cb13df671 and r13-716-g8473ef7be60443) The macros are reportedly not used anywhere in binutils-gdb. This patch completes this transition for GCC by eliminating the macros from ansidecl.h. include/ChangeLog: * ansidecl.h: Drop macros OVERRIDE and FINAL. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
* Optimize double word negation of zero extended values on x86.Roger Sayle2022-05-243-0/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It's not uncommon for GCC to convert between a (zero or one) Boolean value and a (zero or all ones) mask value, possibly of a wider type, using negation. Currently on x86_64, the following simple test case: __int128 foo(unsigned long x) { return -(__int128)x; } compiles with -O2 to: movq %rdi, %rax xorl %edx, %edx negq %rax adcq $0, %rdx negq %rdx ret with this patch, which adds an additional peephole2 to i386.md, we instead generate the improved: movq %rdi, %rax negq %rax sbbq %rdx, %rdx ret [and likewise for the (DImode) long long version using -m32.] A peephole2 is appropriate as the double word negation and the operation providing the xor are typically only split after combine. In fact, the new peephole2 sequence: ;; Convert: ;; xorl %edx, %edx ;; negl %eax ;; adcl $0, %edx ;; negl %edx ;; to: ;; negl %eax ;; sbbl %edx, %edx // *x86_mov<mode>cc_0_m1 is nearly identical to (and placed immediately after) the existing: ;; Convert: ;; mov %esi, %edx ;; negl %eax ;; adcl $0, %edx ;; negl %edx ;; to: ;; xorl %edx, %edx ;; negl %eax ;; sbbl %esi, %edx One potential objection/concern is that "sbb? %reg,%reg" may possibly be incorrectly perceived as a false register dependency on older hardware, much like "xor? %reg,%reg" may be perceived as a false dependency on really old hardware. This doesn't currently appear to be a concern for the i386 backend's *x86_move<mode>cc_0_m1 as shown by the following test code: int bar(unsigned int x, unsigned int y) { return x > y ? -1 : 0; } which currently generates a "naked" sbb: cmp esi, edi sbb eax, eax ret If anyone does potentially encounter a stall, it would easy to add a splitter or peephole2 controlled by a tuning flag to insert an additional xor to break the false dependency chain (when not optimizing for size), but I don't believe this is required on recent microarchitectures. 2022-05-24 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * config/i386/i386.md (peephole2): Convert xor;neg;adc;neg, i.e. a double word negation of a zero extended operand, to neg;sbb. gcc/testsuite/ChangeLog * gcc.target/i386/neg-zext-1.c: New test case for -m32. * gcc.target/i386/neg-zext-2.c: New test case for -m64.
* PR tree-optimization/105668: Provide vcond_mask_v1tiv1ti pattern.Roger Sayle2022-05-243-11/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch is an alternate/supplementary fix to PR tree-optimization/105668 that provides a vcond_mask_v1titi optab/define_expand to the i386 backend. An undocumented feature/bug of GCC's vectorization is that any target that provides a vec_cmpeq<mode><mode> has to also provide a matching vcond_mask<mode><mode>. This backend patch preserves the status quo, rather than fixes the underlying problem. One aspect of this clean-up is that ix86_expand_sse_movcc provides fallback implementations using pand/pandn/por that effectively make V2DImode and V1TImode vcond_mask available on any TARGET_SSE2, not just TARGET_SSE4_2. This allows a simplification as V2DI mode can be handled by using a VI_128 mode iterator instead of a VI124_128 mode iterator, and instead this define_expand is effectively renamed to provide a V1TImode vcond_mask expander (as V1TI isn't in VI_128). 2022-05-24 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR tree-optimization/105668 * config/i386/i386-expand.cc (ix86_expand_sse_movcc): Support V1TImode, just like V2DImode. * config/i386/sse.md (vcond_mask_<mode><sseintvecmodelower>): Use VI_128 mode iterator instead of VI124_128 to include V2DI. (vcond_mask_v2div2di): Delete. (vcond_mask_v1tiv1ti): New define_expand. gcc/testsuite/ChangeLog PR tree-optimization/105668 * gcc.target/i386/pr105668.c: New test case.
* Minor improvement to genpreds.ccRoger Sayle2022-05-241-4/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This simple patch implements Richard Biener's suggestion in comment #6 of PR tree-optimization/52171 (from February 2013) that the insn-preds code generated by genpreds can avoid using strncmp when matching constant strings of length one. The effect of this patch is best explained by the diff of insn-preds.cc: < if (!strncmp (str + 1, "g", 1)) --- > if (str[1] == 'g') 3104c3104 < if (!strncmp (str + 1, "m", 1)) --- > if (str[1] == 'm') 3106c3106 < if (!strncmp (str + 1, "c", 1)) --- > if (str[1] == 'c') ... The equivalent optimization is performed by GCC (but perhaps not by the host compiler), but generating simpler/smaller code may encourage further optimizations (such as use of a switch statement). 2022-05-24 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * genpreds.cc (write_lookup_constraint_1): Avoid generating a call to strncmp for strings of length one.
* c++: set TYPE_CANONICAL for more template typesPatrick Palka2022-05-245-47/+102
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When forming a class template specialization, lookup_template_class uses structural equality for the specialized type whenever one of its template arguments uses structural equality. This is the sensible thing to do in a vacuum, but given that we already effectively deduplicate class specializations via the type_specializations table, we ought to be able to safely assume that each class specialization is unique and therefore canonical, regardless of the canonicity of the template arguments. To that end this patch makes us use the canonical type machinery for all type specializations, except for the case where a PARM_DECL appears in the template arguments (this special case was recently added by r12-3766-g72394d38d929c7). Additionally, this patch makes us use the canonical type machinery for TEMPLATE_TEMPLATE_PARMs and BOUND_TEMPLATE_TEMPLATE_PARMs, by extending canonical_type_parameter appropriately. A comment in tsubst says it's unsafe to set TYPE_CANONICAL for a lowered TEMPLATE_TEMPLATE_PARM, but I'm not sure this is true anymore. According to Jason, this comment (from r120341) became obsolete when later that year r129844 started to substitute the template parms of ttps. Note that r10-7817-ga6f400239d792d recently changed process_template_parm to clear TYPE_CANONICAL for TEMPLATE_TEMPLATE_PARM consistent with the tsubst comment; this patch changes both functions to set instead of clear TYPE_CANONICAL for ttps. These changes improve compile time of template-heavy code by around 10% for me (with a release compiler). For instance, compile time for the libstdc++ test std/ranges/adaptors/all.cc drops from 1.45s to 1.25s, and for the range-v3 test test/view/zip.cpp from 5.38s to 4.88s. The total number of calls to structural_comptypes for the latter test drops from 10.5M to 1.8M. Memory use is unaffected (as expected). The new testcase verifies we check the r12-3766 PARM_DECL special case in bind_template_template_parm too. gcc/cp/ChangeLog: * cp-tree.h (any_template_arguments_need_structural_equality_p): Declare. * pt.cc (struct ctp_hasher): Define. (ctp_table): Define. (canonical_type_parameter): Use it. (process_template_parm): Set TYPE_CANONICAL for TEMPLATE_TEMPLATE_PARM too. (lookup_template_class_1): Remove now outdated comment for the any_template_arguments_need_structural_equality_p test. (tsubst) <case TEMPLATE_TEMPLATE_PARM, etc>: Don't specifically clear TYPE_CANONICAL for ttps. Set TYPE_CANONICAL on the substituted type later. (any_template_arguments_need_structural_equality_p): Return true for any_targ_node. Don't return true just because a template argument uses structural equality. Add comment for the PARM_DECL special case. (rewrite_template_parm): Set TYPE_CANONICAL on the rewritten parm's type later. * tree.cc (bind_template_template_parm): Set TYPE_CANONICAL when safe to do so. * typeck.cc (structural_comptypes) [check_alias]: Increment processing_template_decl before checking dependent_alias_template_spec_p. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-52830a.C: New test.
* d: add 'final' and 'override' to gcc/d/*.cc 'visit' implsDavid Malcolm2022-05-245-83/+83
| | | | | | | | | | | | gcc/d/ChangeLog: * decl.cc: Add "final" and "override" to all "visit" vfunc decls as appropriate. * expr.cc: Likewise. * toir.cc: Likewise. * typeinfo.cc: Likewise. * types.cc: Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
* RISC-V: Cache Management Operation instructions testcasesShiYulong2022-05-246-0/+106
| | | | | | | | | | | | | This commit adds testcases about CMO instructions. gcc/testsuite/ChangeLog: * gcc.target/riscv/cmo-zicbom-1.c: New test. * gcc.target/riscv/cmo-zicbom-2.c: New test. * gcc.target/riscv/cmo-zicbop-1.c: New test. * gcc.target/riscv/cmo-zicbop-2.c: New test. * gcc.target/riscv/cmo-zicboz-1.c: New test. * gcc.target/riscv/cmo-zicboz-2.c: New test.
* RISC-V: Cache Management Operation instructionsShiYulong2022-05-245-0/+98
| | | | | | | | | | | | | | | | | | | | | | | | | | | This commit adds cbo.clea, cbo.flush, cbo.inval, cbo.zero, prefetch.i, prefetch.r and prefetch.w instructions. diff with the previous version: We use unspec_volatile instead of unspec for those cache operations. We use UNSPECV instead of UNSPEC and move them to unspecv. gcc/ChangeLog: * config/riscv/predicates.md (imm5_operand): Add a new operand type for prefetch instructions. * config/riscv/riscv-builtins.cc (AVAIL): Add new AVAILs for CMO ISA Extensions. (RISCV_ATYPE_SI): New. (RISCV_ATYPE_DI): New. * config/riscv/riscv-ftypes.def (0): New. (1): New. * config/riscv/riscv.md (riscv_clean_<mode>): New. (riscv_flush_<mode>): New. (riscv_inval_<mode>): New. (riscv_zero_<mode>): New. (prefetch): New. (riscv_prefetchi_<mode>): New. * config/riscv/riscv-cmo.def: New file.
* RISC-V: Add mininal support for Zicbo[mzp]ShiYulong2022-05-243-0/+19
| | | | | | | | | | | | | | | This commit adds minimal support for 'Zicbom','Zicboz' and 'Zicbop' extensions. gcc/ChangeLog: * common/config/riscv/riscv-common.cc: Add zicbom, zicboz, zicbop extensions. * config/riscv/riscv-opts.h (MASK_ZICBOZ): New. (MASK_ZICBOM): New. (MASK_ZICBOP): New. (TARGET_ZICBOZ): New. (TARGET_ZICBOM): New. (TARGET_ZICBOP): New. * config/riscv/riscv.opt (riscv_zicmo_subext): New.