aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-04-05c++: constexpr error with fn redecl in local scope [PR111132]Marek Polacek4-8/+47
We evaluate constexpr functions on the original, pre-genericization bodies. That means that the function body we're evaluating will not have gone through cp_genericize_r's "Map block scope extern declarations to visible declarations with the same name and type in outer scopes if any". Here: constexpr bool bar() { return true; } // #1 constexpr bool foo() { constexpr bool bar(void); // #2 return bar(); } it means that we: 1) register_constexpr_fundef (#1) 2) cp_genericize (#1) nothing interesting happens 3) register_constexpr_fundef (foo) does copy_fn, so we have two copies of the BIND_EXPR 4) cp_genericize (foo) this remaps #2 to #1, but only on one copy of the BIND_EXPR 5) retrieve_constexpr_fundef (foo) we find it, no problem 6) retrieve_constexpr_fundef (#2) and here #2 isn't found in constexpr_fundef_table, because we're working on the BIND_EXPR copy where #2 wasn't mapped to #1 so we fail. We've only registered #1. It should work to use DECL_LOCAL_DECL_ALIAS (which used to be extern_decl_map). We evaluate constexpr functions on pre-cp_fold bodies to avoid diagnostic problems, but the remapping I'm proposing should not interfere with diagnostics. This is not a problem for a global scope redeclaration; there we go through duplicate_decls which keeps the DECL_UID: DECL_UID (olddecl) = olddecl_uid; and DECL_UID is what constexpr_fundef_hasher::hash uses. PR c++/111132 gcc/cp/ChangeLog: * constexpr.cc (get_function_named_in_call): Use cp_get_fndecl_from_callee. * cvt.cc (cp_get_fndecl_from_callee): If there's a DECL_LOCAL_DECL_ALIAS, use it. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-redeclaration3.C: New test. * g++.dg/cpp0x/constexpr-redeclaration4.C: New test.
2024-04-05vect: Don't clear base_misaligned in update_epilogue_loop_vinfo [PR114566]Jakub Jelinek2-7/+35
The following testcase is miscompiled, because in the vectorized epilogue the vectorizer assumes it can use aligned loads/stores (if the base decl gets alignment increased), but it actually doesn't increase that. This is because r10-4203-g97c1460367 added the hunk following patch removes. The explanation feels reasonable, but actually it is not true as the testcase proves. The thing is, we vectorize the main loop with 64-byte vectors and the corresponding data refs have base_alignment 16 (the a array has DECL_ALIGN 128) and offset_alignment 32. Now, because of the offset_alignment 32 rather than 64, we need to use unaligned loads/stores in the main loop (and ditto in the first load/store in vectorized epilogue). But the second load/store in the vectorized epilogue uses only 32-byte vectors and because it is a multiple of offset_alignment, it checks if we could increase alignment of the a VAR_DECL, the function returns true, sets base_misaligned = true and says the access is then aligned. But when update_epilogue_loop_vinfo clears base_misaligned with the assumption that the var had to have the alignment increased already, the update of DECL_ALIGN doesn't happen anymore. Now, I'd think this base_alignment = false was needed before r10-4030-gd2db7f7901 change was committed where it incorrectly overwrote DECL_ALIGN even if it was already larger, rather than just always increasing it. But with that change in, it doesn't make sense to me anymore. Note, the testcase is latent on the trunk, but reproduces on the 13 branch. 2024-04-05 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/114566 * tree-vect-loop.cc (update_epilogue_loop_vinfo): Don't clear base_misaligned. * gcc.target/i386/avx512f-pr114566.c: New test.
2024-04-05modula2: Add m2.install-dvi in gcc/m2/Make-lang.inChristophe Lyon1-0/+12
m2 has a m2.dvi build rule, but lacks the m2.install-dvi one. 2024-04-04 Christophe Lyon <christophe.lyon@linaro.org> gcc/m2/ * Make-lang.in (m2.install-dvi): New rule.
2024-04-05Revert "Fix ICE with -g and -std=c23 related to incomplete types [PR114361]"Martin Uecker4-39/+0
This reverts commit 871bb5ad2dd56343d80b6a6d269e85efdc9999e5 because it breaks LTO and needs a bit more work. See PR 114574.
2024-04-05middle-end/114599 - fix bitmap allocation for check_ifunc_callee_symtab_nodesRichard Biener1-4/+7
There's no default bitmap obstack during global CTORs, so allocate the bitmap locally. PR middle-end/114599 PR gcov-profile/114115 * symtab.cc (ifunc_ref_map): Do not use auto_bitmap. (is_caller_ifunc_resolver): Optimize bitmap_bit_p/bitmap_set_bit pair. (symtab_node::check_ifunc_callee_symtab_nodes): Properly allocate ifunc_ref_map here.
2024-04-05testsuite: Fix up error on gcov1.dJakub Jelinek2-2/+3
On Fri, Feb 23, 2024 at 12:18:00PM +0100, Jørgen Kvalsvik wrote: > This is a mostly straight port from the gcov-19.c tests from the C test > suite. The only notable differences from C to D are that D flips the > true/false outcomes for loop headers, and the D front end ties loop and > ternary conditions to slightly different locus. > > The test for >64 conditions warning is disabled as it either needs > support from the testing framework or a something similar to #pragma GCC > diagnostic push to not cause a test failure from detecting a warning. > > gcc/testsuite/ChangeLog: > > * gdc.dg/gcov.exp: New test. > * gdc.dg/gcov1.d: New test. Unfortunately, this doesn't work. I see PASS: gdc.dg/gcov1.d execution test ERROR: (DejaGnu) proc "run-gcov conditions { --conditions gcov1.d }" does not exist. The error code is TCL LOOKUP COMMAND run-gcov The info on the error is: invalid command name "run-gcov" while executing "::tcl_unknown run-gcov conditions { --conditions gcov1.d }" ("uplevel" body line 1) invoked from within "uplevel 1 ::tcl_unknown $args" ERROR: gdc.dg/gcov1.d : error executing dg-final: invalid command name "run-gcov" both on x86_64-linux and i686-linux. The problem is that the test hasn't been added to a new directory, but to a directory already covered by a different *.exp file - dg.exp. Now, usually either one has a test directory like gcc.misc-tests where there are many *.exp files but each *.exp file globs for its own tests, or there is one *.exp per directory and covers everything in there. By having both dg.exp and gcov.exp in the same directory with dg.exp covering all *.d files in there and gcov gcov*.d in there, the gcov*.d tests are tested twice, once using the dg.exp driver and once using gcov.exp driver. With the latter, they do work properly, with the former they don't because gcov.exp lib file isn't loaded and so run-gcov isn't available. The following patch fixes that similarly how g++.dg/modules/modules.exp, gcc.target/s390/s390.exp or gcc.target/i386/i386.exp deal with that, by pruning some tests based on glob patterns from the list. 2024-04-05 Jakub Jelinek <jakub@redhat.com> * gdc.dg/dg.exp: Prune gcov*.d from the list of tests to run. * gdc.dg/gcov.exp: Update copyright years.
2024-04-05c++: Fix ICE with weird copy assignment operator [PR114572]Jakub Jelinek1-0/+4
While ctors/dtors don't return anything (undeclared void or this pointer on arm) and copy assignment operators normally return a reference to *this, it isn't invalid to return uselessly some class object which might need destructing, but the OpenMP clause handling code wasn't expecting that. The following patch fixes that. 2024-04-05 Jakub Jelinek <jakub@redhat.com> PR c++/114572 * cp-gimplify.cc (cxx_omp_clause_apply_fn): Call build_cplus_new on build_call_a result if it has class type. * testsuite/libgomp.c++/pr114572.C: New test.
2024-04-05go: Add go.install-dvi rule in go/Make-lang.inChristophe Lyon1-0/+10
go has a go.dvi build rule, but lacks the go.install-dvi one. 2024-04-04 Christophe Lyon <christophe.lyon@linaro.org> gcc/go/ * Make-lang.in (go.install-dvi): New rule.
2024-04-05testsuite/gcc.target/cris/pr93372-2.c: Handle xpass from combine improvementHans-Peter Nilsson1-7/+8
After r14-9692-g839bc42772ba7a, a sequence that actually looks optimal is now emitted, observed at r14-9788-gb7bd2ec73d66f7. This caused an XPASS for this test. While adjusting the test, better also guard it against regressions by checking that there are no redundant move insns. That's the only test that's improved to the point of affecting test-patterns. E.g. pr93372-5.c (which references pr93372-2.c) is also improved, though it retains a redundant compare insn. (PR 93372 was about regressions from the cc0 representation; not further improvement like here, thus it's not tagged. Though, I did not double-check whether this actually *was* a regression from cc0.) * gcc.target/cris/pr93372-2.c: Tweak scan-assembler checks to cover recent combine improvement.
2024-04-05testsuite/gcc.dg/debug/btf/btf-datasec-1.c: Handle leading-underscoreHans-Peter Nilsson1-1/+1
I noticed my autotester for cris-elf flagging this as a regression. * gcc.dg/debug/btf/btf-datasec-1.c: Adjust pattern for targets with symbols having a leading underscore.
2024-04-05Daily bump.GCC Administrator4-1/+228
2024-04-04c++: alias CTAD and template template parm [PR114377]centurion2-1/+17
To match all the other places that pull a _TEMPLATE_PARM out of a _DECL (get_template_parm_index, etc.). This change is too small to be legally significant for copyright. PR c++/114377 gcc/cp/ChangeLog: * pt.cc (find_template_parameter_info::found): Use TREE_TYPE for TEMPLATE_DECL instead of DECL_INITIAL. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/class-deduction-alias19.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-04-04ipa: Avoid duplicate replacements in IPA-SRA transformation phaseMartin Jambor2-0/+45
When the analysis part of IPA-SRA figures out that it would split out a scalar part of an aggregate which is known by IPA-CP to contain a known constant, it skips it knowing that the transformation part looks at IPA-CP aggregate results too and does the right thing (which can include doing the propagation in GIMPLE because that is the last moment the parameter exists). However, when IPA-SRA wants to split out a smaller aggregate out of an aggregate, which happens to be of the same size as a known scalar constant at the same offset, the transformation bit fails to recognize the situation, tries to do both splitting and constant propagation and in PR 111571 testcase creates a nonsensical call statement on which the call redirection then ICEs. Fixed by making sure we don't try to do two replacements of the same part of the same parameter. The look-up among replacements requires these are sorted and this patch just sorts them if they are not already sorted before each new look-up. The worst number of sortings that can happen is number of parameters which are both split and have aggregate constants times param_ipa_max_agg_items (default 16). I don't think complicating the source code to optimize for this unlikely case is worth it but if need be, it can of course be done. gcc/ChangeLog: 2024-03-15 Martin Jambor <mjambor@suse.cz> PR ipa/111571 * ipa-param-manipulation.cc (ipa_param_body_adjustments::common_initialization): Avoid creating duplicate replacement entries. gcc/testsuite/ChangeLog: 2024-03-15 Martin Jambor <mjambor@suse.cz> PR ipa/111571 * gcc.dg/ipa/pr111571.c: New test.
2024-04-04[PR114415][scheduler]: Fixing wrong code generationVladimir N. Makarov3-17/+83
For the test case, the insn scheduler (working for live range shrinkage) moves insns modifying stack memory before an insn reserving the stack memory. Comments in the patch contains more details about the problem and its solution. gcc/ChangeLog: PR rtl-optimization/114415 * sched-deps.cc (add_insn_mem_dependence): Add memory check for mem argument. (sched_analyze_1): Treat stack pointer modification as memory read. (sched_analyze_2, sched_analyze_insn): Add memory guard for processing pending_read_mems. * sched-int.h (deps_desc): Add comment to pending_read_mems. gcc/testsuite/ChangeLog: PR rtl-optimization/114415 * gcc.target/i386/pr114415.c: New test.
2024-04-04nvptx: In mkoffload.cc, call diagnostic_color_init + gcc_init_libintlTobias Burnus1-0/+2
gcc/ChangeLog: * config/nvptx/mkoffload.cc (main): Call gcc_init_libintl and diagnostic_color_init.
2024-04-04x86: Define __APX_F__ for -mapxfH.J. Lu2-0/+8
Define __APX_F__ when APX is enabled. gcc/ PR target/114587 * config/i386/i386-c.cc (ix86_target_macros_internal): Define __APX_F__ when APX is enabled. gcc/testsuite/ PR target/114587 * gcc.target/i386/apx-2.c: New test.
2024-04-04Add gcov MC/DC tests for GDCJørgen Kvalsvik2-0/+1756
This is a mostly straight port from the gcov-19.c tests from the C test suite. The only notable differences from C to D are that D flips the true/false outcomes for loop headers, and the D front end ties loop and ternary conditions to slightly different locus. The test for >64 conditions warning is disabled as it either needs support from the testing framework or a something similar to #pragma GCC diagnostic push to not cause a test failure from detecting a warning. gcc/testsuite/ChangeLog: * gdc.dg/gcov.exp: New test. * gdc.dg/gcov1.d: New test.
2024-04-04Add condition coverage (MC/DC)Jørgen Kvalsvik27-42/+4334
This patch adds support in gcc+gcov for modified condition/decision coverage (MC/DC) with the -fcondition-coverage flag. MC/DC is a type of test/code coverage and it is particularly important for safety-critical applicaitons in industries like aviation and automotive. Notably, MC/DC is required or recommended by: * DO-178C for the most critical software (Level A) in avionics. * IEC 61508 for SIL 4. * ISO 26262-6 for ASIL D. From the SQLite webpage: Two methods of measuring test coverage were described above: "statement" and "branch" coverage. There are many other test coverage metrics besides these two. Another popular metric is "Modified Condition/Decision Coverage" or MC/DC. Wikipedia defines MC/DC as follows: * Each decision tries every possible outcome. * Each condition in a decision takes on every possible outcome. * Each entry and exit point is invoked. * Each condition in a decision is shown to independently affect the outcome of the decision. In the C programming language where && and || are "short-circuit" operators, MC/DC and branch coverage are very nearly the same thing. The primary difference is in boolean vector tests. One can test for any of several bits in bit-vector and still obtain 100% branch test coverage even though the second element of MC/DC - the requirement that each condition in a decision take on every possible outcome - might not be satisfied. https://sqlite.org/testing.html#mcdc MC/DC comes in different flavors, the most important being unique cause MC/DC and masking MC/DC. This patch implements masking MC/DC, which is works well with short circuiting semantics, and according to John Chilenski's "An Investigation of Three Forms of the Modified Condition Decision Coverage (MCDC) Criterion" (2001) is as good as unique cause at catching bugs. Whalen, Heimdahl, and De Silva "Efficient Test Coverage Measurement for MC/DC" describes an algorithm for finding the masking table from an AST walk, but my algorithm figures this out by analyzing the control flow graph. The CFG is considered a reduced ordered binary decision diagram and an input vector a path through the BDD, which is recorded. Specific edges will mask ("null out") the contribution from earlier path segments, which can be determined by finding short circuit endpoints. Masking is most easily understood as circuiting of terms in the reverse-ordered Boolean function, and the masked conditions do not affect the decision like short-circuited conditions do not affect the decision. A tag/discriminator mapping from gcond->uid is created during gimplification and made available through the function struct. The values are unimportant as long as basic conditions constructed from a single Boolean expression are given the same identifier. This happens in the breaking down of ANDIF/ORIF trees, so the coverage generally works well for frontends that create such trees. Like Whalen et al this implementation records coverage in fixed-size bitsets which gcov knows how to interpret. Recording conditions only requires a few bitwise operations per condition and is very fast, but comes with a limit on the number of terms in a single boolean expression; the number of bits in a gcov_unsigned_type (which is usually typedef'd to uint64_t). For most practical purposes this is acceptable, and by default a warning will be issued if gcc cannot instrument the expression. This is a practical limitation in the implementation, and not a limitation of the algorithm, so support for more conditions can be supported by introducing arbitrary-sized bitsets. In action it looks pretty similar to the branch coverage. The -g short opt carries no significance, but was chosen because it was an available option with the upper-case free too. gcov --conditions: 3: 17:void fn (int a, int b, int c, int d) { 3: 18: if ((a && (b || c)) && d) conditions covered 3/8 condition 0 not covered (true false) condition 1 not covered (true) condition 2 not covered (true) condition 3 not covered (true) 1: 19: x = 1; -: 20: else 2: 21: x = 2; 3: 22:} gcov --conditions --json-format: "conditions": [ { "not_covered_false": [ 0 ], "count": 8, "covered": 3, "not_covered_true": [ 0, 1, 2, 3 ] } ], Expressions with constants may be heavily rewritten before it reaches the gimplification, so constructs like int x = a ? 0 : 1 becomes _x = (_a == 0). From source you would expect coverage, but it gets neither branch nor condition coverage. The same applies to expressions like int x = 1 || a which are simply replaced by a constant. The test suite contains a lot of small programs and functions. Some of these were designed by hand to test for specific behaviours and graph shapes, and some are previously-failed test cases in other programs adapted into the test suite. gcc/ChangeLog: * builtins.cc (expand_builtin_fork_or_exec): Check condition_coverage_flag. * collect2.cc (main): Add -fno-condition-coverage to OBSTACK. * common.opt: Add new options -fcondition-coverage and -Wcoverage-too-many-conditions. * doc/gcov.texi: Add --conditions documentation. * doc/invoke.texi: Add -fcondition-coverage documentation. * function.cc (free_after_compilation): Free cond_uids. * function.h (struct function): Add cond_uids. * gcc.cc: Link gcov on -fcondition-coverage. * gcov-counter.def (GCOV_COUNTER_CONDS): New. * gcov-dump.cc (tag_conditions): New. * gcov-io.h (GCOV_TAG_CONDS): New. (GCOV_TAG_CONDS_LENGTH): New. (GCOV_TAG_CONDS_NUM): New. * gcov.cc (class condition_info): New. (condition_info::condition_info): New. (condition_info::popcount): New. (struct coverage_info): New. (add_condition_counts): New. (output_conditions): New. (print_usage): Add -g, --conditions. (process_args): Likewise. (output_intermediate_json_line): Output conditions. (read_graph_file): Read condition counters. (read_count_file): Likewise. (file_summary): Print conditions. (accumulate_line_info): Accumulate conditions. (output_line_details): Print conditions. * gimplify.cc (next_cond_uid): New. (reset_cond_uid): New. (shortcut_cond_r): Set condition discriminator. (tag_shortcut_cond): New. (gimple_associate_condition_with_expr): New. (shortcut_cond_expr): Set condition discriminator. (gimplify_cond_expr): Likewise. (gimplify_function_tree): Call reset_cond_uid. * ipa-inline.cc (can_early_inline_edge_p): Check condition_coverage_flag. * ipa-split.cc (pass_split_functions::gate): Likewise. * passes.cc (finish_optimization_passes): Likewise. * profile.cc (struct condcov): New declaration. (cov_length): Likewise. (cov_blocks): Likewise. (cov_masks): Likewise. (cov_maps): Likewise. (cov_free): Likewise. (instrument_decisions): New. (read_thunk_profile): Control output to file. (branch_prob): Call find_conditions, instrument_decisions. (init_branch_prob): Add total_num_conds. (end_branch_prob): Likewise. * tree-core.h (struct tree_exp): Add condition_uid. * tree-profile.cc (struct conds_ctx): New. (CONDITIONS_MAX_TERMS): New. (EDGE_CONDITION): New. (topological_cmp): New. (index_of): New. (single_p): New. (single_edge): New. (contract_edge_up): New. (struct outcomes): New. (conditional_succs): New. (condition_index): New. (condition_uid): New. (masking_vectors): New. (emit_assign): New. (emit_bitwise_op): New. (make_top_index_visit): New. (make_top_index): New. (paths_between): New. (struct condcov): New. (cov_length): New. (cov_blocks): New. (cov_masks): New. (cov_maps): New. (cov_free): New. (find_conditions): New. (struct counters): New. (find_counters): New. (resolve_counter): New. (resolve_counters): New. (instrument_decisions): New. (tree_profiling): Check condition_coverage_flag. (pass_ipa_tree_profile::gate): Likewise. * tree.h (SET_EXPR_UID): New. (EXPR_COND_UID): New. libgcc/ChangeLog: * libgcov-merge.c (__gcov_merge_ior): New. gcc/testsuite/ChangeLog: * lib/gcov.exp: Add condition coverage test function. * g++.dg/gcov/gcov-18.C: New test. * gcc.misc-tests/gcov-19.c: New test. * gcc.misc-tests/gcov-20.c: New test. * gcc.misc-tests/gcov-21.c: New test. * gcc.misc-tests/gcov-22.c: New test. * gcc.misc-tests/gcov-23.c: New test.
2024-04-04aarch64: Recognise svundef idiom [PR114577]Richard Sandiford5-0/+184
GCC 14 adds the header file arm_neon_sve_bridge.h to help interface SVE and Advanced SIMD code. One of the defined idioms is: svset_neonq (svundef_TYPE (), advsimd_vector) which simply reinterprets advsimd_vector as an SVE vector without regard for what's in the upper bits. GCC was failing to recognise this idiom, which was likely to significantly hamper adoption. There is (AFAIK) no good way of representing an extension with undefined bits in gimple. We could add an internal-only builtin to represent it, but the current framework makes that somewhat awkward. It also doesn't seem very forward-looking. This patch instead goes for the simpler approach of recognising undefined arguments at expansion time. gcc/ PR target/114577 * config/aarch64/aarch64-sve-builtins.h (aarch64_sve::lookup_fndecl): Declare. * config/aarch64/aarch64-sve-builtins.cc (aarch64_sve::lookup_fndecl): New function. * config/aarch64/aarch64-sve-builtins-base.cc (is_undef): Likewise. (svset_neonq_impl::expand): Optimise expansions whose first argument is undefined. gcc/testsuite/ PR target/114577 * gcc.target/aarch64/sve/acle/general/pr114577_1.c: New test. * gcc.target/aarch64/sve/acle/general/pr114577_2.c: Likewise.
2024-04-04tree-optimization/114485 - neg induction with partial vectorsRichard Biener2-7/+25
We can't use vect_update_ivs_after_vectorizer for partial vectors, the following fixes vect_can_peel_nonlinear_iv_p accordingly. PR tree-optimization/114485 * tree-vect-loop-manip.cc (vect_can_peel_nonlinear_iv_p): vect_step_op_neg isn't OK for partial vectors but only for unknown niter. * gcc.dg/vect/pr114485.c: New testcase.
2024-04-04fold-const: Handle NON_LVALUE_EXPR in native_encode_initializer [PR114537]Jakub Jelinek2-0/+18
The following testcase is incorrectly rejected. The problem is that for bit-fields native_encode_initializer expects the corresponding CONSTRUCTOR elt value must be INTEGER_CST, but that isn't the case here, it is wrapped into NON_LVALUE_EXPR by maybe_wrap_with_location. We could STRIP_ANY_LOCATION_WRAPPER as well, but as all we are looking for is INTEGER_CST inside, just looking through NON_LVALUE_EXPR seems easier. 2024-04-04 Jakub Jelinek <jakub@redhat.com> PR c++/114537 * fold-const.cc (native_encode_initializer): Look through NON_LVALUE_EXPR if val is INTEGER_CST. * g++.dg/cpp2a/bit-cast16.C: New test.
2024-04-04bitint: Handle m_bitfld_load cast in outer m_cast_conditional [PR114555]Jakub Jelinek3-1/+52
We ICE on the following testcase, because we use result of a PHI node which is only conditional because of a m_cast_conditional on the outermost loops PHI node argument and so is invalid SSA form. The following patch fixes it like similar cases elsewhere by adding needed intervening PHI(s). 2024-04-04 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/114555 * gimple-lower-bitint.cc (bitint_large_huge::handle_cast): For m_bitfld_load and save_cast_conditional add any needed PHIs and adjust t4 accordingly. * gcc.dg/bitint-103.c: New test. * gcc.dg/bitint-104.c: New test.
2024-04-04tree-optimization/114551 - loop splitting and undefined overflowRichard Biener2-2/+38
When loop splitting hoists a guard computation it needs to make sure that can be safely evaluated at this place when it was previously only conditionally evaluated. The following fixes this for the case of undefined overflow. PR tree-optimization/114551 * tree-ssa-loop-split.cc (split_loop): If the guard is only conditionally evaluated rewrite computations with possibly undefined overflow to unsigned arithmetic. * gcc.dg/torture/pr114551.c: New testcase.
2024-04-03Don't set full_profile in auto-profile [PR113765]Eugene Rozenfeld1-1/+0
auto-profile currently doesn't guarantee that it will set probabilities on all edges because of zero basic block counts. Normally those edges just have probabilities set by the preceding profile_estimate pass but under -O0 profile_estimate pass doesn't run. The patch removes setting of full_profile to true in auto-profile. Tested on x86_64-pc-linux-gnu. gcc/ChangeLog: PR gcov-profile/113765 * auto-profile.cc (afdo_annotate_cfg): Don't set full_profile to true
2024-04-04Daily bump.GCC Administrator4-1/+88
2024-04-03Update gcc sv.poJoseph Myers1-121/+82
* sv.po: Update.
2024-04-03Regenerate i386.opt.urlsMark Wielaard1-1/+1
LoongArch added an -mtls-dialect option, causing the similarly named option for i386 get renumbered. Fixes: b253b4695dda ("LoongArch: Add support for TLS descriptors.") gcc/ChangeLog: * config/i386/i386.opt.urls: Regenerate.
2024-04-03tree-profile: Disable indirect call profiling for IFUNC resolversH.J. Lu5-1/+128
We can't profile indirect calls to IFUNC resolvers nor their callees as it requires TLS which hasn't been set up yet when the dynamic linker is resolving IFUNC symbols. Add an IFUNC resolver caller marker to cgraph_node and set it if the function is called by an IFUNC resolver. Disable indirect call profiling for IFUNC resolvers and their callees. Tested with profiledbootstrap on Fedora 39/x86-64. gcc/ChangeLog: PR tree-optimization/114115 * cgraph.h (symtab_node): Add check_ifunc_callee_symtab_nodes. (cgraph_node): Add called_by_ifunc_resolver. * cgraphunit.cc (symbol_table::compile): Call symtab_node::check_ifunc_callee_symtab_nodes. * symtab.cc (check_ifunc_resolver): New. (ifunc_ref_map): Likewise. (is_caller_ifunc_resolver): Likewise. (symtab_node::check_ifunc_callee_symtab_nodes): Likewise. * tree-profile.cc (gimple_gen_ic_func_profiler): Disable indirect call profiling for IFUNC resolvers and their callees. gcc/testsuite/ChangeLog: PR tree-optimization/114115 * gcc.dg/pr114115.c: New test.
2024-04-03lto-wrapper.cc: Add offload target name to 'offload_args' suffixTobias Burnus1-1/+2
lto-wrapper.cc's compile_offload_image calls mkoffload with an @./a.offload_args argument ('a.' in case of, e.g., 'a.out'). However, when generating code for both nvptx and gcn, they use the same name with -save-temps. Hence, this commit adds a <target> + '.' before 'offload_args' in line with other offload-target-specific files. gcc/ChangeLog: * lto-wrapper.cc (compile_offload_image): Prefix 'offload_args' suffix by the target name.
2024-04-03GCN: install.texi update for Newlib change and LLVM 18 releaseTobias Burnus1-3/+5
gcc/ChangeLog: * doc/install.texi (amdgcn-*-amdhsa): Update Newlib recommendation and update wording for LLVM 18 release.
2024-04-03GCN: Fix --with-arch= handling in mkoffload [PR111966]Tobias Burnus1-18/+72
The default -march= setting used in mkoffload did not reflect the modified default set by GCC's configure-time --with-arch=, causing issues when generating debug code. gcc/ChangeLog: PR other/111966 * config/gcn/mkoffload.cc (get_arch): New; moved -march= flag handling from ... (main): ... here; call it to handle --with-arch config option and -march= commandline.
2024-04-03expr: Fix up emit_push_insn [PR114552]Jakub Jelinek2-3/+30
r13-990 added optimizations in multiple spots to optimize during expansion storing of constant initializers into targets. In the load_register_parameters and expand_expr_real_1 cases, it checks it has a tree as the source and so knows we are reading that whole decl's value, so the code is fine as is, but in the emit_push_insn case it checks for a MEM from which something is pushed and checks for SYMBOL_REF as the MEM's address, but still assumes the whole object is copied, which as the following testcase shows might not always be the case. In the testcase, k is 6 bytes, then 2 bytes of padding, then another 4 bytes, while the emit_push_insn wants to store just the 6 bytes. The following patch simply verifies it is the whole initializer that is being stored, I think that is best thing to do so late in GCC 14 cycle as well for backporting. For GCC 15, perhaps the code could stop requiring it must be at offset zero, nor that the size is equal, but could use get_symbol_constant_value/fold_ctor_reference gimple-fold APIs to actually extract just part of the initializer if we e.g. push just some subset (of course, still verify that it is a subset). For sizes which are power of two bytes and we have some integer modes, we could use as type for fold_ctor_reference corresponding integral types, otherwise dunno, punt or use some structure (e.g. try to find one in the initializer?), whatever. But even in the other spots it could perhaps handle loading of COMPONENT_REFs or MEM_REFs from the .rodata vars. 2024-04-03 Jakub Jelinek <jakub@redhat.com> PR middle-end/114552 * expr.cc (emit_push_insn): Only use store_constructor for immediate_const_ctor_p if int_expr_size matches size. * gcc.c-torture/execute/pr114552.c: New test.
2024-04-03tree-optimization/114557 - reduce ehcleanup peak memory useRichard Biener2-2/+10
The following reduces peak memory use for the PR114480 testcase at -O1 which is almost exclusively spent by the ehcleanup pass in allocating PHI nodes. The free_phinodes cache we maintain isn't very effective since it has effectively two slots, one for 4 and one for 9 argument PHIs and it is only ever used for allocations up to 9 arguments but we put all larger PHIs in the 9 argument bucket. This proves uneffective resulting in much garbage to be kept when incrementally growing PHI nodes by edge redirection. The mitigation is to rely on the GC freelist for larger sizes and thus immediately return all larger bucket sized PHIs to it via ggc_free. This reduces the peak memory use from 19.8GB to 11.3GB and compile-time from 359s to 168s. PR tree-optimization/114557 PR tree-optimization/114480 * tree-phinodes.cc (release_phi_node): Return PHIs from allocation buckets not covered by free_phinodes to GC. (remove_phi_node): Release the PHI LHS before freeing the PHI node. * tree-vect-loop.cc (vectorizable_live_operation): Get PHI lhs before releasing it.
2024-04-03LoongArch: Remove unused code.Jiahao Xu5-171/+35
gcc/ChangeLog: * config/loongarch/lasx.md: Remove unused code. * config/loongarch/loongarch-protos.h (loongarch_split_lsx_copy_d): Remove. (loongarch_split_lsx_insert_d): Ditto. (loongarch_split_lsx_fill_d): Ditto. * config/loongarch/loongarch.cc (loongarch_split_lsx_copy_d): Ditto. (loongarch_split_lsx_insert_d): Ditto. (loongarch_split_lsx_fill_d): Ditto. * config/loongarch/lsx.md (lsx_vpickve2gr_du): Remove splitter. (lsx_vpickve2gr_<lsxfmt_f>): Ditto. (abs<mode>2): Remove expander. (vabs<mode>2): Rename 2 abs<mode>2. gcc/testsuite/ChangeLog: * gcc.target/loongarch/vector/lsx/lsx-abs.c: New test.
2024-04-03Daily bump.GCC Administrator9-1/+251
2024-04-02PR modula2/114565 progress trace would be useful to isolate ICE for usersGaius Mulley14-65/+285
This patch introduces the internal option -fm2-debug-trace= which can be given a comma separated list of filter terms. Currently it allows: all,line,token,quad. The patch allows users to trace the progress of cc1gm2 so that source which causes an ICE can be reduced. Once PR113836 is complete it is expected that the trace information will be written to file. gcc/m2/ChangeLog: PR modula2/114565 * gm2-compiler/M2GenGCC.mod (CodeStatement): Test GetDebugTraceQuad before calling DisplayQuad. * gm2-compiler/M2LexBuf.mod (NumberIO): Import CardToStr. (GetToken): Test GetDebugTraceToken before writing the token number or token line. * gm2-compiler/M2Options.def (SetDebugTraceQuad): Rename to (SetM2DebugTraceFilter): ...this. (SetDebugTraceAPI): Remove. (GetDebugTraceQuad): New procedure function. (GetDebugTraceTree): Ditto. (GetDebugTraceToken): Ditto. (GetDebugTraceLine): Ditto. (GetDebugFunctionLineNumbers): Ditto. * gm2-compiler/M2Options.mod (DebugFunctionLineNumbers): New boolean variable. (DebugTraceQuad): Ditto. (DebugTraceTree): Ditto. (DebugTraceLine): Ditto. (DebugTraceToken): Ditto. (errors1): New procedure. (SetDebugTraceQuad): Remove. (SetM2DebugTraceFilter): New procedure implemented. (SetM2DebugTrace): Ditto. (GetDebugTraceQuad): Ditto. (GetDebugTraceToken ): Ditto. (GetDebugTraceLine): Ditto. (SetDebugTraceLine): Remove. * gm2-compiler/M2Quads.mod (GenQuadOTrash): Test GetDebugTraceQuad and call DisplayQuad. (GenQuadOTypetok): Ditto. * gm2-compiler/SymbolTable.mod: Replace DebugFunctionLineNumbers with GetDebugFunctionLineNumbers. * gm2-gcc/init.cc (_M2_M2LangDump_init): Add prototype. (init_PerCompilationInit): Add call. * gm2-gcc/m2misc.cc (m2misc_cerror): New function. (m2misc_error): Ditto. * gm2-gcc/m2misc.def (error): New procedure. (cerror): Ditto. * gm2-gcc/m2misc.h (m2misc_cerror): New prototype. (m2misc_error): Ditto. * gm2-gcc/m2options.h (M2Options_SetDebugTraceQuad): New prototype. (M2Options_SetDebugTraceAPI): Remove. (M2Options_GetDebugTraceToken): New prototype. (M2Options_GetDebugTraceLine): Ditto. (M2Options_SetDebugFunctionLineNumbers): Ditto. (M2Options_GetDebugFunctionLineNumbers): Ditto. (M2Options_SetM2DebugTraceFilter): Ditto. * gm2-lang.cc (gm2_langhook_init_options): Remove OPT_fdebug_trace_quad case. Remove OPT_fdebug_trace_api case. Add OPT_fm2_debug_trace_ case. * lang.opt (fm2-debug-trace): New option. (fdebug-trace-api): Remove. (fdebug-trace-quad): Remove. * m2.flex (m2flex_M2Error): Check s for NULL. (skipnewline): New function. (consumeLine): Call traceline. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-04-03Fix ICE with -g and -std=c23 related to incomplete types [PR114361]Martin Uecker4-0/+39
We did not copy TYPE_CANONICAL to the incomplete variants when completing a structure. PR c/114361 gcc/c/ * c-decl.cc (finish_struct): Set TYPE_CANONICAL when completing strucute types. gcc/testsuite/ * gcc.dg/pr114361.c: New test. * gcc.dg/c23-tag-incomplete-1.c: New test. * gcc.dg/c23-tag-incomplete-2.c: New test.
2024-04-02analyzer: prevent ICEs with null typesDavid Malcolm2-1/+4
Fixes some ICEs seen analyzing the Linux kernel. gcc/analyzer/ChangeLog: * region-model-manager.cc (maybe_undo_optimize_bit_field_compare): Guard against null types. * region-model.cc (apply_constraints_for_gswitch): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-04-02c++: make __is_array return false for T[0] [PR114479]Marek Polacek2-1/+19
When we switched to using the __is_array built-in trait to implement std::is_array in r14-6623-g7fd9c349e45534, we started saying that T[0] is an array. There are various opinions as to whether that is the best answer, but it seems prudent to keep the GCC 13 result. PR c++/114479 gcc/cp/ChangeLog: * semantics.cc (trait_expr_value) <case CPTK_IS_ARRAY>: Return false for zero-sized arrays. gcc/testsuite/ChangeLog: * g++.dg/ext/is_array.C: Extend.
2024-04-02c++: ICE with scoped enum in switch condition [PR103825]Marek Polacek2-0/+31
Here we ICE when gimplifying enum class Type { Pawn }; struct Piece { Type type : 4; }; void foo() { switch (Piece().type) case Type::Pawn:; } because we ended up with TYPE_PRECISION (cond) < TYPE_PRECISION (case). That's because the case expr type here is the unlowered type Type, whereas the conditional's type is the lowered <unnamed-signed:4>. This is not supposed to happen: see the comment in pop_switch around the is_bitfield_expr_with_lowered_type check. But here we did not revert to the lowered SWITCH_STMT_TYPE, because the conditional contains a TARGET_EXPR, which has side-effects, which means that finish_switch_cond -> maybe_cleanup_point_expr wraps it in a CLEANUP_POINT_EXPR. And is_bitfield_expr_with_lowered_type does not see through those. PR c++/103825 gcc/cp/ChangeLog: * typeck.cc (is_bitfield_expr_with_lowered_type): Handle CLEANUP_POINT_EXPR. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/enum44.C: New test.
2024-04-02c++: binding reference to comma expr [PR114561]Jason Merrill3-14/+47
We represent a reference binding where the referent type is more qualified by a ck_ref_bind around a ck_qual. We performed the ck_qual and then tried to undo it with STRIP_NOPS, but that doesn't work if the conversion is buried in COMPOUND_EXPR. So instead let's avoid performing that fake conversion in the first place. PR c++/114561 PR c++/114562 gcc/cp/ChangeLog: * call.cc (convert_like_internal): Avoid adding qualification conversion in direct reference binding. gcc/testsuite/ChangeLog: * g++.dg/conversion/ref10.C: New test. * g++.dg/conversion/ref11.C: New test.
2024-04-02aarch64: Fix typo in comment about FEATURE_STRINGChristophe Lyon1-8/+8
Fix the comment to document FEATURE_STRING instead of FEAT_STRING. 2024-03-29 Christophe Lyon <christophe.lyon@linaro.org> gcc/ * config/aarch64/aarch64-option-extensions.def: Fix comment.
2024-04-02Prettify output of debug_dwarf_dieTom Tromey1-3/+3
When debugging gcc, I tried calling debug_dwarf_die and I saw this output: DW_AT_location: location descriptor: (0x7fffe9c2e870) DW_OP_dup 0, 0 (0x7fffe9c2e8c0) DW_OP_bra location descriptor (0x7fffe9c2e640) , 0 (0x7fffe9c2e820) DW_OP_lit4 4, 0 (0x7fffe9c2e910) DW_OP_skip location descriptor (0x7fffe9c2e9b0) , 0 (0x7fffe9c2e640) DW_OP_dup 0, 0 I think those ", 0" should not appear on their own lines. The issue seems to be that print_dw_val should not generally emit a newline, except when recursing. gcc/ChangeLog * dwarf2out.cc (print_dw_val) <dw_val_class_loc>: Don't print newline when not recursing.
2024-04-02Fortran: Add error for subroutine passed to a variable dummy [PR106999]Paul Thomas2-1/+52
2024-04-02 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/106999 * interface.cc (gfc_compare_interfaces): Add error for a subroutine proc pointer passed to a variable formal. (compare_parameter): If a procedure pointer is being passed to a non-procedure formal arg, and there is an an interface, use gfc_compare_interfaces to check and provide a more useful error message. gcc/testsuite/ PR fortran/106999 * gfortran.dg/pr106999.f90: New test.
2024-04-02Fortran: Fix wrong recursive errors and class initialization [PR112407]Paul Thomas4-4/+164
2024-04-02 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/112407 * resolve.cc (resolve_procedure_expression): Change the test for for recursion in the case of hidden procedures from modules. (resolve_typebound_static): Add warning for possible recursive calls to typebound procedures. * trans-expr.cc (gfc_trans_class_init_assign): Do not apply default initializer to class dummy where component initializers are all null. gcc/testsuite/ PR fortran/112407 * gfortran.dg/pr112407a.f90: New test. * gfortran.dg/pr112407b.f90: New test.
2024-04-02jit, Darwin: Implement library exports list.Iain Sandoe2-17/+263
Currently, we have no exports list for libgccjit, which means that all symbols are exported, including those from libstdc++ which is linked statically into the lib. This causes failures when the shared libstdc++ is used but some c++ symbols are satisfied from libgccjit. This implements an export file for Darwin (which is currently manually created by cross-checking libgccjit.map). Ideally we'd script this, at some point. Update libtool current and age to reflect the current ABI version (we are not bumping the SO name at this stage). This fixes a number of new failures in jit testing. gcc/jit/ChangeLog: * Make-lang.in: Implement exports list, and use a shared libgcc. * libgccjit.exports: New file. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
2024-04-02testsuite: Remove duplicate -lgcov [PR114034]Iain Sandoe2-2/+2
Duplicate library entries now cause linker warnings with newer linker versions on Darwin which leads to these tests regressing. The library is already added by the test flags so there is no need to put an extra one in the options. PR testsuite/114034 gcc/testsuite/ChangeLog: * g++.dg/gcov/gcov-dump-1.C: Remove extra -lgcov. * g++.dg/gcov/gcov-dump-2.C: Likewise. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
2024-04-02testsuite, Darwin: Allow for an undefined symbol [PR114036].Iain Sandoe1-1/+1
Darwin's linker defaults to requiring all symbols to be defined at static link time (unless specifically noted or dynamic lookuo is enabled). For this test, we just need to note that the symbol is expected to be undefined. PR testsuite/114036 gcc/testsuite/ChangeLog: * gcc.misc-tests/gcov-14.c: Allow for 'Foo' to be undefined on Darwin link lines. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
2024-04-02Darwin: Correct a version check.Iain Sandoe1-1/+1
When the version for dsymutil comes from a clang build, it is of the form NNmm.pp.qq where NN and mm are the major and minor LLVM version components. We need to check for a major version greater than or equal to 7 - so use 700 in the check. gcc/ChangeLog: * config/darwin.cc (darwin_override_options): Update the clang major version value in the dsymutil check. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
2024-04-02Darwin: Do not emit .macinfo when dsymutil cannot consume it.Iain Sandoe1-5/+18
Some verions of dsymutil do not ignore .macinfo sections, but instead ignore the entire debug in the file. To avoid this total loss of debug, when we detect that the debug level is g3 and the dsymutil version cannot support it, we reduce the level to g2 and issue a note. This behaviour can be overidden by -gstrict-dwarf (although the objects will contain macinfo; dsymutil will not produce a .dSYM with it). gcc/ChangeLog: * config/darwin.cc (darwin_override_options): Reduce the debug level to 2 if dsymutil cannot handle .macinfo sections. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>