aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2020-12-10arm: Auto-vectorization for MVE: vandChristophe Lyon7-18/+101
This patch enables MVE vandq instructions for auto-vectorization. MVE vandq insns in mve.md are modified to use 'and' instead of unspec expression to support and<mode>3. The and<mode>3 expander is added to vec-common.md 2020-12-03 Christophe Lyon <christophe.lyon@linaro.org> gcc/ * config/arm/iterators.md (supf): Remove VANDQ_S and VANDQ_U. (VANQ): Remove. (VDQ): Add TARGET_HAVE_MVE condition where relevant. * config/arm/mve.md (mve_vandq_u<mode>): New entry for vand instruction using expression 'and'. (mve_vandq_s<mode>): New expander. (mve_vaddq_n_f<mode>): Use 'and' code instead of unspec. * config/arm/neon.md (and<mode>3): Rename into and<mode>3_neon. * config/arm/predicates.md (imm_for_neon_inv_logic_operand): Enable for MVE. * config/arm/unspecs.md (VANDQ_S, VANDQ_U, VANDQ_F): Remove. * config/arm/vec-common.md (and<mode>3): New expander. gcc/testsuite/ * gcc.target/arm/simd/mve-vand.c: New test.
2020-12-10data-ref: Rework integer handling in split_constant_offset [PR98069]Richard Sandiford2-97/+352
PR98069 is about a case in which split_constant_offset miscategorises an expression of the form: int foo; … POINTER_PLUS_EXPR<base, (sizetype)(INT_MIN - foo) * size> as: base: base offset: (sizetype) (-foo) * size init: INT_MIN * size “-foo” overflows when “foo” is INT_MIN, whereas the original expression didn't overflow in that case. As discussed in the PR trail, we could simply ignore the fact that int overflow is undefined and treat it as a wrapping type, but that is likely to pessimise quite a few cases. This patch instead reworks split_constant_offset so that: - it treats integer operations as having an implicit cast to sizetype - for integer operations, the returned VAR has type sizetype In other words, the problem becomes to express: (sizetype) (OP0 CODE OP1) as: VAR:sizetype + (sizetype) OFF:ssizetype The top-level integer split_constant_offset will (usually) be a sizetype POINTER_PLUS operand, so the extra cast to sizetype disappears. But adding the cast allows the conversion handling to defer a lot of the difficult cases to the recursive split_constant_offset call, which can detect overflow on individual operations. The net effect is to analyse the access above as: base: base offset: -(sizetype) foo * size init: INT_MIN * size See the comments in the patch for more details. gcc/ PR tree-optimization/98069 * tree-data-ref.c (compute_distributive_range): New function. (nop_conversion_for_offset_p): Likewise. (split_constant_offset): In the internal overload, treat integer expressions as having an implicit cast to sizetype and express them accordingly. Pass back the range of the original (uncast) expression in a new range parameter. (split_constant_offset_1): Likewise. Rework the handling of conversions to account for the implicit sizetype casts.
2020-12-10[VECT] pr97929 fixJoel Hutton2-0/+12
This addresses pr97929. The case for WIDEN_PLUS and WIDEN_MINUS were missing in vect_get_smallest_scalar_type. gcc/ChangeLog: PR tree-optimization/97929 * tree-vect-data-refs.c (vect_get_smallest_scalar_type): Add WIDEN_PLUS/WIDEN_MINUS case. gcc/testsuite/ChangeLog: * gcc.dg/vect/pr97929.c: New test.
2020-12-10Add WIDEN_PLUS, WIDEN_MINUS pretty printJoel Hutton1-0/+12
Add 'w+'/'w-' as WIDEN_PLUS/WIDEN_MINUS respectively. Add VEC_WIDEN_PLUS/MINUS_HI/LO<...> for VEC_WIDEN_PLUS/MINUS_HI/LO gcc/ChangeLog: * tree-pretty-print.c (dump_generic_node): Add case for VEC_WIDEN_(PLUS/MINUS)_(HI/LO)_EXPR and WIDEN_(PLUS/MINUS)_EXPR.
2020-12-10tree-optimization/98211 - fix bogus vectorization of conversionRichard Biener2-0/+62
Pattern recog incompletely handles some bool cases but we shouldn't miscompile as a result but not vectorize. Unfortunately vectorizable_assignment lets invalid conversions (that vectorizable_conversion rejects) slip through. The following rectifies that. 2020-12-10 Richard Biener <rguenther@suse.de> PR tree-optimization/98211 * tree-vect-stmts.c (vectorizable_assignment): Disallow invalid conversions to bool vector types. * gcc.dg/pr98211.c: New testcase.
2020-12-10drop __builtin_ from __clear_cache libnameAlexandre Oliva1-1/+1
I made a cut&pasto in my previous patch for tree.c, causing platforms that have CLEAR_INSN_CACHE defined, and none of the internal __clear_cache expansion overriders, to issue calls to symbols named __builtin___clear_cache rather than __clear_cache, on languages other than those in the C family. Oops. This patch removes __builtin_ from the string used as the libname for __buuiltin___clear_cache. for gcc/ChangeLog * tree.c (build_common_builtin_nodes): Drop __builtin_ from __clear_cache libname.
2020-12-10dojump: Improve float != comparisons on x86 [PR98212]Jakub Jelinek2-0/+38
The x86 backend doesn't have EQ or NE floating point comparisons, so splits x != y into x unord y || x <> y. The problem with that is that unord comparison doesn't trap on qNaN operands but LTGT does. The end effect is that it doesn't trap on qNaN operands, because x unord y will be true for those and so LTGT will not be performed, but as the backend is currently unable to merge signalling and non-signalling comparisons (and after all, with this exact exception it shouldn't unless the first one is signalling and the second one is non-signalling) it means we end up with: ucomiss %xmm1, %xmm0 jp .L4 comiss %xmm1, %xmm0 jne .L4 ret .p2align 4,,10 .p2align 3 .L4: xorl %eax, %eax jmp foo where the comiss is the signalling comparison, but we already know that the right flags bits are already computed by the ucomiss insn. The following patch, if target supports UNEQ comparisons, splits NE as x unord y || !(x uneq y) instead, which in the end means we end up with just: ucomiss %xmm1, %xmm0 jp .L4 jne .L4 ret .p2align 4,,10 .p2align 3 .L4: jmp foo because UNEQ is like UNORDERED non-signalling. 2020-12-10 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/98212 * dojump.c (do_compare_rtx_and_jump): When splitting NE and backend can do UNEQ, prefer splitting x != y into x unord y || !(x uneq y) instead of into x unord y || x ltgt y. * gcc.target/i386/pr98212.c: New test.
2020-12-10dojump: Optimize a == a or a != a [PR98169]Jakub Jelinek2-1/+36
If the backend doesn't have floating point EQ or NE comparison, dojump.c splits it into ORDERED && UNEQ or UNORDERED || LTGT. If both comparison operands are the same, we know the result of the second comparison though, a == b is equivalent to a ord b and a != b is equivalent to a unord b, and thus can just use ORDERED or UNORDERED. On the testcase, this changes f1: - ucomiss %xmm0, %xmm0 - movl $1, %eax - jp .L3 - jne .L3 - ret - .p2align 4,,10 - .p2align 3 -.L3: xorl %eax, %eax + ucomiss %xmm0, %xmm0 + setnp %al and f3: - ucomisd %xmm0, %xmm0 - movl $1, %eax - jp .L8 - jne .L8 - ret - .p2align 4,,10 - .p2align 3 -.L8: xorl %eax, %eax + ucomisd %xmm0, %xmm0 + setnp %al while keeping the same code for f2 and f4. 2020-12-10 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/98169 * dojump.c (do_compare_rtx_and_jump): Don't split self-EQ/NE comparisons, just use ORDERED or UNORDERED. * gcc.target/i386/pr98169.c: New test.
2020-12-10openmp: Fix ICE with broken doacross loop [PR98205]Jakub Jelinek2-7/+42
If the loop body doesn't ever continue, we don't have a bb to insert the updates. Fixed by not adding them at all in that case. 2020-12-10 Jakub Jelinek <jakub@redhat.com> PR middle-end/98205 * omp-expand.c (expand_omp_for_generic): Fix up broken_loop handling. * c-c++-common/gomp/doacross-4.c: New test.
2020-12-10Allow scalar fallback for pattern root stmtRichard Biener2-4/+16
This adjusts the SLP build to allow a pattern root stmt to be built from scalars. I've noticed this in PR98211 where we fail to promote a SLP subtree to a simple splat operation and instead emit a series of uniform vector operations. The bb-slp-div-1.c testcase is now vectorized on x86_64 but only the store so I adjusted it to expect the load to be vectorized. 2020-12-10 Richard Biener <rguenther@suse.de> * tree-vect-slp.c (vect_get_and_check_slp_defs): Do not mark the defs to occur in a pattern if it is the pattern root and record the original stmt defs in that case. * gcc.dg/vect/bb-slp-div-1.c: Expect the load to be vectorized.
2020-12-10RISC-V: Explicitly call python when using multilib generatorSimon Cook1-1/+2
When building GCC for RISC-V with the --with-multilib-generator option, it may not be possible to call arch-canonicalize as an executable when building on Windows. Instead directly invoke the expected python interpreter for this step. gcc/ChangeLog: * config/riscv/multilib-generator (arch_canonicalize): Invoke python interpreter when calling arch-canonicalize script.
2020-12-09-fdump-go-spec: ignore type ordering of incomplete typesNikhil Benesch2-36/+20
gcc/: * godump.c (go_format_type): Don't consider whether a type has been seen when determining whether to output a type by name. Consider only the use_type_name parameter. (go_output_typedef): When outputting a typedef, format the declaration's original type, which contains the name of the underlying type rather than the name of the typedef. gcc/testsuite: * gcc.misc-tests/godump-1.c: Add test case.
2020-12-09go-test.exp: recognize errorcheckdir -nIan Lance Taylor1-1/+1
* go.test/go-test.exp (go-gc-tests): Recognize errorcheckdir -n, for bug345.go.
2020-12-10Daily bump.GCC Administrator9-1/+250
2020-12-09go-test.exp: rewrite errchk regexp quotingIan Lance Taylor1-40/+22
* go.test/go-test.exp (errchk): Rewrite regexp quoting to use curly braces, making it much simpler.
2020-12-09phiopt: Fix up two_value_replacement BOOLEAN_TYPE handling for Ada [PR98188]Jakub Jelinek1-5/+5
For Ada with LTO, boolean_{false,true}_node can be 1-bit precision boolean, while TREE_TYPE (lhs) can be 8-bit precision boolean and thus we can end up with wide_int mismatches. This patch for non-VR_RANGE just use VARYING min/max manually. The min + 1 != max check will then do the rest. 2020-12-09 Jakub Jelinek <jakub@redhat.com> PR bootstrap/98188 * tree-ssa-phiopt.c (two_value_replacement): Don't special case BOOLEAN_TYPEs for ranges, instead if get_range_info doesn't return VR_RANGE, set min/max to wi::min/max_value.
2020-12-09aarch64: Add +pauth to -marchPrzemyslaw Wirkus4-6/+17
New +pauth (Pointer Authentication from Armv8.3-A) feature option for -march command line option. Please note that majority of PAUTH instructions are implemented behind HINT instruction. PAUTH stays an Armv8.3-A feature but now can be assigned to other architectures or CPUs. gcc/ChangeLog: * config/aarch64/aarch64-option-extensions.def (AARCH64_OPT_EXTENSION): New +pauth option in -march for AArch64. * config/aarch64/aarch64.h (AARCH64_FL_PAUTH): New pauth extension bitmask. (AARCH64_ISA_PUATH): New ISA bitmask for PAUTH. (AARCH64_FL_FOR_ARCH8_3): Add PAUTH to Armv8.3-A. (TARGET_PAUTH): New target mask to isolate PAUTH instructions. * config/aarch64/aarch64.md (do_return): Condition set to TARGET_PAUTH. * doc/invoke.texi: Update docs for +flagm and +pauth.
2020-12-09i386: Remove REG_ALLOC_ORDER definitionUros Bizjak1-16/+0
REG_ALLOC_ORDER just defines what the default is set to. 2020-12-09 Uroš Bizjak <ubizjak@gmail.com> gcc/ * config/i386/i386.h (REG_ALLOC_ORDER): Remove
2020-12-09libstdc++: Fix build failure for target with no way to sleepJonathan Wakely5-2/+27
In previous releases the std::this_thread::sleep_for function was only declared if the target supports multiple threads. I changed that recently in r11-2649-g5bbb1f3000c57fd4d95969b30fa0e35be6d54ffb so that sleep_for could be used single-threaded. But that means that targets using --disable-threads are now required to provide some way to sleep. This breaks the build for (at least) AVR when trying to build a hosted library. This patch adds a new autoconf macro that is defined when no way to sleep is available, and uses that to suppress the sleeping functions in std::this_thread. The #error in src/c++11/thread.cc is retained for the case where there is no sleep function available but multiple threads are supported. This is consistent with previous releases, but that #error could probably be removed without any consequences. libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Define NO_SLEEP if none of nanosleep, sleep and Sleep is available. * config.h.in: Regenerate. * configure: Regenerate. * include/std/thread [_GLIBCXX_NO_SLEEP] (__sleep_for): Do not declare. [_GLIBCXX_NO_SLEEP] (sleep_for, sleep_until): Do not define. * src/c++11/thread.cc [_GLIBCXX_NO_SLEEP] (__sleep_for): Do not define.
2020-12-09tree-optimization/98213 - cache PHI walking result in SMRichard Biener2-6/+38
This avoids exponential work when walking PHIs in loop store motion. Fails are quickly propagated and thus need no caching. 2020-12-09 Richard Biener <rguenther@suse.de> PR tree-optimization/98213 * tree-ssa-loop-im.c (sm_seq_valid_bb): Cache successfully processed PHIs. (hoist_memory_references): Adjust. * g++.dg/pr98213.C: New testcase.
2020-12-09c++: Module parsingNathan Sidwell3-6/+403
This adds the module-declaration parsing and other logic. We have two new kinds of declaration -- module and import. Plus the ability to export other declarations. The module processing can also divide the TU into several portions -- GMF, Purview and PMF. There are restrictions that some declarations must or mustnot appear in a #include, so I needed to add a bit to indicate whether a token came from the main source or not. This seemed the least unpleasant way of implementing such a check. gcc/cp/ * parser.h (struct cp_token): Add main_source_p field. * parser.c (cp_lexer_new_main): Pass thought module token filter. Check macros. (cp_lexer_get_preprocessor_token): Set main_source_p. (enum module_parse): New. (cp_parser_diagnose_invalid_type_name): Deal with unrecognized module-directives. (cp_parser_skip_to_closing_parenthesize_1): Skip module-directivres. (cp_parser_skip_to_end_of_statement): Likewise. (cp_parser_skiup_to_end_of_block_or_statement): Likewise. (cp_parser_translation_unit): Add module parsing calls. (cp_parser_module_name, cp_parser_module_declaration): New. (cp_parser_import_declaration, cp_parser_module_export): New. (cp_parser_declaration): Add module export detection. (cp_parser_template_declaration): Adjust 'export' error message. (cp_parser_function_definition_after_declarator): Add module-specific logic. * module.cc (import_module, declare_module) (maybe_check_all_macros): Stubs.
2020-12-09c++: Fix printing of decltype(nullptr) [PR97517]Marek Polacek2-0/+14
The C++ printer doesn't handle NULLPTR_TYPE, so we issue the ugly "'nullptr_type' not supported by...". Since NULLPTR_TYPE is decltype(nullptr), it seemed reasonable to handle it where we handle DECLTYPE_TYPE, that is, in the simple-type-specifier handler. gcc/cp/ChangeLog: PR c++/97517 * cxx-pretty-print.c (cxx_pretty_printer::simple_type_specifier): Handle NULLPTR_TYPE. (pp_cxx_type_specifier_seq): Likewise. (cxx_pretty_printer::type_id): Likewise. gcc/testsuite/ChangeLog: PR c++/97517 * g++.dg/diagnostic/nullptr.C: New test.
2020-12-09testsuite: fix 2 tests on aarch64Martin Liska2-2/+2
gcc/testsuite/ChangeLog: PR tree-optimization/98182 * gcc.dg/tree-ssa/if-to-switch-1.c: Add case-values-threshold in order to fix them for aarch64. * gcc.dg/tree-ssa/if-to-switch-10.c: Likewise.
2020-12-09aarch64: Add CPU-specific SVE vector costs structKyrylo Tkachov2-116/+204
This patch extends the backend vector costs structures to allow for separate Advanced SIMD and SVE costs. The fields in the current cpu_vector_costs that would vary between the ISAs are moved into a simd_vec_cost struct and we have two typedefs of it: advsimd_vec_cost and sve_vec_costs. If, in the future, SVE needs some extra fields it could inherit from simd_vec_cost. The CPU vector cost tables in aarch64.c are updated for the struct changes. aarch64_builtin_vectorization_cost is updated to select either the Advanced SIMD or SVE costs field depending on the mode and field availability. No change in codegen is intended with this patch. gcc/ * config/aarch64/aarch64-protos.h (cpu_vector_cost): Move simd fields to... (simd_vec_cost): ... Here. Define. (advsimd_vec_cost): Define. (sve_vec_cost): Define. * config/aarch64/aarch64.c (generic_advsimd_vector_cost): Define. (generic_sve_vector_cost): Likewise. (generic_vector_cost): Update. (qdf24xx_advsimd_vector_cost): Define. (qdf24xx_vector_cost): Update. (thunderx_advsimd_vector_cost): Define. (thunderx_vector_cost): Update. (tsv110_advsimd_vector_cost): Define. (tsv110_vector_cost): Likewise. (cortexa57_advsimd_vector_cost): Define. (cortexa57_vector_cost): Update. (exynosm1_advsimd_vector_cost): Define. (exynosm1_vector_cost): Update. (xgene1_advsimd_vector_cost): Define. (xgene1_vector_cost): Update. (thunderx2t99_advsimd_vector_cost): Define. (thunderx2t99_vector_cost): Update. (thunderx3t110_advsimd_vector_cost): Define. (thunderx3t110_vector_cost): Update. (aarch64_builtin_vectorization_cost): Handle sve and advsimd vector cost fields.
2020-12-09c++: Decl module-specific semantic processingNathan Sidwell6-15/+205
This adds the module-specific logic to the various declaration processing routines in decl.c and semantic.c. I also adjust the rtti type creation, as those are all in the global module, so we need to temporarily clear the module_kind, when they are being created. Finally, I added init and fini module processing with the initialier giving a fatal error if you try and turn it on (so don't do that yet). gcc/cp/ * decl.c (duplicate_decls): Add module-specific redeclaration logic. (cxx_init_decl_processing): Export the global namespace, maybe initialize modules. (start_decl): Reject local-extern in a module, adjust linkage of template var. (xref_tag_1): Add module-specific redeclaration logic. (start_enum): Likewise. (finish_enum_value_list): Export unscoped members of an exported enum. (grokmethod): Implement p1779 linkage of in-class defined functions. * decl2.c (no_linkage_error): Imports are ok. (c_parse_final_cleanups): Call fini_modules. * lex.c (cxx_dup_lang_specific): Clear some module flags in the copy. * module.cc (module_kind): Define. (module_may_redeclare, set_defining_module): Stubs. (init_modules): Error on modules. (fini_modules): Stub. * rtti.c (push_abi_namespace): Save and reset module_kind. (pop_abi_namespace): Restore module kind. (build_dynamic_cast_1, tinfo_base_init): Adjust. * semantics.c (begin_class_definition): Add module-specific logic. (expand_or_defer_fn_1): Keep bodies of more fns when modules_p.
2020-12-09IBM Z: Build autovec-*-signaling-eq.c tests with exceptionsIlya Leoshkevich2-2/+2
According to https://gcc.gnu.org/pipermail/gcc/2020-November/234344.html, GCC is allowed to perform optimizations that remove floating point traps, since they do not affect the modeled control flow. This interferes with two signaling comparison tests, where (a <= b && a >= b) is turned into (a <= b && a == b) by test_for_singularity, into ((a <= b) & (a == b)) by vectorizer and then into (a == b) eliminate_redundant_comparison. Fix by making traps affect the control flow by turning them into exceptions. gcc/testsuite/ChangeLog: 2020-12-03 Ilya Leoshkevich <iii@linux.ibm.com> * gcc.target/s390/zvector/autovec-double-signaling-eq.c: Build with exceptions. * gcc.target/s390/zvector/autovec-float-signaling-eq.c: Likewise.
2020-12-09OpenMP: C/C++ parse 'omp allocate'Tobias Burnus5-1/+137
gcc/c-family/ChangeLog: * c-pragma.c (omp_pragmas): Add 'allocate'. * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_ALLOCATE. gcc/c/ChangeLog: * c-parser.c (c_parser_omp_allocate): New. (c_parser_omp_construct): Call it. gcc/cp/ChangeLog: * parser.c (cp_parser_omp_allocate): New. (cp_parser_omp_construct, cp_parser_pragma): Call it. gcc/testsuite/ChangeLog: * c-c++-common/gomp/allocate-5.c: New test.
2020-12-09Import HSA header files from AMDAndrew Stubbs4-504/+8920
These are the same header files that exist in the Radeon Open Compute Runtime project (as of October 2020), but they have been specially relicensed by AMD for use in GCC. The header files retain AMD copyright. include/ChangeLog: * hsa.h: Replace whole file. * hsa_ext_amd.h: New file. * hsa_ext_image.h: New file. libgomp/ChangeLog: * plugin/plugin-gcn.c: Include hsa_ext_amd.h. (HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT): Delete redundant definition.
2020-12-09c/98200 - improve error recovery for GIMPLE FERichard Biener2-0/+11
This avoids ICEing by making sure to propagate error early. 2020-12-09 Richard Biener <rguenther@suse.de> PR c/98200 gcc/c/ * gimple-parser.c (c_parser_gimple_postfix_expression): Return early on error. gcc/testsuite/ * gcc.dg/gimplefe-error-8.c: New testcase.
2020-12-09gfortran.dg/gomp/reduction4.f90: Fix testcaseTobias Burnus2-16/+21
Fix to 'omp scan' commit 005cff4e2ecbd5c4e2ef978fe4842fa3c8c79f47 gcc/testsuite/ChangeLog: * gfortran.dg/gomp/reduction4.f90: Update scan-trees, add lost testcase; move test with FE error to ... * gfortran.dg/gomp/reduction5.f90: ... here.
2020-12-09fold-const: Fix native_encode_initializer bitfield handling [PR98199]Jakub Jelinek2-2/+9
With the bit_cast changes, I have added support for bitfields which don't have scalar representatives. For bit_cast it works fine, as when mask is non-NULL, off is asserted to be 0. But when native_encode_initializer is called e.g. from sccvn with off > 0 (i.e. we are interested in encoding just a few bytes out of it somewhere from the middle or at the end), the following computations are incorrect. pos is a byte position from the start of the constructor, repr_size is the size in bytes of the bit-field representative and len is the length of the buffer. If the buffer is offsetted by positive off, those numbers are uncomparable though, we need to add off to len to make both count bytes from the start of the constructor, and o is a utility temporary set to off != -1 ? off : 0 (because off -1 also means start at offset 0 and just force special behavior). 2020-12-09 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/98199 * fold-const.c (native_encode_initializer): Fix handling bit-fields when off > 0. * gcc.c-torture/compile/pr98199.c: New test.
2020-12-09fold-const: Fix up native_encode_initializer missing field handling [PR98193]Jakub Jelinek2-0/+40
When native_encode_initializer is called with non-NULL mask (i.e. ATM bit_cast only), it checks if the current index in the CONSTRUCTOR (if any) is the next initializable FIELD_DECL, and if not, decrements cnt and performs the iteration with that FIELD_DECL as field and val of zero (so that it computes mask properly). As the testcase shows, I forgot to set pos to the byte position of the field though (like it is done for e.g. index referenced FIELD_DECLs in the constructor. 2020-12-09 Jakub Jelinek <jakub@redhat.com> PR c++/98193 * fold-const.c (native_encode_initializer): Set pos to field's byte position if iterating over a field with missing initializer. * g++.dg/cpp2a/bit-cast7.C: New test.
2020-12-09c++: Avoid [[nodiscard]] warning in requires-expr [PR98019]Jason Merrill2-1/+4
If we aren't really evaluating the expression, it doesn't matter that the return value is discarded. gcc/cp/ChangeLog: PR c++/98019 * cvt.c (maybe_warn_nodiscard): Check c_inhibit_evaluation_warnings. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-nodiscard1.C: Remove xfail.
2020-12-09c++: Don't require accessible dtors for some forms of new [PR59238]Jason Merrill3-2/+38
Jakub noticed that in build_new_1 we needed to add tf_no_cleanup to avoid building a cleanup for a TARGET_EXPR that we already know is going to be used to initialize something, so the cleanup will never be run. The best place to add it is close to where we build the INIT_EXPR; in cp_build_modify_expr fixes the single-object new, in expand_default_init fixes array new. Co-authored-by: Jakub Jelinek <jakub@redhat.com> gcc/cp/ChangeLog: PR c++/59238 * init.c (expand_default_init): Pass tf_no_cleanup when building a TARGET_EXPR to go on the RHS of an INIT_EXPR. * typeck.c (cp_build_modify_expr): Likewise. gcc/testsuite/ChangeLog: PR c++/59238 * g++.dg/cpp0x/new4.C: New test.
2020-12-09Daily bump.GCC Administrator10-1/+347
2020-12-09testsuite: Fix up testcase for ia32 [PR98191]Jakub Jelinek1-0/+1
2020-12-09 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/98191 * gcc.dg/torture/pr98191.c: Add dg-additional-options with -w -Wno-psabi.
2020-12-08c++: ICE with -fsanitize=vptr and constexpr dynamic_cast [PR98103]Marek Polacek2-1/+35
-fsanitize=vptr initializes all vtable pointers to null so that it can catch invalid calls; see cp_ubsan_maybe_initialize_vtbl_ptrs. That means that evaluating a vtable reference can produce a null pointer in this mode, so cxx_eval_dynamic_cast_fn should check that and give and error. gcc/cp/ChangeLog: PR c++/98103 * constexpr.c (cxx_eval_dynamic_cast_fn): If the evaluating of vtable yields a null pointer, give an error and return. Use objtype. gcc/testsuite/ChangeLog: PR c++/98103 * g++.dg/ubsan/vptr-18.C: New test.
2020-12-08libgo: update to 1.15.6 releaseIan Lance Taylor11-21/+202
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/276153
2020-12-08c++: Originating and instantiating moduleNathan Sidwell4-0/+66
With modules streamed entities have two new properties -- the module that declares them and the module that instantiates them. Here 'instantiate' applies to more than just templates -- for instance an implicit member fn. These may well be the same module. This adds the calls to places that need it. gcc/cp/ * class.c (layout_class_type): Call set_instantiating_module. (build_self_reference): Likewise. * decl.c (grokfndecl): Call set_originating_module. (grokvardecl): Likewise. (grokdeclarator): Likewise. * pt.c (maybe_new_partial_specialization): Call set_instantiating_module, propagate DECL_MODULE_EXPORT_P. (lookup_template_class_1): Likewise. (tsubst_function_decl): Likewise. (tsubst_decl, instantiate_template_1): Likewise. (build_template_decl): Propagate module flags. (tsubst_template_dcl): Likewise. (finish_concept_definition): Call set_originating_module. * module.cc (set_instantiating_module, set_originating_module): Stubs.
2020-12-08c++: Fix defaulted <=> fallback to < and == [PR96299]Jason Merrill7-31/+222
I thought I had implemented P1186R3, but apparently I didn't read it closely enough to understand the point of the paper, namely that for a defaulted operator<=>, if a member type doesn't have a viable operator<=>, we will use its operator< and operator== if the defaulted operator has an specific comparison category as its return type; the compiler can't guess if it should be strong_ordering or something else, but the user can make that choice explicit. The libstdc++ test change was necessary because of the change in genericize_spaceship from op0 > op1 to op1 < op0; this should be equivalent, but isn't because of PR88173. gcc/cp/ChangeLog: PR c++/96299 * cp-tree.h (build_new_op): Add overload that omits some parms. (genericize_spaceship): Add location_t parm. * constexpr.c (cxx_eval_binary_expression): Pass it. * cp-gimplify.c (genericize_spaceship): Pass it. * method.c (genericize_spaceship): Handle class-type arguments. (build_comparison_op): Fall back to op</== when appropriate. gcc/testsuite/ChangeLog: PR c++/96299 * g++.dg/cpp2a/spaceship-synth-neg2.C: Move error. * g++.dg/cpp2a/spaceship-p1186.C: New test. libstdc++-v3/ChangeLog: PR c++/96299 * testsuite/18_support/comparisons/algorithms/partial_order.cc: One more line needs to use VERIFY instead of static_assert.
2020-12-08c++: Distinguish ambiguity from no valid candidateJason Merrill1-0/+4
Several recent C++ features are specified to try overload resolution, and if no viable candidate is found, do something else. But our error return doesn't distinguish between that situation and finding multiple viable candidates that end up being ambiguous. We're already trying to separately return the single function we found even if it ends up being ill-formed for some reason; for ambiguity let's pass back error_mark_node, to be distinguished from NULL_TREE meaning no viable candidate. gcc/cp/ChangeLog: * call.c (build_new_op_1): Set *overload for ambiguity. (build_new_method_call_1): Likewise.
2020-12-08Avoid atomic for guard acquire when that is expensiveBernd Edlinger1-4/+29
When the atomic access involves a call to __sync_synchronize it is better to call __cxa_guard_acquire unconditionally, since it handles the atomics too, or is a non-threaded implementation when there is no gthread support for this target. This fixes also a bug for the ARM EABI big-endian target, that is, previously the wrong bit was checked. 2020-12-08 Bernd Edlinger <bernd.edlinger@hotmail.de> * decl2.c: (is_atomic_expensive_p): New helper function. (build_atomic_load_byte): Rename to... (build_atomic_load_type): ... and add new parameter type. (get_guard_cond): Skip the atomic here if that is expensive. Use the correct type for the atomic load on certain targets.
2020-12-08if-to-switch: fix matching of negative conditionsMartin Liska3-0/+68
gcc/ChangeLog: PR tree-optimization/98182 * gimple-if-to-switch.cc (pass_if_to_switch::execute): Request chain linkage through false edges only. gcc/testsuite/ChangeLog: PR tree-optimization/98182 * gcc.dg/tree-ssa/if-to-switch-10.c: New test. * gcc.dg/tree-ssa/pr98182.c: New test.
2020-12-08c++: template and clone fns for modulesNathan Sidwell3-20/+28
We need to expose build_cdtor_clones, it fortunately has the desired API -- gosh, how did that happen? :) The template machinery will need to cache path-of-instantiation information, so add two more fields to the tinst_level struct. I also had to adjust the match_mergeable_specialization API since adding it, so including that change too. gcc/cp/ * cp-tree.h (struct tinst_level): Add path & visible fields. (build_cdtor_clones): Declare. (match_mergeable_specialization): Use a spec_entry, add insert parm. * class.c (build_cdtor_clones): Externalize. * pt.c (push_tinst_level_loc): Clear new fields. (match_mergeable_specialization): Adjust API.
2020-12-08Raw tree accessorsNathan Sidwell1-9/+12
Here are the couple of raw accessors I make use of in the module streaming. gcc/ * tree.h (DECL_ALIGN_RAW): New. (DECL_ALIGN): Use it. (DECL_WARN_IF_NOT_ALIGN_RAW): New. (DECL_WARN_IF_NOT_ALIGN): Use it. (SET_DECL_WARN_IF_NOT_ALIGN): Likewise.
2020-12-08compiler: use correct location for iota errorsIan Lance Taylor4-11/+99
Also check for valid array length when reducing len/cap to a constant. For golang/go#8183 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/275654
2020-12-08libgcc: block signals when releasing split-stack memoryIan Lance Taylor1-0/+14
* generic-morestack-thread.c (free_segments): Block signals during thread exit.
2020-12-08arm: Replace calls to __builtin_vmvn* by ~ in vmvn intrinsics in arm_neon.h ↵Prathamesh Kulkarni2-15/+14
[PR66791] gcc/ 2020-12-08 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> PR target/66791 * config/arm/arm_neon.h: Replace calls to __builtin_vmvn* by ~ in vmvn intrinsics. * config/arm/arm_neon_builtins.def: Remove entry for vmvn.
2020-12-08c++: Named module global initializersNathan Sidwell2-45/+92
C++ 20 modules adds some new rules about when the global initializers of imported modules run. They must run no later than before any initializers in the importer that appear after the import. To provide this, each named module emits an idempotent global initializer that calls the global initializer functions of its imports (these of course may call further import initializers). This is the machinery in our global-init emission to accomplish that, other than the actual emission of calls, which is in the module file. The naming of this global init is a new piece of the ABI. FWIW, the module's emitter does some optimization to avoid calling a direct import's initializer when it can determine thatr import is also indirect. gcc/cp/ * decl2.c (start_objects): Refactor and adjust for named module initializers. (finish_objects): Likewise. (generate_ctor_or_dtor_function): Likewise. * module.cc (module_initializer_kind) (module_add_import_initializers): Stubs.
2020-12-08Fortran: Add 'omp scan' support of OpenMP 5.0Tobias Burnus20-41/+669
gcc/fortran/ChangeLog: * dump-parse-tree.c (show_omp_clauses, show_omp_node, show_code_node): Handle OMP SCAN. * gfortran.h (enum gfc_statement): Add ST_OMP_SCAN. (enum): Add OMP_LIST_SCAN_IN and OMP_LIST_SCAN_EX. (enum gfc_exec_op): Add EXEC_OMP_SCAN. * match.h (gfc_match_omp_scan): New prototype. * openmp.c (gfc_match_omp_scan): New. (gfc_match_omp_taskgroup): Cleanup. (resolve_omp_clauses, gfc_resolve_omp_do_blocks, omp_code_to_statement, gfc_resolve_omp_directive): Handle 'omp scan'. * parse.c (decode_omp_directive, next_statement, gfc_ascii_statement): Likewise. * resolve.c (gfc_resolve_code): Handle EXEC_OMP_SCAN. * st.c (gfc_free_statement): Likewise. * trans-openmp.c (gfc_trans_omp_clauses, gfc_trans_omp_do, gfc_split_omp_clauses): Handle 'omp scan'. libgomp/ChangeLog: * testsuite/libgomp.fortran/scan-1.f90: New test. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/reduction4.f90: Update; move FE some tests to ... * gfortran.dg/gomp/reduction6.f90: ... this new test and ... * gfortran.dg/gomp/reduction7.f90: ... this new test. * gfortran.dg/gomp/reduction5.f90: Add dg-error. * gfortran.dg/gomp/scan-1.f90: New test. * gfortran.dg/gomp/scan-2.f90: New test. * gfortran.dg/gomp/scan-3.f90: New test. * gfortran.dg/gomp/scan-4.f90: New test. * gfortran.dg/gomp/scan-5.f90: New test. * gfortran.dg/gomp/scan-6.f90: New test. * gfortran.dg/gomp/scan-7.f90: New test.