- 16 Apr, 2020 14 commits
-
-
Here we're ICE'ing in do_narrow during error-recovery, because ocp_convert returns error_mark_node after it attempts to reduce a const decl to its erroneous DECL_INITIAL via scalar_constant_value, and we later pass this error_mark_node to fold_build2 which isn't prepared to handle error_mark_nodes. We could fix this ICE in do_narrow by checking if ocp_convert returns error_mark_node, but for the sake of consistency and for better error recovery it seems it'd be preferable if ocp_convert didn't care that a const decl's initializer is erroneous and would instead proceed as if the decl was not const, which is the approach that this patch takes. gcc/cp/ChangeLog: PR c++/94475 * cvt.c (ocp_convert): If the result of scalar_constant_value is erroneous, ignore it and use the original expression. gcc/testsuite/ChangeLog: PR c++/94475 * g++.dg/conversion/err-recover2.C: New test. * g++.dg/diagnostic/pr84138.C: Remove now-bogus warning. * g++.dg/warn/Wsign-compare-8.C: Remove now-bogus warning.
Patrick Palka committed -
Make it possible to have different instrumented and feedback builds without copying gcda files around [pr93401] Hi, in GCC 8 we changed -fprofile-generate=<path> to use mangled absolute paths in the <path> directory. This was necessary to avoid clashes of files when gcc is executed from different directories to build different sources of same filename. However this made it difficult to build projects on setups where instrumented build is done in one directory, feedback build in different and possibly training happens in yet another directory structure. This happens i.e. for Firefox builds for month or two. This patch adds -fprofile-prefix-path that can be used to inform gcc where the root of build directory is and strip it form the gcda filenames. This is similar to exisitng debug-prefix-map but without the map feature since it seems useless for profile data. We spent quite some time with Maritn Liska discussing options and found no better solution. I was looking how this work on LLVM and they produce single profdata file which is then transformed into kind of simple database by llvmprofdata tool. This database keys functions by filename and symbol name. If you arrane two files with same name define static variable with same symbol name this gets messedup and result in wrong info. So I think this is not very good solution and preffer the extra option. Bootstrapped/regtested x86_64-linux. I plan to commit it later today if there are no complains. I suppose our manual could have some central section on profile feedback explaining the whole setup at one place. Honza PR gcov-profile/93401 * common.opt (profile-prefix-path): New option. * coverae.c: Include diagnostics.h. (coverage_init): Strip profile prefix path. * doc/invoke.texi (-fprofile-prefix-path): Document.
Jan Hubicka committed -
early-remat.c:process_block wasn't handling insns that set multiple candidate registers, which led to an assertion failure at the end of the main loop. Instructions that set two pseudos aren't rematerialisation candidates in themselves, but we still need to track them if another instruction that sets the same register is a rematerialisation candidate. 2020-04-16 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR rtl-optimization/94605 * early-remat.c (early_remat::process_block): Handle insns that set multiple candidate registers. gcc/testsuite/ PR rtl-optimization/94605 * gcc.target/aarch64/sve/pr94605.c: New test.
Richard Sandiford committed -
This removes { dg-final { scan-tree-dump "tiled" "graphite" } } scans from graphite tests that pass/fail dependent on the ISL version used. Note all scans match the actually dumped "not tiled" messages with ISL 0.12 and not the alternative "tiled by <number>". With ISL 0.22 neither is printed because the tiling infrastructure doesn't expect the new schedule layout (though looking at a few cases it looks superior with more dimensions marked as permutable. Anyway, the scans have nothing to do with interchange and just add to testsuite noise. 2020-04-16 Richard Biener <rguenther@suse.de> * gcc.dg/graphite/interchange-1.c: Remove scan for tiled. * gcc.dg/graphite/interchange-10.c: Likewise. * gcc.dg/graphite/interchange-11.c: Likewise. * gcc.dg/graphite/interchange-3.c: Likewise. * gcc.dg/graphite/interchange-4.c: Likewise. * gcc.dg/graphite/interchange-7.c: Likewise. * gcc.dg/graphite/interchange-9.c: Likewise. * gcc.dg/graphite/uns-interchange-9.c: Likewise. * gfortran.dg/graphite/interchange-3.f90: Likewise.
Richard Biener committed -
This adjusts emit_move_multi_word to handle moves into paradoxical subregs parts that are not there and adjusts lower-subregs CLOBBER resolving to deal with those as well. 2020-04-16 Richard Biener <rguenther@suse.de> PR middle-end/94614 * expr.c (emit_move_multi_word): Do not generate code when the destination part is undefined_operand_subword_p. * lower-subreg.c (resolve_clobber): Look through a paradoxica subreg.
Richard Biener committed -
As Iain reported, my change broke the case when one has bison >= 3, but make decides there is no reason to regenerate plural.c, unfortunately that seems to be a scenario I haven't tested. The problem is that the pregenerated plural.c has been generated with bison 1.35, but when config.h says HAVE_BISON3, the code assumes it is the bison3 variant. What used to work fine is when one has bison >= 3 and plural.c has been regenerated (e.g. do touch intl/plural.y and it will work), or when one doesn't have any bison (then nothing is regenerated, but HAVE_BISON3 isn't defined either), or when one has bison < 3 and doesn't need to regenerate, or when one has bison < 3 and it is regenerated. The following patch fixes this, by killing the HAVE_BISON3 macro from config.h, and instead remembering the fact whether plural.c has been created with bison < 3 or bison >= 3 in a separate new plural-config.h header. The way this works: - user doesn't have bison - user has bison >= 3, but intl/{plural-config.h,plural.c} aren't older than intl/plural.y - user has bison < 3, but intl/{plural-config.h,plural.c} aren't older than intl/plural.y pregenerated !USE_BISON3 plural.c and plural-config.h from source dir is used, nothing in the objdir - user has bison >= 3 and intl/plural.y is newer Makefile generates plural.c and USE_BISON3 plural-config.h in the objdir, which is then used in preference to srcdir copies - user has bison < 3 and intl/plural.y is newer Makefile generates plural.c and !USE_BISON3 plural-config.h in the objdir, which is then used in preference to srcdir copies I have tested all these cases and make all-yes worked in all the cases. If one uses the unsupported ./configure where srcdir == objdir, I guess (though haven't tested) that it should still work, just it would be nice if such people didn't try to check in the plural{.c,-config.h} they have regenerated. What doesn't work, but didn't work before either (just tested gcc-9 branch too) is when one doesn't have bison and plural.y is newer than plural.c. Don't do that ;) 2020-04-16 Jakub Jelinek <jakub@redhat.com> PR bootstrap/92008 intl/ * configure.ac: Remove HAVE_BISON3 AC_DEFINE. * Makefile.in (HEADERS): Add plural-config.h. (.y.c): Also create plural-config.h. (dcigettext.o loadmsgcat.o plural.o plural-exp.o): Also depend on plural-config.h. (plural-config.h): Depend on plural.c. * plural-exp.h: Include plural-config.h. Use USE_BISON3 instead of HAVE_BISON3. * plural.y: Use USE_BISON3 instead of HAVE_BISON3. * configure: Regenerated. * plural.c: Regenerated. * config.h.in: Regenerated. * plural-config.h: Generated. contrib/ * gcc_update: Add intl/plural.y dependency for intl/plural-config.h.
Jakub Jelinek committed -
get_ref_base_and_extent recognizes ARRAY_REFs with variable index but into arrays of length one as constant offset accesses. However, max_size in such cases is extended to span the whole element. This confuses SRA verification when SRA also builds its (total scalarization) access structures to describe fields under such array - get_ref_base_and_extent returns different size and max_size for them. Fixed by not performing the check for total scalarization accesses. The subsequent check then had to be changed to use size and not max_size too, which meant it has to be skipped when the access structure describes a genuine variable array access. Bootstrapped and tested on x86_64-linux. 2020-04-16 Martin Jambor <mjambor@suse.cz> PR tree-optimization/94598 * tree-sra.c (verify_sra_access_forest): Fix verification of total scalarization accesses under access to one-element arrays. testsuite/ * gcc.dg/tree-ssa/pr94598.c: New test.
Martin Jambor committed -
This test got committed into a spot where nothing actually tests it. As there is no main, I assume it was meant to be gcc.c-torture/compile/ test and the test PASSes after moving there (both x86_64-linux and i686-linux). Though, it passed before the PR92372 fixes too. 2020-04-16 Jakub Jelinek <jakub@redhat.com> PR ipa/92372 * gcc.c-torture/pr92372.c: Move ... * gcc.c-torture/compile/pr92372.c: ... here.
Jakub Jelinek committed -
GCC 4.2 (but I think not the latest tip of GCC 4.2 branch) has broken value initialization, see PR33916. The following patch provides a workaround for that. Tested with GCC 4.2 on a reduced testcase I've distilled from the assign_param_data_one class which has been miscompiled the same. 2020-04-16 Jakub Jelinek <jakub@redhat.com> PR bootstrap/89494 * function.c (assign_parm_find_data_types): Add workaround for BROKEN_VALUE_INITIALIZATION compilers.
Jakub Jelinek committed -
bison 3 apparently made a backwards incompatible change, dropped YYLEX_PARAM/YYPARSE_PARAM support and instead needs %param or %lex-param and %parse-param. Furthermore, there is no easy way to conditionalize on bison version in the *.y files. While e.g. glibc bumped bison requirement and just has the bison 3 compatible version, Richi said there are still systems with older bison where we want to build gcc. So, this patch instead determines during configure bison version, and depending on that when building plural.c (if building it at all) tweaks what is passed over to bison if needed. Tested with both bison 3 and bison 1.35, in each case with reconfiguring intl and building with make all-yes (as in my setup intl isn't normally used). 2020-04-16 Jakub Jelinek <jakub@redhat.com> PR bootstrap/92008 * configure.ac: Add check for bison >= 3, AC_DEFINE HAVE_BISON3 and AC_SUBST BISON3_YES and BISON3_NO. * Makefile.in (.y.c): Prefix $(YACC) invocation with @BISON3_NO@, add @BISON3_YES@ prefixed rule to adjust the *.y source using sed and adjust output afterwards. * plural-exp.h (PLURAL_PARSE): If HAVE_BISON3 is defined, use struct parse_args * type for arg instead of void *. * plural.y: Add magic /* BISON3 ... */ comments with bison >= 3 directives. (YYLEX_PARAM, YYPARSE_PARAM): Don't define if HAVE_BISON3 is defined. (yylex, yyerror): Adjust prototypes and definitions if HAVE_BISON3 is defined. * plural.c: Regenerated. * config.h.in: Regenerated. * configure: Regenerated.
Jakub Jelinek committed -
This adds the SSA name version to the gdb pretty-printing of SSA names. (gdb) p (tree)$1 $5 = <ssa_name 0x7ffff68435a0 323> 2020-04-16 Richard Biener <rguenther@suse.de> * gdbhooks.py (TreePrinter): Print SSA_NAME_VERSION of SSA_NAME nodes.
Richard Biener committed -
* testsuite/20_util/unsynchronized_pool_resource/allocate.cc: Remove name of unused parameter.
Jonathan Wakely committed -
This snippet has been copied from the non-structured binding declaration parsing later in the function, and while for non-structured bindings it can be followed by comma or semicolon, structured bindings may be only followed by semicolon. Or, do we want to have a different message for the case when there is a comma (and keep this corrected one only if there is something else) that would explain better what is the bug (or add a fix-it hint)? Marek said in the PR that clang++ reports error: decomposition declaration must be the only declaration in its group There is another thing Marek noted (though, something for different spot), that diagnostic for auto x(1), [e,f] = test2; could also use a clearer wording like the above (or a fix-it hint), but the question is if we should assume [ after , as a structured binding or if we should do some tentative parsing first to figure out if it looks like a structured binding. 2020-04-16 Jakub Jelinek <jakub@redhat.com> PR c++/94571 * parser.c (cp_parser_simple_declaration): Fix up a pasto in diagnostics. * g++.dg/cpp1z/decomp51.C: New test.
Jakub Jelinek committed -
GCC Administrator committed
-
- 15 Apr, 2020 15 commits
-
-
This is the same issue as #33960, but on gofrontend. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/220297
eric fang committed -
Some more C++20 changes from P1614R2, "The Mothership has Landed". * include/bits/fs_dir.h (file_status): Define operator== for C++20. (directory_entry): Define operator<=> and remove redundant comparison operators for C++20. * include/bits/fs_fwd.h (space_info): Define operator== for C++20. * include/bits/fs_path.h (path): Define operator<=> and remove redundant comparison operators for C++20. * testsuite/27_io/filesystem/path/compare/compare.cc: Fix comment. * testsuite/27_io/filesystem/path/compare/lwg2936.cc: Likewise. * testsuite/27_io/filesystem/path/compare/path.cc: Likewise. * testsuite/27_io/filesystem/path/compare/strings.cc: Likewise.
Jonathan Wakely committed -
PR go/94607 * go-gcc.cc (class Gcc_backend): Define builtin_const, builtin_noreturn, builtin_novops. (Gcc_backend::define_builtin): Change const_p and noreturn_p parameters to a single flags parameter. Change all callers. (Gcc_backend::Gcc_backend): Pass novops for prefetch.
Ian Lance Taylor committed -
Some more C++20 changes from P1614R2, "The Mothership has Landed". This removes all redundant equality and inequality operators in the Utilities clause, as they can be synthesized from the remaining equality operators. It also removes the single redundant operator in the Localization clause, because it didn't seem worth doing in a separate commit. * include/bits/allocator.h (operator!=): Do not define for C++20. * include/bits/locale_classes.h (operator!=): Likewise. * include/bits/std_function.h (operator==(nullptr_t, const function&)) (operator!=(const function&, nullptr_t)) (operator!=(nullptr_t, const function&)): Likewise. * include/ext/bitmap_allocator.h (operator!=): Likewise. * include/ext/debug_allocator.h (operator!=): Likewise. * include/ext/extptr_allocator.h (operator!=): Likewise. * include/ext/malloc_allocator.h (operator!=): Likewise. * include/ext/mt_allocator.h (operator!=): Likewise. * include/ext/new_allocator.h (operator!=): Likewise. * include/ext/pool_allocator.h (operator!=): Likewise. * include/ext/throw_allocator.h (operator!=): Likewise. * include/std/bitset (bitset::operator!=): Likewise. * include/std/memory_resource (operator!=): Likewise. * include/std/scoped_allocator (operator!=): Likewise.
Jonathan Wakely committed -
Another C++20 change from P1614R2, "The Mothership has Landed". * include/std/typeindex (operator<=>): Define for C++20. * testsuite/20_util/typeindex/comparison_operators_c++20.cc: New test.
Jonathan Wakely committed -
gcc/fortran/ChangeLog: 2020-04-15 Fritz Reese <foreese@gcc.gnu.org> Linus Koenig <link@sig-st.de> PR fortran/94192 * simplify.c (simplify_bound): Simplify condition for error check.
Fritz Reese committed -
PR target/94603 * config/i386/i386-builtin.def (__builtin_ia32_movq128): Require OPTION_MASK_ISA_SSE2. testsuite/ChangeLog: PR target/94603 * gcc.target/i386/pr94603.c: New test.
Uros Bizjak committed -
GCC 4.2 due to PR33916 miscompiles temp_dump_context ctor, because it doesn't zero initialize the whole dump_context temporary on which it runs the static get method and during destruction of the temporary an uninitialized pointer is deleted. More recent GCC versions properly zero initialize it and ideally optimize away the construction/destruction of the temporary, as it isn't used for anything, but there is no reason to create the temporary, static member functions can be called without an associated object. 2020-04-15 Gustavo Romero <gromero@linux.ibm.com> PR bootstrap/89494 * dumpfile.c (selftest::temp_dump_context::temp_dump_context): Don't construct a dump_context temporary to call static method.
Gustavo Romero committed -
2020-04-15 Andrea Corallo <andrea.corallo@arm.com> * config/aarch64/falkor-tag-collision-avoidance.c (valid_src_p): Check for aarch64_address_info type before accessing base field.
Andrea Corallo committed -
This patch fixes an ICE we were seeing due to a missing vec_duplicate pattern. gcc/ChangeLog: 2020-04-15 Andre Vieira <andre.simoesdiasvieira@arm.com> * config/arm/mve.md (mve_vec_duplicate<mode>): New pattern. (V_sz_elem2): Remove unused mode attribute. gcc/testsuite/ChangeLog: 2020-04-15 Andre Vieira <andre.simoesdiasvieira@arm.com> Srinath Parvathaneni <srinath.parvathaneni@arm.com> * gcc.target/arm/mve/intrinsics/mve_vec_duplicate.c: New test.
Andre Vieira committed -
Without disabling this, the pattern can try and move DImode values between floating point registers and general registers. The constraints on this pattern can't handle that, and reload goes into an infinite loop. This was the cause of a testsuite failure in cde_v_1_mve.c, which is now gone. A DImode move for MVE now uses the `movdi_vfp` pattern, which is the same pattern used for such a move when MVE is not available but the target has TARGET_HARD_FLOAT. Testing done: Bootstrapped and regtested on arm-none-linux-gnueabihf regtested on arm-none-eabi gcc/ChangeLog: 2020-04-15 Matthew Malcomson <matthew.malcomson@arm.com> * config/arm/arm.md (arm_movdi): Disallow for MVE.
Matthew Malcomson committed -
As reported in the PR, GCC 10 (and also 9.3.1 but not 9.3.0) fails to build when using older binutils which lack LSE support, because those instructions are used in libgcc. Thanks to Kyrylo's hint, the following patches (hopefully) allow it to build even with older binutils by using .inst directive if LSE support isn't available in the assembler. 2020-04-15 Jakub Jelinek <jakub@redhat.com> PR target/93053 * configure.ac (LIBGCC_CHECK_AS_LSE): Add HAVE_AS_LSE checking. * config/aarch64/lse.S: Include auto-target.h, if HAVE_AS_LSE is not defined, use just .arch armv8-a. (B, M, N, OPN): Define. (COMMENT): New .macro. (CAS, CASP, SWP, LDOP): Use .inst directive if HAVE_AS_LSE is not defined. Otherwise, move the operands right after the glue? and comment out operands where the macros are used. * configure: Regenerated. * config.in: Regenerated.
Jakub Jelinek committed -
This change started with a bugreport about a typo in one requires testcase (diagnosed with -Wunknown-pragmas only), but following discussion lead to noting that we do not diagnose restriction that requires directives in C/C++ may only appear at file or namespace scope; and several our tests violated that. 2020-04-15 Jakub Jelinek <jakub@redhat.com> PR c/94593 * c-parser.c (c_parser_pragma) <case PRAGMA_OMP_REQUIRES>: Reject requires directive when not at file scope. * parser.c (cp_parser_pragma) <case PRAGMA_OMP_REQUIRES>: Reject requires directive when not at file or namespace scope. * c-c++-common/gomp/requires-1.c: Fix a typo, requries -> requires. Move directives to file scope. (i): Remove. * c-c++-common/gomp/requires-2.c: Move directives to file scope. (i, foo): Remove. * c-c++-common/gomp/requires-4.c: Move directives to file scope. * c-c++-common/gomp/atomic-19.c: Move requires directive to file scope. * c-c++-common/gomp/atomic-20.c: Likewise. * c-c++-common/gomp/atomic-21.c: Likewise. * c-c++-common/gomp/atomic-22.c: Likewise. * gcc.dg/gomp/requires-1.c: New test. * g++.dg/gomp/requires-1.C: New test. * g++.dg/gomp/requires-2.C: New test. * g++.dg/gomp/atomic-18.C: Move requires directive to file scope.
Jakub Jelinek committed -
This makes same_type_for_tbaa_p conservative in the same way get_alias_set is about void * which we allow to alias all other pointers. 2020-04-15 Richard Biener <rguenther@suse.de> PR middle-end/94539 * tree-ssa-alias.c (same_type_for_tbaa): Defer to alias_sets_conflict_p for pointers. * gcc.dg/alias-14.c: Make dg-do run.
Richard Biener committed -
GCC Administrator committed
-
- 14 Apr, 2020 11 commits
-
-
Patterns zero_extendhisi2, zero_extendqisi2 and extendhisi2_internal can load value from memory, but they don't treat volatile memory correctly. Add %v1 before load instructions to emit 'memw' instruction when -mserialize-volatile is in effect. 2020-04-14 Max Filippov <jcmvbkbc@gmail.com> gcc/ * config/xtensa/xtensa.md (zero_extendhisi2, zero_extendqisi2) (extendhisi2_internal): Add %v1 before the load instructions. gcc/testsuite/ * gcc.target/xtensa/pr94584.c: New test.
Max Filippov committed -
* sv.po: Update.
Joseph Myers committed -
My "simplification" of std::compare_three_way's constraints in commit f214ffb3 was incorrect, because std::three_way_comparable_with imposes additional restrictions beyond the <=> expression being valid. * libsupc++/compare (compare_three_way): Fix constraint so that BUILTIN-PTR-THREE-WAY does not require three_way_comparable_with. * testsuite/18_support/comparisons/object/builtin-ptr-three-way.cc: New test.
Jonathan Wakely committed -
This also implements the proposed resolution to LWG issue 3247, so that the ill-formed <=> expression with nullptr is not used. PR libstdc++/94562 * include/bits/shared_ptr.h (operator<=>): Define for C++20. * include/bits/shared_ptr_base.h (operator<=>): Likewise. * include/bits/unique_ptr.h (operator<=>): Add inline specifier. * testsuite/20_util/shared_ptr/comparison/cmp_c++20.cc: New test. * testsuite/20_util/shared_ptr/comparison/less.cc: Do not expect std::less<A*> to be used when comparing std::shared_ptr<A> objects in C++20.
Jonathan Wakely committed -
For symmetric transfers to work with C++20 coroutines, it is currently necessary to tail call the callee coroutine from resume method of the caller coroutine. The current codegen marks these resume calls as "MUST_TAIL_CALL" to indicate that the tail call is required for correctness. Unfortunately, several targets have ABI constraints that prevent an indirect tail-call, which results in the PRs compile error. The change here tests the target sibcall hook for the resume expression and only marks it as requiring a tail call if that's supported. This doesn't fix the underlying problem; that really a solution is needed to allow the tail-calls (or equivalent) to take place - but that will be deferred until next stage 1. gcc/cp/ChangeLog: 2020-04-14 Iain Sandoe <iain@sandoe.co.uk> PR c++/94359 * coroutines.cc (build_actor_fn): Check that the target can support the resume tailcall before mandating it. gcc/testsuite/ChangeLog: 2020-04-14 Iain Sandoe <iain@sandoe.co.uk> PR c++/94359 * g++.dg/coroutines/torture/symmetric-transfer-00-basic.C: Expect a run fail for targets without arbitrary indirect tail-calls.
Iain Sandoe committed -
Jonathan Wakely committed
-
For rs6000 target, it is not valid to make PC-relative references to TLS symbols. So addr_to_insn_form() needs to check if things are TLS before returning PC-rel forms. 2020-04-14 Aaron Sawdey <acsawdey@linux.ibm.com> PR target/94542 * config/rs6000/rs6000.c (address_to_insn_form): Do not attempt to use PC-relative addressing for TLS references.
Aaron Sawdey committed -
gcc/testsuite/ChangeLog: PR c++/93207 * g++.dg/concepts/variadic5.C: New test.
Patrick Palka committed -
This fixes a garbled concepts diagnostic by moving the handling of DECLTYPE_TYPE from pp_cxx_type_specifier_seq to cxx_pretty_printer::simple_type_specifier, a move which also seems to be more consistent with the language grammar. This patch also fixes pretty printing of rvalue reference types via cxx_pretty_printer::type_id, which eventually calls pp_c_pointer which currently doesn't distinguish between lvalue and rvalue references. gcc/c-family/ChangeLog: PR c++/85278 * c-pretty-print.c (pp_c_pointer) <case REFERENCE_TYPE>: Print a double ampersand if it's an rvalue reference type. gcc/cp/ChangeLog: PR c++/85278 * cxx-pretty-print.c (cxx_pretty_printer:simple_type_specifier) <case DECLTYPE_TYPE>: Handle DECLTYPE_TYPE here instead of ... (pp_cxx_type_specifier_seq) <case DECLTYPE_TYPE>: ... here. (cxx_pretty_printer::direct_abstract_declarator) <case DECLTYPE_TYPE>: New no-op case. gcc/testsuite/ChangeLog: PR c++/85278 * g++.dg/concepts/diagnostic9.C: New test.
Patrick Palka committed -
IPA-SRA can segfault when processing a call to an internal function because such calls do not have corresponding call graphs and should be treated like memory accesses anyway, which what the patch below does. The patch makes an attempt to differentiate between reads and writes, although for things passed by value it does not make any difference. It treats all arguments of functions denoted with internal_store_fn_p as written to, even though in practice only some are, but for IPA-SRA purposes, actions needed to be taken when processing a read are also always performed when analyzing a write, so the code is just slightly pessimistic. But not as pessimistic as bailing out on any internal call immediately. I have LTO bootstrapped and tested the patch on x86_64-linux and normally bootstrapped and tested it on aarch64-linux, although one which is not SVE capable. I would appreciate testing on such machine too - as well as a small testcase that would follow all relevant conventions in gcc.target/aarch64/sve. 2020-04-14 Martin Jambor <mjambor@suse.cz> PR ipa/94434 * ipa-sra.c: Include internal-fn.h. (enum isra_scan_context): Update comment. (scan_function): Treat calls to internal_functions like loads or stores.
Martin Jambor committed -
When evaluating the initializer of 'a' in the following example struct A { A() = default; A(const A&); A *p = this; }; constexpr A foo() { return {}; } constexpr A a = foo(); the PLACEHOLDER_EXPR for 'this' in the aggregate initializer returned by foo gets resolved to the RESULT_DECL of foo. But due to guaranteed RVO, the 'this' should really be resolved to '&a'. Fixing this properly by immediately resolving 'this' and PLACEHOLDER_EXPRs to the ultimate object under construction would in general mean that we would no longer be able to cache constexpr calls for which RVO possibly applies, because the result of the call may now depend on the ultimate object under construction. So as a mostly correct stopgap solution that retains cachability of RVO'd constexpr calls, this patch fixes this issue by rewriting all occurrences of the RESULT_DECL in the result of a constexpr function call with the current object under construction, after the call returns. This means the 'this' pointer during construction of the temporary will still point to the temporary object instead of the ultimate object, but besides that this approach seems functionally equivalent to the proper approach. gcc/cp/ChangeLog: PR c++/94034 * constexpr.c (replace_result_decl_data): New struct. (replace_result_decl_data_r): New function. (replace_result_decl): New function. (cxx_eval_call_expression): Use it. * tree.c (build_aggr_init_expr): Set the location of the AGGR_INIT_EXPR to that of its initializer. gcc/testsuite/ChangeLog: PR c++/94034 * g++.dg/cpp0x/constexpr-empty15.C: New test. * g++.dg/cpp1y/constexpr-nsdmi6a.C: New test. * g++.dg/cpp1y/constexpr-nsdmi6b.C: New test. * g++.dg/cpp1y/constexpr-nsdmi7a.C: New test. * g++.dg/cpp1y/constexpr-nsdmi7b.C: New test.
Patrick Palka committed
-