aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-08-30Avoid division by zero via constant_multiple_pRichard Biener1-2/+4
With recent SLP vectorization patches I see RISC-V divison by zero for gfortran.dg/matmul_10.f90 and others in get_group_load_store_type which does && can_div_trunc_p (group_size * LOOP_VINFO_VECT_FACTOR (loop_vinfo) - gap, nunits, &tem, &remain) && (known_eq (remain, 0u) || (constant_multiple_p (nunits, remain, &num) && (vector_vector_composition_type (vectype, num, &half_vtype) != NULL_TREE)))) overrun_p = false; where for [2, 2] / [0, 2] the condition doesn't reflect what we are trying to test - that, when remain is zero or, when non-zero, nunits is a multiple of remain, we can avoid touching a gap via loading smaller pieces and vector composition. It isn't safe to change the known_eq to maybe_eq so instead require known_ne (remain, 0u) before doing constant_multiple_p. There's the corresponding code in vectorizable_load that's known to have a latent similar issue, so sync that up as well. * tree-vect-stmts.cc (get_group_load_store_type): Check known_ne (remain, 0u) before doing constant_multiple_p. (vectorizable_load): Likewise.
2024-08-30Do not bother with reassociation in SLP discovery for single-laneRichard Biener1-0/+2
It just clutters the dump files and takes up compile-time. * tree-vect-slp.cc (vect_build_slp_tree_2): Disable SLP reassociation for single-lane.
2024-08-30c++: Allow standard attributes after closing square bracket in new-type-id ↵Jakub Jelinek3-8/+41
[PR110345] For C++ 26 P2552R3 I went through all the spots (except modules) where attribute-specifier-seq appears in the grammar and tried to construct a testcase in all those spots, for now for [[deprecated]] attribute. The first thing I found is that we aren't parsing standard attributes in noptr-new-declarator - https://eel.is/c++draft/expr.new#1 The following patch parses it there, for the non-outermost arrays applies normally the attributes to the array type, for the outermost where we just set *nelts and don't really build an array type just warns that we ignore those attributes (or, do you think we should just build an array type in that case and just take its element type?). 2024-08-30 Jakub Jelinek <jakub@redhat.com> PR c++/110345 * parser.cc (make_array_declarator): Add STD_ATTRS argument, set declarator->std_attributes to it. (cp_parser_new_type_id): Warn on non-ignored std_attributes on the array declarator which is being omitted. (cp_parser_direct_new_declarator): Parse standard attributes after closing square bracket, pass it to make_array_declarator. (cp_parser_direct_declarator): Pass std_attrs to make_array_declarator instead of setting declarator->std_attributes manually. * g++.dg/cpp0x/gen-attrs-80.C: New test. * g++.dg/cpp0x/gen-attrs-81.C: New test.
2024-08-30Check avx upper register for parallel.liuhongt2-13/+49
For function arguments/return, when it's BLK mode, it's put in a parallel with an expr_list, and the expr_list contains the real mode and registers. Current ix86_check_avx_upper_register only checked for SSE_REG_P, and failed to handle that. The patch extend the handle to each subrtx. gcc/ChangeLog: PR target/116512 * config/i386/i386.cc (ix86_check_avx_upper_register): Iterate subrtx to scan for avx upper register. (ix86_check_avx_upper_stores): Inline old ix86_check_avx_upper_register. (ix86_avx_u128_mode_needed): Ditto, and replace FOR_EACH_SUBRTX with call to new ix86_check_avx_upper_register. gcc/testsuite/ChangeLog: * gcc.target/i386/pr116512.c: New test.
2024-08-30Daily bump.GCC Administrator7-1/+748
2024-08-29SARIF output: implement embedded URLs in messages (§3.11.6; PR other/116419)David Malcolm7-96/+636
GCC diagnostic messages can contain URLs, such as to our documentation when we suggest an option name to correct a misspelling. SARIF message strings can contain embedded URLs in the plain text messages (see SARIF v2.1.0 §3.11.6), but previously we were simply dropping any URLs from the diagnostic messages. This patch adds support for encoding URLs into messages in our SARIF output, using the pp_token machinery added in the previous patch. As well as supporting URLs, the patch also adjusts how we report event IDs in SARIF message, so that rather than e.g. "text": "second 'free' here; first 'free' was at (1)" we now report: "text": "second 'free' here; first 'free' was at [(1)](sarif:/runs/0/results/0/codeFlows/0/threadFlows/0/locations/0)" i.e. the text "(1)" now has a embedded link referring within the sarif log to the threadFlowLocation object for the other event, via JSON pointer (see §3.10.3 "URIs that use the sarif scheme"). Doing so requires the arious objects to know their index within their containing array, requiring some reworking of how they are constructed. gcc/ChangeLog: PR other/116419 * diagnostic-event-id.h (diagnostic_event_id_t::zero_based): New. * diagnostic-format-sarif.cc: Include "pretty-print-format-impl.h" and "pretty-print-urlifier.h". (sarif_result::sarif_result): Add param "idx_within_parent". (sarif_result::get_index_within_parent): New accessor. (sarif_result::m_idx_within_parent): New field. (sarif_code_flow::sarif_code_flow): New ctor. (sarif_code_flow::get_parent): New accessor. (sarif_code_flow::get_index_within_parent): New accessor. (sarif_code_flow::m_parent): New field. (sarif_code_flow::m_thread_id_map): New field. (sarif_code_flow::m_thread_flows_arr): New field. (sarif_code_flow::m_all_tfl_objs): New field. (sarif_thread_flow::sarif_thread_flow): Add "parent" and "idx_within_parent" params. (sarif_thread_flow::get_parent): New accessor. (sarif_thread_flow::get_index_within_parent): New accessor. (sarif_thread_flow::m_parent): New field. (sarif_thread_flow::m_idx_within_parent): New field. (sarif_thread_flow_location::sarif_thread_flow_location): New ctor. (sarif_thread_flow_location::get_parent): New accessor. (sarif_thread_flow_location::get_index_within_parent): New accessor. (sarif_thread_flow_location::m_parent): New field. (sarif_thread_flow_location::m_idx_within_parent): New field. (sarif_builder::get_code_flow_for_event_ids): New accessor. (class sarif_builder::sarif_token_printer): New. (sarif_builder::m_token_printer): New member. (sarif_builder::m_next_result_idx): New field. (sarif_builder::m_current_code_flow): New field. (sarif_code_flow::get_or_append_thread_flow): New. (sarif_code_flow::get_thread_flow): New. (sarif_code_flow::add_location): New. (sarif_code_flow::get_thread_flow_loc_obj): New. (sarif_thread_flow::add_location): Create the new sarif_thread_flow_location internally, rather than passing it in as a parm so that we can keep track of its index in the array. Return a reference to it. (sarif_builder::sarif_builder): Initialize m_token_printer, m_next_result_idx, and m_current_code_flow. (sarif_builder::on_report_diagnostic): Pass index to make_result_object. (sarif_builder::make_result_object): Add "idx_within_parent" param and pass to sarif_result ctor. Pass code flow index to call to make_code_flow_object. (make_sarif_url_for_event): New. (sarif_builder::make_code_flow_object): Add "idx_within_parent" param and pass it to sarif_code_flow ctor. Reimplement walking of events so that we first create threadFlow objects for each thread, then populate them with threadFlowLocation objects, so that the IDs work. Set m_current_code_flow whilst creating the latter, so that we can create correct URIs for "%@". (sarif_builder::make_thread_flow_location_object): Replace with... (sarif_builder::populate_thread_flow_location_object): ...this. (sarif_output_format::get_builder): New accessor. (sarif_begin_embedded_link): New. (sarif_end_embedded_link): New. (sarif_builder::sarif_token_printer::print_tokens): New. (diagnostic_output_format_init_sarif): Add "fmt" param; use it to set the token printer and output format for the context. (diagnostic_output_format_init_sarif_stderr): Move responsibility for setting the context's output format to within diagnostic_output_format_init_sarif. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. (test_sarif_diagnostic_context::test_sarif_diagnostic_context): Likewise. (selftest::test_make_location_object): Provide an idx for the result. (selftest::get_result_from_log): New. (selftest::get_message_from_log): New. (selftest::test_message_with_embedded_link): New test. (selftest::diagnostic_format_sarif_cc_tests): Call it. * pretty-print-format-impl.h: Include "diagnostic-event-id.h". (pp_token::kind): Add "event_id". (struct pp_token_event_id): New. (is_a_helper <pp_token_event_id *>::test): New. (is_a_helper <const pp_token_event_id *>::test): New. * pretty-print.cc (pp_token::dump): Handle kind::event_id. (pretty_printer::format): Update handling of "%@" in phase 2 so that we add a pp_token_event_id, rather that the text "(N)". (default_token_printer): Handle pp_token::kind::event_id by printing the text "(N)". gcc/testsuite/ChangeLog: PR other/116419 * gcc.dg/sarif-output/bad-pragma.c: New test. * gcc.dg/sarif-output/test-bad-pragma.py: New test. * gcc.dg/sarif-output/test-include-chain-2.py (test_location_relationships): Update expected text of event to include an intra-sarif URI to the other event. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-08-29pretty-print: reimplement pp_format with a new struct pp_tokenDavid Malcolm14-535/+1483
The following patch rewrites the internals of pp_format. A pretty_printer's output_buffer maintains a stack of chunk_info instances, each one responsible for handling a call to pp_format, where having a stack allows us to support re-entrant calls to pp_format on the same pretty_printer. Previously a chunk_info merely stored buffers of accumulated text per unformatted run and per formatted argument. This led to various special-casing for handling: - urlifiers, needing class quoting_info to handle awkard cases where the run of quoted text could be split between stages 1 and 2 of formatting - dumpfiles, where the optinfo machinery could lead to objects being stashed during formatting for later replay to JSON optimization records - in the C++ frontend, the format codes %H and %I can't be processed until we've seen both, leading to awkward code to manipulate the text buffers Further, supporting URLs in messages in SARIF output (PR other/116419) would add additional manipulations of text buffers, since our internal pp_begin_url API gives the URL at the beginning of the wrapped text, whereas SARIF's format for embedded URLs has the URL *after* the wrapped text. Also when handling "%@" we wouldn't necessarily know the URL of an event ID until later, requiring further nasty special-case manipulation of text buffers. This patch rewrites pretty-print formatting by introducing a new intermediate representation during formatting: pp_token and pp_token_list. Rather than simply accumulating a buffer of "char" in the chunk_obstack during formatting, we now also accumulate a pp_token_list, a doubly-linked list of pp_token, which can be: - text buffers - begin/end colorization - begin/end quote - begin/end URL - "custom data" tokens Working at the level of tokens rather than just text buffers allows the various awkward special cases above to be replaced with uniform logic. For example, all "urlification" is now done in phase 3 of formatting, in one place, by looking for [..., BEGIN_QUOTE, TEXT, END_QUOTE, ...] and injecting BEGIN_URL and END_URL wrapper tokens when the urlifier has a URL for TEXT. Doing so greatly simplifies the urlifier code, allowing the removal of class quoting_info. The tokens and token lists are allocated on the chunk_obstack, and so there's no additional heap activity required, with the memory reclaimed when the chunk_obstack is freed after phase 3 of formatting. New kinds of pp_token can be added as needed to support output formats. For example, the followup patch adds a token for "%@" for events IDs, to better support SARIF output. No functional change intended. gcc/c/ChangeLog: * c-objc-common.cc (c_tree_printer): Convert final param from const char ** to pp_token_list &. gcc/cp/ChangeLog: * error.cc: Include "make-unique.h". (deferred_printed_type::m_buffer_ptr): Replace with... (deferred_printed_type::m_printed_text): ...this and... (deferred_printed_type::m_token_list): ...this. (deferred_printed_type::deferred_printed_type): Update ctors for above changes. (deferred_printed_type::set_text_for_token_list): New. (append_formatted_chunk): Pass chunk_obstack to append_formatted_chunk. (add_quotes): Delete. (cxx_format_postprocessor::handle): Reimplement to call deferred_printed_type::set_text_for_token_list, rather than store buffer pointers. (defer_phase_2_of_type_diff): Replace param "buffer_ptr" with "formatted_token_list". Reimplement by storing a pointer to formatted_token_list so that the postprocessor can put its text there. (cp_printer): Convert param "buffer_ptr" to "formatted_token_list". Update calls to defer_phase_2_of_type_diff accordingly. gcc/ChangeLog: * diagnostic.cc (diagnostic_context::report_diagnostic): Don't pass m_urlifier to pp_format, as urlification now happens in phase 3. * dump-context.h (class dump_pretty_printer): Update leading comment. (dump_pretty_printer::emit_items): Drop decl. (dump_pretty_printer::set_optinfo): New. (class dump_pretty_printer::stashed_item): Delete class. (class dump_pretty_printer::custom_token_printer): New class. (dump_pretty_printer::format_decoder_cb): Convert param from const char ** to pp_token_list &. (dump_pretty_printer::decode_format): Likewise. (dump_pretty_printer::stash_item): Likewise. (dump_pretty_printer::emit_any_pending_textual_chunks): Drop decl. (dump_pretty_printer::m_stashed_items): Delete field. (dump_pretty_printer::m_token_printer): New member data. * dumpfile.cc (struct wrapped_optinfo_item): New. (dump_pretty_printer::dump_pretty_printer): Update for dropping of field m_stashed_items and new field m_token_printer. (dump_pretty_printer::emit_items): Delete; we now use pp_output_formatted_text.. (dump_pretty_printer::emit_any_pending_textual_chunks): Delete. (dump_pretty_printer::stash_item): Convert param from const char ** to pp_token_list &. (dump_pretty_printer::format_decoder_cb): Likewise. (dump_pretty_printer::decode_format): Likewise. (dump_pretty_printer::custom_token_printer::print_tokens): New. (dump_pretty_printer::custom_token_printer::emit_any_pending_textual_chunks): New. (dump_context::dump_printf_va): Call set_optinfo on the dump_pretty_printer. Replace call to emit_items with a call to pp_output_formatted_text. * opt-problem.cc (opt_problem::opt_problem): Replace call to emit_items with call to set_optinfo and call to pp_output_formatted_text. * pretty-print-format-impl.h (struct pp_token): New. (struct pp_token_text): New. (is_a_helper <pp_token_text *>::test): New. (is_a_helper <const pp_token_text *>::test): New. (struct pp_token_begin_color): New. (is_a_helper <pp_token_begin_color *>::test): New. (is_a_helper <const pp_token_begin_color *>::test): New. (struct pp_token_end_color): New. (struct pp_token_begin_quote): New. (struct pp_token_end_quote): New. (struct pp_token_begin_url): New. (is_a_helper <pp_token_begin_url*>::test): New. (is_a_helper <const pp_token_begin_url*>::test): New. (struct pp_token_end_url): New. (struct pp_token_custom_data): New. (is_a_helper <pp_token_custom_data *>::test): New. (is_a_helper <const pp_token_custom_data *>::test): New. (class pp_token_list): New. (chunk_info::get_args): Drop. (chunk_info::get_quoting_info): Drop. (chunk_info::get_token_lists): New accessor. (chunk_info::append_formatted_chunk): Add obstack & param. (chunk_info::dump): New decls. (chunk_info::m_args): Convert element type from const char * to pp_token_list *. Rewrite/update comment. (chunk_info::m_quotes): Drop field. * pretty-print-markup.h (class pp_token_list): New forward decl. (pp_markup::context::context): Drop urlifier param; add formatted_token_list param. (pp_markup::context::push_back_any_text): New decl. (pp_markup::context::m_urlifier): Drop field. (pp_markup::context::m_formatted_token_list): New field. * pretty-print-urlifier.h: Update comment. * pretty-print.cc: Define INCLUDE_MEMORY. Include "make-unique.h". (default_token_printer): New forward decl. (obstack_append_string): Delete. (urlify_quoted_string): Delete. (pp_token::pp_token): New. (pp_token::dump): New. (allocate_object): New. (class quoting_info): Delete. (pp_token::operator new): New. (pp_token::operator delete): New. (pp_token_list::operator new): New. (pp_token_list::operator delete): New. (pp_token_list::pp_token_list): New. (pp_token_list::~pp_token_list): New. (pp_token_list::push_back_text): New. (pp_token_list::push_back): New. (pp_token_list::push_back_list): New. (pp_token_list::pop_front): New. (pp_token_list::remove_token): New. (pp_token_list::insert_after): New. (pp_token_list::replace_custom_tokens): New. (pp_token_list::merge_consecutive_text_tokens): New. (pp_token_list::apply_urlifier): New. (pp_token_list::dump): New. (chunk_info::append_formatted_chunk): Add obstack & param and use it to reimplement in terms of token lists. (chunk_info::pop_from_output_buffer): Drop m_quotes. (chunk_info::on_begin_quote): Delete. (chunk_info::dump): New. (chunk_info::on_end_quote): Delete. (push_back_any_text): New. (pretty_printer::format): Drop "urlifier" param and quoting_info logic. Convert "formatters" and "args" from const ** to pp_token_list **. Reimplement so that rather than just accumulating a text buffer in the chunk_obstack for each arg, instead also accumulate a pp_token_list and pp_tokens for each arg. (auto_obstack::operator obstack &): New. (quoting_info::handle_phase_3): Delete. (pp_output_formatted_text): Reimplement in terms of manipulations of pp_token_lists, rather than char buffers. Call default_token_printer, or m_token_printer's print_tokens vfunc. (default_token_printer): New. (pretty_printer::pretty_printer): Initialize m_token_printer in both ctors. (pp_markup::context::begin_quote): Reimplement to use token list. (pp_markup::context::end_quote): Likewise. (pp_markup::context::begin_highlight_color): Likewise. (pp_markup::context::end_highlight_color): Likewise. (pp_markup::context::push_back_any_text): New. (selftest::test_merge_consecutive_text_tokens): New. (selftest::test_custom_tokens_1): New. (selftest::test_custom_tokens_2): New. (selftest::pp_printf_with_urlifier): Drop "urlifier" param from call to pp_format. (selftest::test_urlification): Add test of the example from pretty-print-format-impl.h. (selftest::pretty_print_cc_tests): Call the new selftest functions. * pretty-print.h (class quoting_info): Drop forward decl. (class pp_token_list): New forward decl. (printer_fn): Convert final param from const char ** to pp_token_list &. (class token_printer): New. (class pretty_printer): Add pp_output_formatted_text as friend. (pretty_printer::set_token_printer): New. (pretty_printer::format): Drop urlifier param as this now happens in phase 3. (pretty_printer::m_format_decoder): Update comment. (pretty_printer::m_token_printer): New field. (pp_format): Drop urlifier param. * tree-diagnostic.cc (default_tree_printer): Convert final param from const char ** to pp_token_list &. * tree-diagnostic.h: Likewise for decl. gcc/fortran/ChangeLog: * error.cc (gfc_format_decoder): Convert final param from const char **buffer_ptr to pp_token_list &formatted_token_list, and update call to default_tree_printer accordingly. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-08-29pretty-print: move class chunk_info into its own headerDavid Malcolm5-44/+74
No functional change intended. gcc/cp/ChangeLog: * error.cc: Include "pretty-print-format-impl.h". gcc/ChangeLog: * dumpfile.cc: Include "pretty-print-format-impl.h". * pretty-print-format-impl.h: New file, based on material from pretty-print.h. * pretty-print.cc: Include "pretty-print-format-impl.h". * pretty-print.h (chunk_info): Replace full declaration with a forward decl, moving full decl to pretty-print-format-impl.h. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-08-29Use std::unique_ptr for optinfo_itemDavid Malcolm47-88/+137
As preliminary work towards an overhaul of how optinfo_items interact with dump_pretty_printer, replace uses of optinfo_item * with std::unique_ptr<optinfo_item> to make ownership clearer. No functional change intended. gcc/ChangeLog: * config/aarch64/aarch64.cc: Define INCLUDE_MEMORY. * config/arm/arm.cc: Likewise. * config/i386/i386.cc: Likewise. * config/loongarch/loongarch.cc: Likewise. * config/riscv/riscv-vector-costs.cc: Likewise. * config/riscv/riscv.cc: Likewise. * config/rs6000/rs6000.cc: Likewise. * dump-context.h (dump_context::emit_item): Convert "item" param from * to const &. (dump_pretty_printer::stash_item): Convert "item" param from optinfo_ * to std::unique_ptr<optinfo_item>. (dump_pretty_printer::emit_item): Likewise. * dumpfile.cc: Include "make-unique.h". (make_item_for_dump_gimple_stmt): Replace uses of optinfo_item * with std::unique_ptr<optinfo_item>. (dump_context::dump_gimple_stmt): Likewise. (make_item_for_dump_gimple_expr): Likewise. (dump_context::dump_gimple_expr): Likewise. (make_item_for_dump_generic_expr): Likewise. (dump_context::dump_generic_expr): Likewise. (make_item_for_dump_symtab_node): Likewise. (dump_pretty_printer::emit_items): Likewise. (dump_pretty_printer::emit_any_pending_textual_chunks): Likewise. (dump_pretty_printer::emit_item): Likewise. (dump_pretty_printer::stash_item): Likewise. (dump_pretty_printer::decode_format): Likewise. (dump_context::dump_printf_va): Fix overlong line. (make_item_for_dump_dec): Replace uses of optinfo_item * with std::unique_ptr<optinfo_item>. (dump_context::dump_dec): Likewise. (dump_context::dump_symtab_node): Likewise. (dump_context::begin_scope): Likewise. (dump_context::emit_item): Likewise. * gimple-loop-interchange.cc: Define INCLUDE_MEMORY. * gimple-loop-jam.cc: Likewise. * gimple-loop-versioning.cc: Likewise. * graphite-dependences.cc: Likewise. * graphite-isl-ast-to-gimple.cc: Likewise. * graphite-optimize-isl.cc: Likewise. * graphite-poly.cc: Likewise. * graphite-scop-detection.cc: Likewise. * graphite-sese-to-poly.cc: Likewise. * graphite.cc: Likewise. * opt-problem.cc: Likewise. * optinfo.cc (optinfo::add_item): Convert "item" param from optinfo_ * to std::unique_ptr<optinfo_item>. (optinfo::emit_for_opt_problem): Update for change to dump_context::emit_item. * optinfo.h: Add #error to fail immediately if INCLUDE_MEMORY wasn't defined, rather than fail to find std::unique_ptr. (optinfo::add_item): Convert "item" param from optinfo_ * to std::unique_ptr<optinfo_item>. * sese.cc: Define INCLUDE_MEMORY. * targhooks.cc: Likewise. * tree-data-ref.cc: Likewise. * tree-if-conv.cc: Likewise. * tree-loop-distribution.cc: Likewise. * tree-parloops.cc: Likewise. * tree-predcom.cc: Likewise. * tree-ssa-live.cc: Likewise. * tree-ssa-loop-ivcanon.cc: Likewise. * tree-ssa-loop-ivopts.cc: Likewise. * tree-ssa-loop-prefetch.cc: Likewise. * tree-ssa-loop-unswitch.cc: Likewise. * tree-ssa-phiopt.cc: Likewise. * tree-ssa-threadbackward.cc: Likewise. * tree-ssa-threadupdate.cc: Likewise. * tree-vect-data-refs.cc: Likewise. * tree-vect-generic.cc: Likewise. * tree-vect-loop-manip.cc: Likewise. * tree-vect-loop.cc: Likewise. * tree-vect-patterns.cc: Likewise. * tree-vect-slp-patterns.cc: Likewise. * tree-vect-slp.cc: Likewise. * tree-vect-stmts.cc: Likewise. * tree-vectorizer.cc: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/dump_plugin.c: Define INCLUDE_MEMORY. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-08-29Fortran: fix ICE with use with rename of namelist member [PR116530]Harald Anlauf2-1/+29
gcc/fortran/ChangeLog: PR fortran/116530 * trans-io.cc (transfer_namelist_element): Prevent NULL pointer dereference. gcc/testsuite/ChangeLog: PR fortran/116530 * gfortran.dg/use_rename_12.f90: New test.
2024-08-29hppa: Fix handling of unscaled index addresses on HP-UXJohn David Anglin1-12/+8
The PA-RISC architecture uses the top two bits of memory pointers to select space registers. The space register ID is ored with the pointer offset to compute the global virtual address for an access. The new late combine passes broke gcc on HP-UX. One of these passes runs after reload. The existing code assumed no unscaled index instructions would be created after reload as the REG_POINTER flag is not reliable after reload. The new pass sometimes interchanged the base and index registers, causing these instructions to fault when the wrong space register was selected. I investigated various alternatives to try to retain generation of unscaled index instructions on HP-UX. It's not possible to simply treat unscaled index addresses as not legitimate after reload as sometimes instructions need to be rerecognized after reload. So, we needed to allow unscaled index addresses after reload and to disable the late combine passes. I had noticed that reversing the current order of base and index register canonicalization resulted in more accesses using unscaled index addresses. However, this exposed issues with the REG_POINTER flag. The flag is not propagated when a constant is added to a pointer. Tree opimization sometimes adds two pointers. I found that I had to treat the result as a pointer but the addition generally corrupts the space register bits. These get fixed when a negative pointer is added. Finally, the REG_POINTER flag isn't set when a pointer is passed in a function call. I couldn't get this approach to work. Thus, I came to the conclusion that the best approach was to disable use of unscaled index addresses on HP-UX. I don't think this impacts performance significantly. Code size might get slightly larger but we get some or more back from having the late combine passes. 2024-08-29 John David Anglin <danglin@gcc.gnu.org> gcc/ChangeLog: * config/pa/pa.cc (load_reg): Don't generate load with unscaled index address when !TARGET_NO_SPACE_REGS. (pa_legitimate_address_p): Only allow unscaled index addresses when TARGET_NO_SPACE_REGS.
2024-08-29expand: Allow widdening optab when expanding popcount==1 [PR116508]Andrew Pinski2-2/+47
After adding popcount{qi,hi}2 to the aarch64 backend, I noticed that the expansion for popcount==1 was no longer trying to do the trick of handling popcount==1 as `(arg ^ (arg - 1)) > arg - 1`. The problem is the expansion was using OPTAB_DIRECT, when using OPTAB_WIDEN will allow modes which are smaller than SImode (in the aarch64 case). Note QImode's cost still needs some improvements so part of popcnt-eq-1.c is xfailed. Though there is a check to make sure the costs are compared now. Built and tested on aarch64-linux-gnu. PR middle-end/116508 gcc/ChangeLog: * internal-fn.cc (expand_POPCOUNT): Use OPTAB_WIDEN for PLUS and XOR/AND expansion. gcc/testsuite/ChangeLog: * gcc.target/aarch64/popcnt-eq-1.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-08-29ada: Fix assertion failure on private limited with clauseEric Botcazou1-0/+1
This checks that the name is of an entity before accessing its Entity field. gcc/ada/ * sem_ch8.adb (Has_Private_With): Add test on Is_Entity_Name.
2024-08-29ada: Fix internal error on concatenation of discriminant-dependent componentEric Botcazou1-1/+9
This only occurs with optimization enabled, but the expanded code is always wrong because it reuses the formal parameter of an initialization procedure associated with a discriminant (a discriminal in GNAT parlance) outside of the initialization procedure. gcc/ada/ * checks.adb (Selected_Length_Checks.Get_E_Length): For a component of a record with discriminants and if the expression is a selected component, try to build an actual subtype from its prefix instead of from the discriminal.
2024-08-29ada: Missing legality check when type completedSteve Baird2-4/+30
Refine previous fix to better handle tagged cases. gcc/ada/ * sem_ch6.adb (Check_Discriminant_Conformance): Immediately after calling Is_Immutably_Limited_Type, perform an additional test that one might reasonably imagine would instead have been part of Is_Immutably_Limited_Type. The new test is a call to a new function Has_Tagged_Limited_Partial_View whose implementation includes a call to Incomplete_Or_Partial_View, which cannot be easily be called from Is_Immutably_Limited_Type (because sem_aux, which is in the closure of the binder, cannot easily "with" sem_util). * sem_aux.adb (Is_Immutably_Limited): Include N_Derived_Type_Definition case when testing Limited_Present flag.
2024-08-29ada: Fix missing finalization for call to function returning limited viewEric Botcazou1-3/+5
The call is legal because it is made from the body, which has visibility on the nonlimited view, so this changes the code in Expand_Call_Helper to look at the Etype of the call node instead of the Etype of the function. gcc/ada/ * exp_ch6.adb (Expand_Call_Helper): In the case of a function call, look at the Etype of the call node to determine whether finalization actions need to be performed.
2024-08-29ada: Print Insertion_Sloc in dmsgViljar Indus1-0/+5
gcc/ada/ * erroutc.adb (dmsg): Print Insertion_Sloc.
2024-08-29ada: Use the same warning character in continuation messagesViljar Indus4-6/+6
For consitency sake the main and continuation messages should use the same warning characters. gcc/ada/ * exp_aggr.adb (Expand_Range_Component): Remove extra warning character. Use same conditional warning char. * freeze.adb (Warn_Overlay): Use named warning character. * restrict.adb (Id_Case): Use named warning character. * sem_prag.adb (Rewrite_Assertion_Kind): Use default warning character.
2024-08-29ada: Restructure continuation message for pretty printingViljar Indus1-1/+6
Continuation messages should have the same location as the main message. If the goal is to point to a different location then Error_Msg_Sloc should be used to change the location of the continuation message. gcc/ada/ * par-ch4.adb (P_Name): Use Error_Msg_Sloc for the location of the continuation message.
2024-08-29ada: Improve Inspection_Point warningViljar Indus1-9/+10
Ensure that the primary and sub message point to the same location in order to assure that the submessages get pretty printed in the correct order. gcc/ada/ * exp_prag.adb (Expand_Pragma_Inspection_Point): Improve sub diagnostic generation.
2024-08-29ada: Avoid creating continuation messages without an intended parentViljar Indus4-5/+12
The messages modified in this patch do not have a clear intended parent. This causes a lot of issues when grouping continuation messages together with their parent. This can be confusing as it is not obvious what was the parent message that caused this problem or in worst case scenarios the message not being printed alltogether. These modified messages do not seem to be related to any concrete error message and thus should be treated as independent messages. gcc/ada/ * sem_ch12.adb (Abandon_Instantiation): Remove continuation characters from the error message. * sem_ch13.adb (Check_False_Aspect_For_Derived_Type): Remove continuation characters from the error message. * sem_ch6.adb (Assert_False): Avoid creating a continuation message without a parent. If no primary message is created then the message is considered as primary. gcc/testsuite/ChangeLog: * gnat.dg/interface6.adb: Adjust test.
2024-08-29ada: Parse the attributes of continuation messages correctlyViljar Indus2-5/+25
Currently unless pretty printing is enabled we avoid parsing the message strings for continuation messages. This leads to inconsistent state for the Error_Msg_Object-s that are being created. gcc/ada/ * erroutc.adb (Prescan_Message): Avoid not parsing all of the message attributes. * erroutc.ads: Update the documentation.
2024-08-29ada: Use consistent type continuations messagesViljar Indus3-8/+8
Avoid cases where the main message is an error and the continuation is a warning. gcc/ada/ * freeze.adb: Remove warning insertion characters from a continuation message. * sem_util.adb: Remove warning insertion characters from a continuation message. * sem_warn.adb: Use same warning character as the main message.
2024-08-29ada: Extract line fitting algorithmViljar Indus2-85/+96
Separate the line fitting algorithm from the general line printing algorithm. gcc/ada/ * erroutc.ads: Add new method Output_Text_Within * erroutc.adb: Move the line fitting code to a new method called Output_Text_Within
2024-08-29ada: Ensure validity checks for private scalar typesPiotr Trojanek2-2/+3
To check validity of data values, we must strip privacy from their types. gcc/ada/ * checks.adb (Expr_Known_Valid): Use Validated_View, which strips type derivation and privacy. * exp_ch3.adb (Simple_Init_Private_Type): Kill checks inside unchecked conversions, just like in Simple_Init_Scalar_Type.
2024-08-29ada: Display actual line length in line length checkViljar Indus1-1/+3
gcc/ada/ * styleg.adb (Check_Line_Max_Length): Add the actual line length to the diagnostic message.
2024-08-29ada: Proper handling for iterator associations in array aggregatesGary Dismukes1-1/+61
The compiler was flagging type-mismatch errors on iterated component associations in array aggregates of form "for C in <iterator_name>", improperly requiring the type of the iterator to be the array index type. The parser can't distinguish whether the association is one involving an actual discrete choice vs. an iterator specification, and creates an N_Iterated_Component_Association with a Defining_Identifer and Discrete_Choices, and the analysis phase has to disambiguate this, determining whether to create an N_Iterator_Specification node for the association. A related change is to revise the similar code for iterated associations of container aggregates, to allow forms of iterator objects other than just function calls. gcc/ada/ * sem_aggr.adb (Resolve_Array_Aggregate): Add loop over associations to locate N_Iterated_Component_Associations that do not have an Iterator_Specification, and if their Discrete_Choices list consists of a single choice, analyze it and if it's the name of an iterator object, then create an Iterator_Specification and associate it with the iterated component association. (Resolve_Iterated_Association): Replace test for function call with test of Is_Object_Reference, to handle other forms of iterator objects in container aggregates.
2024-08-29ada: First controlling parameter aspectJavier Miranda3-40/+211
gcc/ada/ * usage.adb (Usage): Document switch -gnatw_j * doc/gnat_rm/gnat_language_extensions.rst: Add documentation. * gnat_rm.texi: Regenerate.
2024-08-29ada: Update documentation for conditional when constructsJustin Squirek3-158/+157
This patch moves the documentation for conditional when constructs out of the curated set (e.g. into -gnatX0). gcc/ada/ * doc/gnat_rm/gnat_language_extensions.rst: Move conditional when constructs out of the curated set. * gnat_rm.texi: Regenerate. * gnat_ugn.texi: Regenerate.
2024-08-29Allow subregs around constant displacements [PR116516]Richard Sandiford2-4/+34
This patch fixes a regression introduced by g:708ee71808ea61758e73. x86_64 allows addresses of the form: (zero_extend:DI (subreg:SI (symbol_ref:DI "foo") 0)) Before the previous patch, a lax SUBREG check meant that we would treat the subreg as a base and reload it into a base register. But that wasn't what the target was expecting. Instead we should treat "foo" as a constant displacement, to match: leal foo, <dest> After the patch, we recognised that "foo" isn't a base register, but ICEd on it rather than handling it as a displacement. With or without the recent patches, if the address had instead been: (zero_extend:DI (subreg:SI (plus:DI (reg:DI R) (symbol_ref:DI "foo") 0))) then we would have treated "foo" as the displacement and R as the base or index, as expected. The problem was that the code that does this was rejecting all subregs of objects, rather than just subregs of variable objects. gcc/ PR middle-end/116516 * rtlanal.cc (strip_address_mutations): Allow subregs around constant displacements. gcc/testsuite/ PR middle-end/116516 * gcc.c-torture/compile/pr116516.c: New test.
2024-08-29Make some smallest_int_mode_for_size calls cope with failureRichard Sandiford2-10/+12
smallest_int_mode_for_size now returns an optional mode rather than aborting on failure. This patch adjusts a couple of callers so that they fail gracefully when no mode exists. There should be no behavioural change, since anything that triggers the new return paths would previously have aborted. I just think this is how the code would have been written if the option had been available earlier. gcc/ * dse.cc (find_shift_sequence): Allow smallest_int_mode_for_size to failure. * optabs.cc (expand_twoval_binop_libfunc): Likewise.
2024-08-29AVR: target/115830 - Make better use of SREG.N and SREG.Z.Georg-Johann Lay16-260/+1675
This patch adds new CC modes CCN and CCZN for operations that set SREG.N, resp. SREG.Z and SREG.N. Add peephole2 patterns to generate new compute + branch insns that make use of the Z and N flags. Most of these patterns need their own asm output routines that don't do all the micro-optimizations that the ordinary outputs may perform, as the latter have no requirement to set CC in a usable way. We don't use cmpelim because it cannot provide scratch regs (which peephole2 can), and some of the patterns require a scratch reg, whereas the same operations that don't set REG_CC don't require a scratch. See the comments in avr.md for details. The existing add.for.cc* patterns are simplified as they no more cover QImode, which is handled in a separate QImode case. Apart from that, it adds 3 patterns for subtractions and one pattern for shift left, all for multi-byte cases (HI, PSI, SI). The add.for.cc* patterns now use CC[Z]Nmode, instead of the formerly abuse of CCmode. PR target/115830 gcc/ * config/avr/avr-modes.def (CCN, CCZN): New CC_MODEs. * config/avr/avr-protos.h (avr_cond_branch): New from ret_cond_branch. (avr_out_plus_set_N, avr_op8_ZN_operator, avr_cmp0_code) (avr_out_op8_set_ZN, avr_len_op8_set_ZN): New protos. (ccn_reg_rtx, cczn_reg_rtx): New declarations. * config/avr/avr.cc (avr_cond_branch): New from ret_cond_branch. (avr_cond_string): Add bool cc_overflow_unusable argument. (avr_print_operand) ['L']: Like 'j' but overflow unusable. ['K']: Like 'k' but overflow unusable. (avr_out_plus_set_ZN): Remove handling of QImode. (avr_out_plus_set_N, avr_op8_ZN_operator, avr_cmp0_code) (avr_out_op8_set_ZN, avr_len_op8_set_ZN): New functions. (avr_adjust_insn_length) [ADJUST_LEN_ADD_SET_N]: Hande case. (avr_class_max_nregs): All MODE_CCs occupy one hard reg. (avr_hard_regno_nregs): Same. (avr_hard_regno_mode_ok) [REG_CC]: Allow all MODE_CC. (pass_manager.h, context.h, tree-pass.h): Include them. (ccn_reg_rtx, cczn_reg_rtx): New GTY variables. (avr_init_expanders): Initialize them. (avr_option_override): Run peephole2 a second time. * config/avr/avr.md (adjust_len) [add_set_N]: New attr value. (ALLCC, HI_SI): New mode iterators. (CCname): New mode attribute. (eqnegtle, cmp_signed, op8_ZN): New code iterators. (swap, SWAP): New code attributes. (branch): Handle CCNmode and CCZNmode. Assimilate... (difficult_branch): ...this insn. (p1m1): Remove. (gen_add_for_<code>_<mode>): Adjust to CCNmode and CCZNmode. Use HISI as mode iterator. Extend peephole2s that produce them. (*add.for.eqne.<mode>): Extend to *add.for.cc[z]n.<mode>. (*ashift.for.ccn.<mode>): New insn and peephole2 to make them. (*sub.for.cczn.<mode>, *sub-extend<mode>.for.cczn.<mode>): New insns and peephole2s to make them. (*op8.for.cczn.<code>): New insn and peephole2 to make them. * config/avr/predicates.md (const_1_to_3_operand) (abs1_abs2_operand, signed_comparison_operator) (op8_ZN_operator): New predicates. gcc/testsuite/ * gcc.target/avr/pr115830-add.c: New test. * gcc.target/avr/pr115830-add-c.c: New test. * gcc.target/avr/pr115830-add-i.c: New test. * gcc.target/avr/pr115830-and.c: New test. * gcc.target/avr/pr115830-asl.c: New test. * gcc.target/avr/pr115830-asr.c: New test. * gcc.target/avr/pr115830-ior.c: New test. * gcc.target/avr/pr115830-lsr.c: New test. * gcc.target/avr/pr115830-asl32.c: New test. * gcc.target/avr/pr115830-sub.c: New test. * gcc.target/avr/pr115830-sub-ext.c: New test.
2024-08-29c++: don't remove labels during coro-early-expand-ifns [PR105104]Arsen Arsenović2-26/+40
In some scenarios, it is possible for the CFG cleanup to cause one of the labels mentioned in CO_YIELD, which coro-early-expand-ifns intends to remove, to become part of some statement. As a result, when that label is removed, the statement it became part of becomes invalid, crashing the compiler. There doesn't appear to be a reason to remove the labels (anymore, at least), so let's not do that. PR c++/105104 gcc/ChangeLog: * coroutine-passes.cc (execute_early_expand_coro_ifns): Don't remove any labels. gcc/testsuite/ChangeLog: * g++.dg/coroutines/torture/pr105104.C: New test.
2024-08-29AVR: Outsource code for avr-specific passes to new avr-passes.cc.Georg-Johann Lay6-2120/+2222
gcc/ * config.gcc (extra_objs) [target=avr]: Add avr-passes.o. * config/avr/t-avr (avr-passes.o): New rule to make it. * config/avr/avr.cc (#define INCLUDE_VECTOR): Remove. (cfganal.h, cfgrtl.h, context.h, tree-pass.h, print-rtl.h): Don't include them. (avr_strict_signed_p, avr_strict_unsigned_p, avr_2comparisons_rhs) (make_avr_pass_recompute_notes, make_avr_pass_casesi) (make_avr_pass_ifelse, make_avr_pass_pre_proep, avr_split_tiny_move) (emit_move_ccc, emit_move_ccc_after, reg_seen_between_p) (avr_maybe_adjust_cfa, avr_redundant_compare_regs) (avr_parallel_insn_from_insns, avr_is_casesi_sequence) (avr_optimize_casesi, avr_redundant_compare, make_avr_pass_fuse_add) (avr_optimize_2ifelse, avr_rest_of_handle_ifelse) (avr_casei_sequence_check_operands) Move functions... (avr_pass_data_fuse_add, avr_pass_data_ifelse) (avr_pass_data_casesi, avr_pass_data_recompute_notes) (avr_pass_data_pre_proep): Move objects... (avr_pass_fuse_add, avr_pass_pre_proep, avr_pass_recompute_notes) (avr_pass_ifelse, avr_pass_casesi, AVR_LdSt_Props): Move classes... * config/avr/avr-passes.cc: ... to this new C++ module. (struct Ranges): Move to... * config/avr/ranges.h: ...this new file. * config/avr/avr-protos.h: Adjust comments.
2024-08-29testsuite: Fix up refactored scanltranstree.exp functions [PR116522]Alex Coplan1-1/+1
When adding RTL variants of the scan-ltrans-tree* functions in: r15-3254-g3f51f0dc88ec21c1ec79df694200f10ef85915f4 I messed up the name of the underlying scan function to invoke. The code currently attempts to invoke functions named scan{,-not,-dem,-dem-not} but should instead be invoking scan-dump{,-not,-dem,-dem-not}. This patch fixes that. gcc/testsuite/ChangeLog: PR testsuite/116522 * lib/scanltranstree.exp: Fix name of underlying scan function used for scan-ltrans-{tree,rtl}-dump{,-not,-dem,-dem-not}.
2024-08-29RISC-V: Fix subreg of VLS modes larger than a vector [PR116086].Robin Dapp7-0/+385
When the source mode is potentially larger than one vector (e.g. an LMUL2 mode for VLEN=128) we don't know which vector the subreg actually refers to. For zvl128b and LMUL=2 the subreg in (subreg:V2DI (reg:V4DI)) could actually be the a full (high) vector register of a two-register group (at VLEN=128) or the higher part of a single register (at VLEN>128). As the subreg is statically ambiguous we prevent such situations in can_change_mode_class. The culprit in PR116086 is _12 = BIT_FIELD_REF <vect_cst__42, 128, 128>; which can be expanded with a vector-vector extract (from V4DI to V2DI). This patch adds a VLS-mode vector-vector extract that handles "halving" cases like this one by sliding down the source vector, thus making sure the correct part is used. PR target/116086 gcc/ChangeLog: * config/riscv/autovec.md (vec_extract<mode><v_half>): Add vector-vector extract for VLS modes. * config/riscv/riscv.cc (riscv_can_change_mode_class): Forbid VLS modes larger than one vector. * config/riscv/vector-iterators.md: Add vector-vector extract iterators. gcc/testsuite/ChangeLog: * lib/target-supports.exp: Add effective target checks for zvl256b and zvl512b. * gcc.target/riscv/rvv/autovec/pr116086-2-run.c: New test. * gcc.target/riscv/rvv/autovec/pr116086-2.c: New test. * gcc.target/riscv/rvv/autovec/pr116086.c: New test.
2024-08-28i386: Support wide immediate constants in STV.Roger Sayle1-1/+27
This patch provides more accurate costs/gains for (wide) immediate constants in STV, suitably adjusting the costs/gains when the highpart and lowpart words are the same. 2024-08-28 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * config/i386/i386-features.cc (timode_immed_const_gain): New function to determine the gain/cost on a CONST_WIDE_INT. (timode_scalar_chain::compute_convert_gain): Fix whitespace. <case CONST_WIDE_INT>: Provide more accurate estimates using timode_immed_const_gain. <case AND>: Handle CONSTANT_SCALAR_INT_P (src).
2024-08-29Write LF_MFUNC_ID types for CodeView struct member functionsMark Harmstone1-13/+137
If recording the definition of a struct member function, write an LF_MFUNC_ID type rather than an LF_FUNC_ID. This links directly to the struct type, rather than to an LF_STRING_ID with its name. gcc/ * dwarf2codeview.cc (enum cv_leaf_type): Add LF_MFUNC_ID. (write_lf_mfunc_id): New function. (add_lf_func_id): New function. (add_lf_mfunc_id): New function. (add_function): Call add_lf_func_id or add_lf_mfunc_id.
2024-08-29Record member functions in CodeView struct definitionsMark Harmstone2-11/+528
CodeView has two ways of recording struct member functions. Non-overloaded functions have an LF_ONEMETHOD sub-type in the field list, which records the name and the function type (LF_MFUNCTION). Overloaded functions have an LF_METHOD instead, which points to an LF_METHODLIST, which is an array of links to various LF_MFUNCTION types. gcc/ * dwarf2codeview.cc (enum cv_leaf_type): Add LF_MFUNCTION, LF_METHODLIST, LF_METHOD, and LF_ONEMETHOD. (struct codeview_subtype): Add lf_onemethod and lf_method to union. (struct lf_methodlist_entry): New type. (struct codeview_custom_type): Add lf_mfunc_id, lf_mfunction, and lf_methodlist to union. (struct codeview_method): New type. (struct method_hasher): New type. (get_type_num_subroutine_type): Add forward declaration. (write_lf_fieldlist): Handle LF_ONEMETHOD and LF_METHOD. (write_lf_mfunction): New function. (write_lf_methodlist): New function. (write_custom_types): Handle LF_MFUNCTION and LF_METHODLIST. (add_struct_function): New function. (get_mfunction_type): New function. (is_templated_func): New function. (get_type_num_struct): Handle DW_TAG_subprogram child DIEs. (get_type_num_subroutine_type): Add containing_class_type, this_type, and this_adjustment params, and handle creating LF_MFUNCTION types as well as LF_PROCEDURE. (get_type_num): New params for get_type_num_subroutine_type. (add_function): New params for get_type_num_subroutine_type. * dwarf2codeview.h (CV_METHOD_VANILLA, CV_METHOD_VIRTUAL): Define. (CV_METHOD_STATIC, CV_METHOD_FRIEND, CV_METHOD_INTRO): Likewise. (CV_METHOD_PUREVIRT, CV_METHOD_PUREINTRO): Likewise.
2024-08-29Record static data members in CodeView structsMark Harmstone1-47/+136
Record LF_STMEMBER field list subtypes to represent static data members in structs. gcc/ * dwarf2codeview.cc (enum cv_leaf_type): Add LF_STMEMBER. (struct codeview_subtype): Add lf_static_member to union. (write_lf_fieldlist): Handle LF_STMEMBER. (add_struct_member): New function. (add_struct_static_member): New function. (get_accessibility): New function. (get_type_num_struct): Split out into add_struct_member and get_accessibility, and handle static members.
2024-08-29Handle scoping in CodeView LF_FUNC_ID typesMark Harmstone1-2/+137
If a function is in a namespace, create an LF_STRING_ID type for the name of its parent, and record this in the LF_FUNC_ID type we create for the function. gcc/ * dwarf2codeview.cc (enum cf_leaf_type): Add LF_STRING_ID. (struct codeview_custom_type): Add lf_string_id to union. (struct string_id_hasher): New type. (string_id_htab): New global variable. (write_lf_string_id): New function. (write_custom_types): Call write_lf_string_id. (codeview_debug_finish): Free string_id_htab. (add_string_id): New function. (get_scope_string_id): New function. (add_function): Call get_scope_string_id and set scope.
2024-08-29Handle namespaced names for CodeViewMark Harmstone3-16/+83
Run all CodeView names through a new function get_name, which chains together a DIE's DW_AT_name with that of its parent to create a C++-style name. gcc/ * dwarf2codeview.cc (get_name): New function. (add_enum_forward_def): Call get_name. (get_type_num_enumeration_type): Call get_name. (add_struct_forward_def): Call get_name. (get_type_num_struct): Call get_name. (add_variable): Call get_name. (add function): Call get_name. * dwarf2out.cc (get_die_parent): Rename to dw_get_die_parent and make non-static. (generate_type_signature): Handle renamed get_die_parent. * dwarf2out.h (dw_get_die_parent): Add declaration.
2024-08-29Daily bump.GCC Administrator7-1/+364
2024-08-28c++: wrong error due to std::initializer_list opt [PR116476]Marek Polacek2-1/+26
Here maybe_init_list_as_array gets elttype=field, init={NON_LVALUE_EXPR <2>} and it tries to convert the init's element type (int) to field using implicit_conversion, which works, so overall maybe_init_list_as_array is successful. But it constifies init_elttype so we end up with "const int". Later, when we actually perform the conversion and invoke field::field(T&&), we end up with this error: error: binding reference of type 'int&&' to 'const int' discards qualifiers So I think maybe_init_list_as_array should try to perform the conversion, like it does below with fc. PR c++/116476 gcc/cp/ChangeLog: * call.cc (maybe_init_list_as_array): Try convert_like and see if it worked. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-opt2.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-08-28PR modula2/116181 remove ODR warnings from library interface filesGaius Mulley18-1124/+1649
This patch removes the warnings generated by -Wodr from the library interface between modula-2 and C. gcc/m2/ChangeLog: PR modula2/116181 * Make-lang.in (MC_SRC_FLAGS): New macro. (m2/mc-boot/$(SRC_PREFIX)%.o): Use MC_SRC_FLAGS. (m2/mc-boot-ch/$(SRC_PREFIX)%.o): Ditto. (m2/gm2-libs-boot/M2RTS.o): Ditto. (m2/gm2-libs-boot/%.o): Ditto. (GM2-LIBS-BOOT-H): New macro. (m2/gm2-libs-boot/RTcodummy.o): Use MC_SRC_FLAGS. Remove gm2-libs-host.h from the dependancy. (m2/gm2-libs-boot/wrapc.o): Use MC_SRC_FLAGS. Add dependancy GM2-LIBS-BOOT-H. (m2/gm2-libs-boot/UnixArgs.o): Ditto. (m2/gm2-libs-boot/choosetemp.o): Ditto. (m2/gm2-libs-boot/errno.o): Ditto. (m2/gm2-libs-boot/dtoa.o): Ditto. (m2/gm2-libs-boot/ldtoa.o): Ditto. (m2/gm2-libs-boot/termios.o): Ditto. (m2/gm2-libs-boot/SysExceptions.o): Ditto. (m2/gm2-compiler-boot/M2GCCDeclare.o): Add gm2-libs-ch to the search path. (m2/gm2-compiler-boot/M2Error.o): Ditto. (m2/gm2-compiler-boot/%.o): Ditto. (m2/pge-boot/%.o): Ditto. * gm2-gcc/m2color.cc (m2color_colorize_start): Replace parameter type char to void and recast to char * when calling colorize_start. * gm2-gcc/m2color.h (m2color_colorize_start): Replace parameter type char to void. * gm2-gcc/m2type.h: Remove #if 0 block. * gm2-libs-ch/SysExceptions.c (DECL_PROC_T): Provide alternative defines for MC an gm2. (PROC_FUNC): Ditto. (EXTERN): Force undefine and redefine. (SysExceptions_InitExceptionHandlers): Rewrite function declaration using defined macros. (_M2_SysExceptions_init): Use EXTERN. (_M2_SysExceptions_finish): Replace with ... (_M2_SysExceptions_fini): ... this and add parameters. * gm2-libs-ch/UnixArgs.cc (gm2-libs-host.h): Include. (GUnixArgs.h): Include. (GM2RTS.h): Include. (UnixArgs_GetArgV): Change return type to void *. (UnixArgs_GetEnvV): Ditto. * gm2-libs-ch/m2rts.h (M2RTS_RegisterModule_Cstr): Add new conditional macro. (M2RTS_RequestDependant): Remove. (M2RTS_RegisterModule): Ditto. (M2RTS_Terminate): Ditto. (M2RTS_DeconstructModules): Ditto. (M2RTS_Halt): Ditto. (_M2_M2RTS_init): Ditto. (M2RTS_ConstructModules): Ditto. * gm2-libs-ch/termios.c (_termios_C): Define. (EXTERN): Add conditional definition. (doSetUnset): New function. (_M2_termios_init): Add correct parameters. (_M2_termios_finish): Ditto. (_M2_termios_fini): Ditto. * mc-boot-ch/GSysExceptions.c (DECL_PROC_T): New define. (PROC_FUNC): Ditto. (EXTERN): Force undef. (SysExceptions_InitExceptionHandlers): Rewrite. * mc-boot-ch/Glibc.c (libc_open): Rename parameter oflag to flags. * mc-boot-ch/Gtermios.cc (_termios_C): New define. (KillTermios): Change parameter type from struct termios * to termios_TERMIOS. (tcsnow): Rewrite. (tcsnow): Rewrite. (tcsdrain): Rewrite. (tcsflush): Rewrite. (cfgetospeed): Rewrite. (cfgetispeed): Rewrite. (cfsetospeed): Rewrite. (cfsetispeed): Rewrite. (cfsetspeed): Rewrite. (cfsetspeed): Rewrite. (tcgetattr): Rewrite. (tcsetattr): Rewrite. (cfmakeraw): Rewrite. (tcsendbreak): Rewrite. (tcdrain): Rewrite. (tcflushi): Rewrite. (tcflusho): Rewrite. (tcflushio): Rewrite. (tcflowoni): Rewrite. (tcflowoffi): Rewrite. (tcflowono): Rewrite. (tcflowoffo): Rewrite. (GetFlag): Rewrite. (SetFlag): Rewrite. (GetChar): Rewrite. (SetChar): Rewrite. (InitTermios): Rewrite. * pge-boot/GM2RTS.cc: Regenerate. * pge-boot/GSysExceptions.cc: Ditto. * pge-boot/Gtermios.cc: Ditto. * pge-boot/m2rts.h: Rewrite. * mc-boot-ch/GSYSTEM.h: New file. * mc-boot-ch/GSysExceptions.h: New file. * mc-boot-ch/Gtermios.h: New file. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-08-28expand: Add debug dump on the cost for `popcount==1` expandAndrew Pinski1-0/+5
While working on PR 114224, I found it would be useful to dump the different costs of the expansion to make easier to understand why one was chosen over the other. Changes since v1: * v2: make the dump a single line Bootstrapped and tested on x86_64-linux-gnu. Build and tested for aarch64-linux-gnu. gcc/ChangeLog: * internal-fn.cc (expand_POPCOUNT): Dump the costs for the two choices.
2024-08-28doc: Add Dhruv Matani to ContributorsJonathan Wakely1-0/+3
gcc/ChangeLog: * doc/contrib.texi (Contributors): Add Dhruv Matani.
2024-08-28AVR: Overhaul the avr-ifelse RTL optimization pass.Georg-Johann Lay17-229/+1275
Mini-pass avr-ifelse realizes optimizations that replace two cbranch insns with one comparison and two branches. This patch adds the following improvements: - The right operand of the comparisons may also be REGs. Formerly only CONST_INT was handled. - The RTX code of the first comparison in no more restricted to (effectively) EQ. - When the second cbranch is located in the fallthrough path of the first cbranch, then difficult (expensive) comparisons can always be avoided. This may require to swap the branch targets. (When the second cbranch is located after the target label of the first one, then getting rid of difficult branches would require to reorder blocks.) - The code has been cleaned up: avr_rest_of_handle_ifelse() now just scans the insn stream for optimization candidates. The code that actually performs the transformation has been outsourced to the new function avr_optimize_2ifelse(). - The code to find a better representation for reg-const_int comparisons has been split into two parts: First try to find codes such that the right-hand sides of the comparisons are the same (avr_2comparisons_rhs). When this succeeds then one comparison can serve two branches, and that function tries to get rid of difficult branches. This is always possible when the second cbranch is located in the fallthrough path of the first one. Some final notes on why we don't use compare-elim: 1) The two cbranch insns may come with different scratch operands depending on the chosen constraint alternatives. There are cases where the outgoing comparison requires a scratch but only one incoming cbranch has one. 2) Avoiding difficult branches can be achieved by rewiring basic blocks. compare-elim doesn't do that; it doesn't even know the costs of the branch codes. 3) avr_2comparisons_rhs() may de-canonicalize a comparison to achieve its goal. compare-elim doesn't know how to do that. 4) There are more reasons, see for example the commit message and discussion for PR115830. avr_2comparisons_rhs tries to decompose the interval as given by some [u]intN_t into three intervals using the new Ranges struct that implemens set operations on finite unions of intervals. Sadly, value-range.h is not well suited for that, and writing a wrapper around it that avoids all corner case ICEs would be more laborious than struct Ranges. gcc/ * config/avr/avr.cc (INCLUDE_VECTOR): Define it. (cfganal.h): Include it. (Ranges): New struct. (avr_2comparisons_rhs, avr_redundant_compare_regs) (avr_strict_signed_p, avr_strict_unsigned_p): New static functions. (avr_redundant_compare): Overhaul: Allow more cases. (avr_optimize_2ifelse): New static function, outsourced from... (avr_rest_of_handle_ifelse): ...this method. gcc/testsuite/ * gcc.target/avr/torture/ifelse-c.h: New file. * gcc.target/avr/torture/ifelse-d.h: New file. * gcc.target/avr/torture/ifelse-q.h: New file. * gcc.target/avr/torture/ifelse-r.h: New file. * gcc.target/avr/torture/ifelse-c-i8.c: New test. * gcc.target/avr/torture/ifelse-d-i8.c: New test. * gcc.target/avr/torture/ifelse-q-i8.c: New test. * gcc.target/avr/torture/ifelse-r-i8.c: New test. * gcc.target/avr/torture/ifelse-c-i16.c: New test. * gcc.target/avr/torture/ifelse-d-i16.c: New test. * gcc.target/avr/torture/ifelse-q-i16.c: New test. * gcc.target/avr/torture/ifelse-r-i16.c: New test. * gcc.target/avr/torture/ifelse-c-u16.c: New test. * gcc.target/avr/torture/ifelse-d-u16.c: New test. * gcc.target/avr/torture/ifelse-q-u16.c: New test. * gcc.target/avr/torture/ifelse-r-u16.c: New test.
2024-08-28Add gcc ka.poJoseph Myers1-0/+83090
* ka.po: New file.
2024-08-28c++: ICE with ()-init and TARGET_EXPR eliding [PR116424]Marek Polacek2-7/+27
Here we crash on a cp_gimplify_expr/TARGET_EXPR assert: gcc_checking_assert (!TARGET_EXPR_ELIDING_P (*expr_p) || !TREE_ADDRESSABLE (TREE_TYPE (*expr_p))); We cannot elide the TARGET_EXPR because we're taking its address. It is set as eliding in massage_init_elt. I've tried to not set TARGET_EXPR_ELIDING_P when the context is not direct-initialization. That didn't work: even when it's not direct-initialization now, it can become one later, for instance, after split_nonconstant_init. One problem is that replace_placeholders_for_class_temp_r will replace placeholders in non-eliding TARGET_EXPRs with the slot, but if we then elide the TARGET_EXPR, we end up with a "stray" VAR_DECL and crash. (Only some TARGET_EXPRs are handled by replace_decl.) I thought I'd have to go back to <https://gcc.gnu.org/pipermail/gcc-patches/2024-May/651163.html> but then I realized that this problem occurrs only with ()-init but not {}-init. With {}-init, there is no problem, because we are clearing TARGET_EXPR_ELIDING_P in process_init_constructor_record: /* We can't actually elide the temporary when initializing a potentially-overlapping field from a function that returns by value. */ if (ce->index && TREE_CODE (next) == TARGET_EXPR && unsafe_copy_elision_p (ce->index, next)) TARGET_EXPR_ELIDING_P (next) = false; But that does not happen for ()-init because we have no ce->index. ()-init doesn't allow brace elision so we don't really reshape them. But I can just move the clearing a few lines down and then it handles both ()-init and {}-init. PR c++/116424 gcc/cp/ChangeLog: * typeck2.cc (process_init_constructor_record): Move the clearing of TARGET_EXPR_ELIDING_P down. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/paren-init38.C: New test.