aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
4 dayscobol, v2: Fix up cobol cross-compilation from 32-bit arches [PR119364]Jakub Jelinek17-288/+397
Right now it is not possible to even build cross-compilers from 32-bit architectures to e.g. x86_64-linux or aarch64-linux, even from little-endian ones. The following patch attempts to fix that. There were various issues seen e.g. trying to build i686-linux -> x86_64-linux cross-compiler (so still 64-bit libgcobol, but the compiler is 32-bit). 1) warning about >> 32 shift of size_t, on 32-bit arches size_t is 32-bit and so the shift is UB; fixed by doing (new_size>>16)>>16 so that it ors in >> 32 when new_size is 64-bit and 0 when it is 32-bit 2) enum cbl_field_attr_t was using size_t as underlying type, but has various bitmasks which require full 64-bit type; changed this to uint64_t underlying type and using unsigned long long in the structure; various routines which operate with those attributes had to be changed also to work with uint64_t instead of size_t 3) on i686-linux, config.h can #define _FILE_OFFSET_BITS 64 or similar macros; as documented, those macros have to be defined before including first C library header, but some sources included cobol-system.h which includes config.h only after various other headers; this resulted in link failures, as ino_t was sometimes unsigned long and sometines unsigned long long, depending on whether config.h was included first or not, and e.g. cobol_filename uses ino_t argument 4) lots of places used %ld or %lx *printf format specifers with size_t arguments; that works only if size_t is unsigned long, but not when it is unsigned int or unsigned long long or some other type; now while ISO C99 has %zd or %zx to print size_t and C++14 includes C99 (or C11?), while for the C++ headers the C++ compilers typically have full control over it and so support everything in C++14 (e.g. libstdc++ in GCC 5.1+ or libc++ if not too old), for C library we are dependent on the system C library (note, on the host for the compiler side). And not all hosts support C99 in their C libraries; so instead of just changing it to %zd or %zx, I'm changing it to what we use elsewhere in GCC, HOST_SIZE_T_PRINT_{DEC,UNSIGNED,HEX_PURE} or GCC_PRISZ macros in the *printf family format string and casts of the size_t arguments to fmt_size_t. Note, if not using the C library *printf family (e.g. in dbgmsg, sprintf, snprintf, fprintf, etc.) but the GCC diagnostic code (e.g. err_msg, error, warning, yywarn, ...), then %zd/%zu is supported and on the other side HOST_SIZE_T_PRINT_{DEC,UNSIGNED,HEX_PURE} etc. macros shouldn't be used (for two reasons, because it is unnecessary when %zd/%zu is guaranteed to be supported there because GCC has control over that and more importantly because it breaks translations, both extraction of the to be translated strings and we don't want to have different messages, once with %lld, once with %ld, once with just %d or %I64d depending on host, translators couldn't translate it all). 5) see above, there were already tons of %zd/%zu or %3zu etc. format specifers in *printf format strings, this patch changes those too 6) I've noticed dbgmsg wasn't declared with printf attribute, which resulted in bugs where format specifiers didn't match actually passed types of arguments 2025-05-02 Jakub Jelinek <jakub@redhat.com> PR cobol/119364 libgcobol/ * valconv.cc (__gg__realloc_if_necessary): Use (new_size>>16)>>16; instead of new_size>>32; to avoid warnings on 32-bit hosts. * common-defs.h (enum cbl_field_attr_t): Use uint64_t as underlying type rather than size_t. * gcobolio.h (cblc_field_t): Change attr member type from size_t to unsigned long long. gcc/cobol/ * util.cc (is_numeric_edited): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" and cast corresponding argument to fmt_size_t. (normalize_picture): Use GCC_PRISZ instead of "z" and pass address of fmt_size_t var to sscanf and copy afterwards. (cbl_refer_t::str): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" and cast corresponding argument to fmt_size_t. (struct move_corresponding_field): Likewise. (valid_move): Likewise. (ambiguous_reference): Likewise. (parent_names): Likewise. (find_corresponding::find_corresponding): Likewise. (corresponding_fields): Likewise. (unique_stack::push): Likewise. (cobol_filename): Likewise. * lexio.cc: Include config.h first. (recognize_replacements): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" and cast corresponding argument to fmt_size_t. (check_source_format_directive): Likewise. (parse_replacing_pair): Use size_t(0) instead of 0UL in span_t construction. (parse_replace_pairs): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (parse_copy_directive): Likewise. (parse_replace_last_off): Likewise. (parse_replace_text): Likewise. (bytespan_t::append): Likewise. (cdftext::map_file): Likewise. (cdftext::process_file): Likewise. * symfind.cc (dump_symbol_map2): Likewise. (dump_symbol_map_value): Likewise. (build_symbol_map): Likewise. (is_name::dump_key): Likewise. (symbol_match2): Likewise. (symbol_find): Likewise. (symbol_find_of): Likewise. * cdf.y: Likewise. * symbols.cc: Include config.h first. (cbl_field_t::set_attr): Return uint64_t rather than size_t and replace size_t(attr) with uint64_t(attr). (cbl_field_t::clear_attr): Likewise. (symbol_field_capacity): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (symbol_find_odo_debug): Likewise. (symbols_dump): Likewise. (calculate_capacity): Likewise. (field_str): Likewise. (symbols_update): Likewise. (symbol_field_forward): Likewise. (numeric_group_attrs): Return uint64_t rather than size_t and change inherit variable to from size_t to uint64_t. (new_literal_add): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (temporaries_t::dump): Likewise. (cbl_label_t::str): Likewise. (symbol_label_add): Likewise. (symbol_program_add): Likewise. (symbol_forward_names): Likewise. (symbol_forward_to): Likewise. (cbl_file_key_t::deforward): Likewise. (cbl_file_key_t::str): Likewise. * gengen.cc (show_type): Use PRId64 instead of "ld". (gg_unique_in_function): Use HOST_SIZE_T_PRINT_DEC instead of %ld and cast corresponding argument to fmt_size_t. * scan.l: Add %top section with #include "config.h". * genmath.cc (parser_add): Use HOST_SIZE_T_PRINT_DEC instead of %ld and cast corresponding argument to fmt_size_t. (parser_subtract): Likewise. * parse.y: Include "config.h" before <fstream>. Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" and cast corresponding argument to fmt_size_t. Change type of sign_attrs, group_sign and type_implies from size_t to uint64_t. (perform_t::ec_labels_t::new_label): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (stringify_src_t::dump): Likewise. (lang_check_failed): Likewise. (numstr2i): Use GCC_PRISZ instead of "z" and pass address of temporary with fmt_size_t type to sscanf and then copy it over. (initialize_statement): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (dump_inspect_oper): Likewise. (new_literal): Likewise. (literal_subscripts_valid): Likewise. (eval_subject_t::label): Likewise. * genapi.cc (level_88_helper): Likewise. (parser_call_targets_dump): Likewise. (combined_name): Use HOST_SIZE_T_PRINT_DEC instead of "%ld" and cast corresponding argument to fmt_size_t. (section_label): Likewise. (paragraph_label): Likewise. (leave_procedure): Likewise. (parser_perform): Likewise. (parser_perform_times): Likewise. (internal_perform_through): Likewise. (internal_perform_through_times): Likewise. (parser_enter_program): Likewise. (parser_init_list_size): Likewise. (parser_init_list): Likewise. (psa_FldLiteralN): Likewise. (psa_FldBlob): Likewise. (parser_assign): Likewise. (parser_free): Pass p->field->name to dbgmsg. (parser_division): Use HOST_SIZE_T_PRINT_DEC instead of "%ld" and cast corresponding argument to fmt_size_t. (perform_outofline_before_until): Likewise. (perform_outofline_after_until): Likewise. (perform_outofline_testafter_varying): Likewise. (perform_outofline_before_varying): Likewise. (perform_inline_testbefore_varying): Likewise. (parser_inspect): Change n_operations parameter type from unsigned long to size_t. (parser_intrinsic_callv): Use HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (parser_bitop): Use HOST_SIZE_T_PRINT_HEX_PURE instead of "%lx" and cast corresponding argument to fmt_size_t. (parser_bitwise_op): Likewise. (parser_program_hierarchy): Use HOST_SIZE_T_PRINT_DEC instead of "%ld" and cast corresponding argument to fmt_size_t. (parser_set_handled): Use HOST_SIZE_T_PRINT_HEX_PURE instead of "%lx" and cast corresponding argument to fmt_size_t. (parser_set_numeric): Use HOST_SIZE_T_PRINT_DEC instead of "%ld" and cast corresponding argument to fmt_size_t. (psa_new_var_decl): Use HOST_SIZE_T_PRINT_DEC instead of "%ld" and cast corresponding argument to fmt_size_t. (parser_symbol_add): Use HOST_SIZE_T_PRINT_DEC instead of "%zd" or HOST_SIZE_T_PRINT_HEX_PURE instead of "%lx" and cast corresponding argument to fmt_size_t. * cdf-copy.cc: Include "config.h" first. * scan_ante.h (trim_location): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or "%d" and cast corresponding argument to fmt_size_t. * structs.cc (create_cblc_field_t): Use ULONGLONG instead of SIZE for "attr". * cbldiag.h (dbgmsg): Add ATTRIBUTE_PRINTF_1. * gcobolspec.cc (lang_specific_driver): Use HOST_SIZE_T_PRINT_DEC instead of "%ld" and cast corresponding argument to fmt_size_t. * parse_ante.h (literal_of): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (evaluate_elem_t::dump): Likewise. (arith_t::another_pair): Likewise. (current_t::end_program): Likewise. (file_add): Likewise. (implicit_paragraph): Likewise. (implicit_section): Likewise. (data_division_ready): Use HOST_SIZE_T_PRINT_DEC instead of "%d" and cast corresponding argument to fmt_size_t. * symbols.h (struct cbl_field_t): Change attr member type from size_t to uint64_t. (cbl_field_t::set_attr): Change return type from size_t to uint64_t. (cbl_field_t::clear_attr): Likewise. (function_descr_t::init): Use HOST_SIZE_T_PRINT_UNSIGNED instead of "%zu" or GCC_PRISZ instead of "z" or HOST_SIZE_T_PRINT_DEC instead of "%zd" and cast corresponding argument to fmt_size_t. (cbl_perform_tgt_t::dump): Likewise. (numeric_group_attrs): Change return type from size_t to uint64_t.
4 daysRevert "[PATCH 30/61] MSA: Make MSA and microMIPS R5 unsupported"Jeff Law1-3/+0
This reverts commit 727a43e0a66052235706379239359807230054e0.
4 daysMake ix86 cost of VEC_SELECT equivalent to SUBREG cost 1Jan Hubicka1-3/+36
This patch fixes regression of imagick with PGO and AVX512 where correcting size cost of SSE operations (to be 4 instead of 2 originally cut&pasted from x87) made late combine to eliminate zero registers introduced by rapd. The problem is that cost-model mistakely accounts VEC_SELECT as real instruction while it is optimized to nothing if src==dest (which is the case of these testcases). This register is used to eliminate false dependency between source and destination of int->fp conversions. While ix86_insn_cost hook already contains logic to incrase cost of the zero-extend the costs was not enough. gcc/ChangeLog: PR target/119900 * config/i386/i386.cc (ix86_can_change_mode_class): Add TODO comment. (ix86_rtx_costs): Make VEC_SELECT equivalent to SUBREG cost 1.
4 daysc++: CTAD and constexpr ctor [PR115207]Jason Merrill2-0/+14
Here we failed to constant-evaluate the A<int> constructor because DECL_SIZE wasn't set on 'a' yet, so compare_address thinks we can't be sure it isn't at the same address as 'i'. Normally DECL_SIZE is set by build_decl calling layout_decl, but that doesn't happen here because we don't have a type yet. So we need to layout_decl again after deduction. PR c++/115207 gcc/cp/ChangeLog: * decl.cc (cp_finish_decl): Call layout_decl after CTAD. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/class-deduction118.C: New test.
4 daysc++: fix some testcasesJason Merrill2-2/+2
After r16-332 these tests started failing. constexpr-89285.C should have always given this error, and the new nonlit19.C needs to remove the destructor body to prevent -fimplicit-constexpr from making the testcase well-formed. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/constexpr-89285.C: Always diagnose reinterpret_cast. * g++.dg/cpp23/constexpr-nonlit19.C: Remove ~A body.
4 daysc++: C++17/20 class layout divergence [PR120012]Jason Merrill6-13/+95
C++20 made a class with only explicitly defaulted constructors no longer aggregate, and this wrongly affected whether the class is considered "POD for layout purposes" under the ABI. Conveniently, we already have check_non_pod_aggregate to diagnose cases where this makes a difference, due to PR103681 around a C++14 aggregate change. PR c++/120012 gcc/cp/ChangeLog: * cp-tree.h (struct lang_type): Add non_aggregate_pod. (CLASSTYPE_NON_AGGREGATE_POD): New. * class.cc (check_bases_and_members): Set it. (check_non_pod_aggregate): Diagnose it. gcc/ChangeLog: * doc/invoke.texi: Document C++20 aggregate fix. * common.opt: Likewise. gcc/testsuite/ChangeLog: * g++.dg/abi/base-defaulted1.C: New test. * g++.dg/abi/base-defaulted1a.C: New test.
4 daysi386: -Wabi false positive with indirect call [PR60336]Jason Merrill2-3/+23
This warning relies on the TRANSLATION_UNIT_WARN_EMPTY_P flag (set in cxx_init_decl_processing) to decide whether we want to warn about the GCC 8 empty class parameter passing fix, but in a call through a function pointer we don't have a translation unit and so complain for any -Wabi flag, even now long after this was likely to be relevant. In that situation, let's check the TU for current_function_decl instead. And if we still can't come up with a TU, default to not warning. PR c++/60336 gcc/ChangeLog: * config/i386/i386.cc (ix86_warn_parameter_passing_abi): If no target, check the current TU. gcc/testsuite/ChangeLog: * g++.dg/abi/pr60336-8a.C: New test.
4 daysRemove TARGET_LRA_P override when defining to hook_bool_void_trueRichard Biener2-4/+0
Two targets were converted but retain the default. * config/arc/arc.cc (TARGET_LRA_P): Remove define. * config/gcn/gcn.cc (TARGET_LRA_P): Likewise.
4 daysgimple: Switch bit-test lowering testcases for the more powerful algFilip Kastl2-0/+111
This patch adds 2 testcases. One tests that GCC is able to create bit-test clusters of size 64. The other one contains two switches which GCC wouldn't completely cover with bit-test clusters before the changes from this patch set. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/switch-5.c: New test. * gcc.dg/tree-ssa/switch-6.c: New test. Signed-off-by: Filip Kastl <fkastl@suse.cz>
4 daysgimple: Don't warn about using different algs for big switch lowering [PR117091]Filip Kastl1-7/+0
We currently don't switch to a faster switch lowering algorithm when a switch is too big. This patch removes a warning about this. PR middle-end/117091 gcc/ChangeLog: * tree-switch-conversion.cc (switch_decision_tree::analyze_switch_statement): Remove warning about using different algorithms. Signed-off-by: Filip Kastl <fkastl@suse.cz>
4 daysgimple: Make bit-test switch lowering more powerfulFilip Kastl2-96/+67
A reasonable goal for bit-test lowering is to produce the least amount of clusters for a given switch (a cluster is basically a group of cases that can be handled by constantly many operations). The current algorithm doesn't always give optimal solutions in that sense. This patch should fix this. The important thing is basically just to ask if a cluster is_beneficial() more proactively. The patch also has a fix for a mistake which made bit-test lowering only create BITS_IN_WORD - 1 big clusters. There are also some new comments that go into more detail on the dynamic programming algorithm. gcc/ChangeLog: * tree-switch-conversion.cc (bit_test_cluster::find_bit_tests): Modify the dynamic programming algorithm to take is_beneficial() into account earlier. To do this efficiently, copy some logic from is_beneficial() here. Add detailed comments about how the DP algorithm works. (bit_test_cluster::can_be_handled): Check that the cluster range is >, not >= BITS_IN_WORD. Remove the "vec<cluster *> &, unsigned, unsigned" overloaded variant since we no longer need it. (bit_test_cluster::is_beneficial): Add a comment that this function is closely tied to m_max_case_bit_tests. Remove the "vec<cluster *> &, unsigned, unsigned" overloaded variant since we no longer need it. * tree-switch-conversion.h: Remove the vec overloaded variants of bit_test_cluster::is_beneficial and bit_test_cluster::can_be_handled. Signed-off-by: Filip Kastl <fkastl@suse.cz>
4 daysgimple: Merge slow and fast bit-test switch lowering [PR117091]Filip Kastl1-90/+17
PR117091 showed that bit-test switch lowering can take a lot of time. The algorithm was O(n^2). We therefore came up with a faster algorithm (O(n * BITS_IN_WORD)) and made GCC choose between the slow and the fast algorithm based on how big the switch is. Here I combine the algorithms so that we get the results of the slower algorithm in the faster asymptotic time. PR middle-end/117091 gcc/ChangeLog: * tree-switch-conversion.cc (bit_test_cluster::find_bit_tests_fast): Remove function. (bit_test_cluster::find_bit_tests_slow): Remove function. (bit_test_cluster::find_bit_tests): We don't need to decide between slow and fast so just put the modified (no longer) slow algorithm here. Signed-off-by: Filip Kastl <fkastl@suse.cz>
4 daysc: Fix crash in c-typeck.cc convert_arguments with indirect callsFlorian Weimer2-1/+15
gcc/c/ PR c/120055 * c-typeck.cc (convert_arguments): Check if fundecl is null before checking for builtin function declaration. gcc/testsuite/ * gcc.dg/Wdeprecated-non-prototype-6.c: New test.
4 daysaarch64: Optimize SVE extract last for VLS.Jennifer Schmitz6-55/+77
For the test case int32_t foo (svint32_t x) { svbool_t pg = svpfalse (); return svlastb_s32 (pg, x); } compiled with -O3 -mcpu=grace -msve-vector-bits=128, GCC produced: foo: pfalse p3.b lastb w0, p3, z0.s ret when it could use a Neon lane extract instead: foo: umov w0, v0.s[3] ret Similar optimizations can be made for VLS with other vector widths. We implemented this optimization by guarding the emission of pfalse+lastb in the pattern vec_extract<mode><Vel> by !val.is_constant (). Thus, for last-extract operations with VLS, the patterns *vec_extract<mode><Vel>_v128, *vec_extract<mode><Vel>_dup, or *vec_extract<mode><Vel>_ext are used instead. We added tests for 128-bit VLS and adjusted the tests for the other vector widths. The patch was bootstrapped and tested on aarch64-linux-gnu, no regression. OK for mainline? Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com> gcc/ * config/aarch64/aarch64-sve.md (vec_extract<mode><Vel>): Prevent the emission of pfalse+lastb for VLS. gcc/testsuite/ * gcc.target/aarch64/sve/extract_last_128.c: New test. * gcc.target/aarch64/sve/extract_1.c: Adjust expected outcome. * gcc.target/aarch64/sve/extract_2.c: Likewise. * gcc.target/aarch64/sve/extract_3.c: Likewise. * gcc.target/aarch64/sve/extract_4.c: Likewise.
4 days++: Small build_vec_init improvement [PR117827]Jakub Jelinek1-1/+2
As discussed in the https://gcc.gnu.org/pipermail/gcc-patches/2025-January/674492.html thread, the following patch attempts to improve build_vec_init generated code. E.g. on g++.dg/eh/aggregate1.C test the patch has differences like: D.2988 = &D.2950->e1; D.2989 = D.2988; D.2990 = 1; try { goto <D.2996>; <D.2997>: A::A (D.2989); D.2990 = D.2990 + -1; D.2989 = D.2989 + 1; <D.2996>: if (D.2990 >= 0) goto <D.2997>; else goto <D.2995>; <D.2995>: retval.4 = D.2988; _13 = &D.2950->e2; A::A (_13); - D.2990 = 1; + D.2988 = 0B; D.2951 = D.2951 + -1; } catch { { struct A * D.2991; if (D.2988 != 0B) goto <D.3028>; else goto <D.3029>; <D.3028>: _11 = 1 - D.2990; _12 = (sizetype) _11; D.2991 = D.2988 + _12; <D.3030>: if (D.2991 == D.2988) goto <D.3031>; else goto <D.3032>; <D.3032>: D.2991 = D.2991 + 18446744073709551615; A::~A (D.2991); goto <D.3030>; <D.3031>: goto <D.3033>; <D.3029>: <D.3033>: } } in 3 spots. As you can see, both setting D.2990 (i.e. iterator) to maxindex and setting D.2988 (i.e. rval) to nullptr have the same effect of not actually destructing anything anymore in the cleanup, the advantage of clearing rval is that setting something to zero is often less expensive than potentially huge maxindex and that the cleanup tests that value first. 2025-05-02 Jakub Jelinek <jakub@redhat.com> PR c++/117827 * init.cc (build_vec_init): Push to *cleanup_flags clearing of rval instead of setting of iterator to maxindex.
4 daysvect: Use internal storage for converts for call into ↵Andrew Pinski2-2/+2
supportable_indirect_convert_operation [PR118617] While looking into PR 118616, I noticed that supportable_indirect_convert_operation only pushes up to 2 into its vec. And the 2 places which call supportable_indirect_convert_operation, use an auto_vec but without an internal storage. In this case an internal storage of 2 elements would save both memory and slight compile time performance. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/118617 gcc/ChangeLog: * tree-vect-generic.cc (expand_vector_conversion): Have 2 elements as internal storage for converts. * tree-vect-stmts.cc (vectorizable_conversion): Likewise. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
4 daysget_known_nonzero_bits_1 should use wi::bit_and_not [PR118659]Andrew Pinski1-1/+1
While looking into bitwise optimizations, I noticed that get_known_nonzero_bits_1 does `bm.value () & ~bm.mask ()` which is ok except it creates a temporary wide_int. Instead if we use wi::bit_and_not, we can avoid the temporary and on some targets use the andn/bic instruction. Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: PR tree-optimization/118659 * tree-ssanames.cc (get_known_nonzero_bits_1): Use wi::bit_and_not instead of `a & ~b`. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
4 daysexpand: Remove unsignedp argument from get_compare_parts [PR118090]Andrew Pinski1-9/+6
While helping Eikansh with a patch to ccmp, it was noticed that the result stored in the up pointer that gets passed to get_compare_parts was unused on all call sites. It was always unused since get_compare_parts was added in r8-1717-gf580a969d7fbab. It looks it was not noticed it became unused when rcode was set via get_compare_parts and in RTL, the signedness is part of the comparison. PR middle-end/118090 gcc/ChangeLog: * ccmp.cc (get_compare_parts): Remove the up argument. (expand_ccmp_next): Update call to get_compare_parts. (expand_ccmp_expr_1): Likewise. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
4 daysRegenerate opt-urlsRichard Biener1-0/+3
* common.opt.urls: Regenerate.
5 daysDaily bump.GCC Administrator6-1/+123
5 daysFix BZ 119317: named loops (C2y) with debug infoChristopher Bazley2-1/+7
Named loops (C2y) could not previously be compiled with -O1 and -ggdb2 or higher because the label preceding a loop (or switch) could not be found when using such command lines. This could be observed by compiling gcc/gcc/testsuite/gcc.dg/c2y-named-loops-1.c with the provoking command line (or any minimal example such as that cited in the bug report). The fix was simply to ignore the tree nodes inserted for debugging information. Base commit is 79aa2a283a8d3327ff4d6dca77e81d5b1ac3a01e PR c/119317 gcc/c/ChangeLog: * c-decl.cc (c_get_loop_names): Do not prematurely end the search for a label that names a loop or switch statement upon encountering a DEBUG_BEGIN_STMT. Instead, ignore any instances of DEBUG_BEGIN_STMT. gcc/testsuite/ChangeLog: * gcc.dg/c2y-named-loops-8.c: New test.
5 daysc++: add missing -fabi-version docsJason Merrill2-3/+8
Looks like I've forgotten to update the docs for -fabi-version for a couple of my changes. gcc/ChangeLog: * doc/invoke.texi: Add -fabi-version detail. * common.opt: Likewise.
5 daysc: Suppress -Wdeprecated-non-prototype warnings for builtinsFlorian Weimer2-1/+16
Builtins defined with BT_FN_INT_VAR etc. show as functions without a prototype and trigger the warning. gcc/c/ PR c/119950 * c-typeck.cc (convert_arguments): Check for built-in function declaration before warning. gcc/testsuite/ * gcc.dg/Wdeprecated-non-prototype-5.c: New test.
5 daysc++: poor diag w/ non-constexpr dtor called from constexpr ctorPatrick Palka2-8/+22
When diagnosing a non-constexpr constructor call during constexpr evaluation, explain_invalid_constexpr_fn was passing the genericized body to require_potential_constant_expression rather than the saved non-genericized one. This meant for the below testcase (reduced from PR libstdc++/119282) in which B::B() is deemed non-constexpr due to the local variable having a non-constexpr destructor we would then issue the cryptic diagnostic: constexpr-nonlit19.C:17:16: error: non-constant condition for static assertion 17 | static_assert(f()); | ~^~ constexpr-nonlit19.C:17:16: in ‘constexpr’ expansion of ‘f()’ constexpr-nonlit19.C:13:5: error: ‘constexpr B::B()’ called in a constant expression 13 | B b; | ^ constexpr-nonlit19.C:6:13: note: ‘constexpr B::B()’ is not usable as a ‘constexpr’ function because: 6 | constexpr B() { | ^ constexpr-nonlit19.C:8:5: error: ‘goto’ is not a constant expression 8 | for (int i = 0; i < 10; i++) { } | ^~~ This patch makes us pass the non-genericized body to require_potential_constant_expression, and so we now emit: ... constexpr-nonlit19.C:6:13: note: ‘constexpr B::B()’ is not usable as a ‘constexpr’ function because: 6 | constexpr B() { | ^ constexpr-nonlit19.C:9:3: error: call to non-‘constexpr’ function ‘A::~A()’ 9 | } | ^ constexpr-nonlit19.C:3:12: note: ‘A::~A()’ declared here 3 | struct A { ~A() { } }; | ^ gcc/cp/ChangeLog: * constexpr.cc (explain_invalid_constexpr_fn): In the DECL_CONSTRUCTOR_P branch pass the non-genericized body to require_potential_constant_expression. gcc/testsuite/ChangeLog: * g++.dg/cpp23/constexpr-nonlit19.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
5 daysphiopt: Remove special case for a sequence after match and simplify for ↵Andrew Pinski1-14/+2
early phiopt r16-189-g99aa410f5e0a72 fixed the case where match-and-simplify there was an extra assignment happening inside the sequence return. phiopt_early_allow had code to workaround that issue but now can be removed and simplify down to only allowing the sequence having only one MIN/MAX if the outer code is MIN/MAX also. Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: * tree-ssa-phiopt.cc (phiopt_early_allow): Only allow a sequence with one statement for MIN/MAX and the op was MIN/MAX. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
5 daysc++: more overeager use of deleted function before ADL [PR119034]Patrick Palka3-7/+25
The PR68942 fix used the tf_conv flag to disable mark_used when substituting a FUNCTION_DECL callee of an ADL-enabled call. In this slightly more elaborate testcase, we end up prematurely calling mark_used anyway on the FUNCTION_DECL directly from the CALL_EXPR case of tsubst_expr during partial instantiation, leading to a bogus "use of deleted function" error. This patch fixes the general problem in a more robust way by ensuring the callee of an ADL-enabled call is wrapped in an OVERLOAD, so that tsubst_expr leaves it alone. PR c++/119034 PR c++/68942 gcc/cp/ChangeLog: * pt.cc (tsubst_expr) <case CALL_EXPR>: Revert PR68942 fix. * semantics.cc (finish_call_expr): Ensure the callee of an ADL-enabled call is wrapped in an OVERLOAD. gcc/testsuite/ChangeLog: * g++.dg/template/koenig13.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
5 daysFortran: Source allocation of pure function result rejected [PR119948]Paul Thomas2-0/+60
2025-05-01 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/119948 * resolve.cc (gfc_impure_variable): The result of a module procedure with an interface declaration is not impure even if the current namespace is not the same as the symbol's. gcc/testsuite/ PR fortran/119948 * gfortran.dg/pr119948.f90: New test.
5 daysAarch64: Add __sqrt and __sqrtf intrinsics and corresponding testsAyan Shafqat2-0/+33
This patch introduces two new inline functions, __sqrt and __sqrtf, in arm_acle.h for Aarch64 targets. These functions wrap the new builtins __builtin_aarch64_sqrtdf and __builtin_aarch64_sqrtsf, respectively, providing direct access to hardware instructions without relying on the standard math library or optimization levels. This patch also introduces acle_sqrt.c in the AArch64 testsuite, verifying that the new __sqrt and __sqrtf intrinsics emit the expected fsqrt instructions for double and float arguments. Coverage for new intrinsics ensures that __sqrt and __sqrtf are correctly expanded to hardware instructions and do not fall back to library calls, regardless of optimization levels. gcc/ChangeLog: * config/aarch64/arm_acle.h (__sqrt, __sqrtf): New function. gcc/testsuite/ChangeLog: * gcc.target/aarch64/acle/acle_sqrt.c: New test. Signed-off-by: Ayan Shafqat <ayan.x.shafqat@gmail.com>
5 daysAarch64: Use BUILTIN_VHSDF_HSDF for vector and scalar sqrt builtinsAyan Shafqat1-4/+1
This patch changes the `sqrt` builtin definition from `BUILTIN_VHSDF_DF` to `BUILTIN_VHSDF_HSDF` in `aarch64-simd-builtins.def`, ensuring the builtin covers half, single, and double precision variants. The redundant `VAR1 (UNOP, sqrt, 2, FP, hf)` lines are removed, as they are no longer needed now that `BUILTIN_VHSDF_HSDF` handles those cases. gcc/ChangeLog: * config/aarch64/aarch64-simd-builtins.def: Change BUILTIN_VHSDF_DF to BUILTIN_VHSDF_HSDF. Signed-off-by: Ayan Shafqat <ayan.x.shafqat@gmail.com> Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
5 daysc++: avoid weird #line paths in std-name-hint.hJason Merrill2-489/+489
etags was getting confused by the #line pathnames in std-name-hint.h that don't match my directory layout; let's avoid encoding information about a particular developer's $(srcdir) in the generated file. gcc/cp/ChangeLog: * Make-lang.in: Don't pass the full path to gperf. * std-name-hint.h: Regenerate.
5 daysc++: remove TREE_STATIC from constexpr heap vars [PR119162]Jason Merrill2-38/+16
While working on PR119162 it occurred to me that it would be simpler to detect the problem of a value referring to a heap allocation if we stopped setting TREE_STATIC on them so they naturally are not considered to have a constant address. With that change we no longer need to specifically avoid caching a value that refers to a deleted pointer. But with this change maybe_nonzero_address is not sure whether the variable could have address zero. I don't understand why it returns 1 only for variables in the current function, rather than all non-symtab decls; an auto variable from some other function also won't have address zero. Maybe this made more sense when it was in tree_single_nonzero_warnv_p before r7-5868? But assuming there is some reason for the current behavior, this patch only changes the handling of non-symtab decls when folding_cxx_constexpr. PR c++/119162 gcc/cp/ChangeLog: * constexpr.cc (find_deleted_heap_var): Remove. (cxx_eval_call_expression): Don't call it. Don't set TREE_STATIC on heap vars. (cxx_eval_outermost_constant_expr): Don't mess with varpool. gcc/ChangeLog: * fold-const.cc (maybe_nonzero_address): Return 1 for non-symtab vars if folding_cxx_constexpr.
5 daysFix gcc.dg/tree-ssa/ssa-dom-thread-7.c for aarch64Richard Biener1-1/+1
So on another machine with a cross I see 17 jumps threaded, so adjusted like that. PR tree-optimization/120003 * gcc.dg/tree-ssa/ssa-dom-thread-7.c: Adjust aarch64 expected thread2 number of threads.
5 daysRemove non-SLP path from vectorizable_conversionRichard Biener1-69/+19
This removes the non-SLP paths from vectorizable_conversion and in the process eliminates uses of 'ncopies' and 'STMT_VINFO_VECTYPE' from the function. * tree-vect-stmts.cc (vectorizable_conversion): Remove non-SLP paths.
5 daysFixup vect_remove_slp_scalar_callsRichard Biener1-3/+3
There's a logic error for vect_remove_slp_scalar_calls where it simply ignores pattern stmts but it should instead look at the original stmt. * tree-vect-slp.cc (vect_remove_slp_scalar_calls): Look at the original stmt.
5 dayscombine: Special case set_noop_p in two spotsJakub Jelinek1-20/+20
Here is the incremental patch I was talking about. For noop sets, we don't need to test much, they can go to i2 unless that would violate i3 JUMP condition. With this the try_combine on the pr119291.c testcase doesn't fail, but succeeds and we get (insn 22 21 23 4 (set (pc) (pc)) "pr119291.c":27:15 2147483647 {NOOP_MOVE} (nil)) (insn 23 22 24 4 (set (reg/v:SI 117 [ e ]) (reg/v:SI 116 [ e ])) 96 {*movsi_internal} (expr_list:REG_DEAD (reg/v:SI 116 [ e ]) (nil))) (note 24 23 25 4 NOTE_INSN_DELETED) (insn 25 24 26 4 (set (reg/v:SI 116 [ e ]) (const_int 0 [0])) "pr119291.c":28:13 96 {*movsi_internal} (nil)) (note 26 25 27 4 NOTE_INSN_DELETED) (insn 27 26 28 4 (set (reg:DI 128 [ _9 ]) (const_int 0 [0])) "pr119291.c":28:13 95 {*movdi_internal} (nil)) after it. 2025-05-01 Jakub Jelinek <jakub@redhat.com> * combine.cc (try_combine): Sets which satisfy set_noop_p can go to i2 unless i3 is a jump and the other set is not.
6 daysDaily bump.GCC Administrator7-1/+410
6 daysc++/modules: Ensure deduction guides for imported types are reachable [PR120023]Nathaniel Shead4-0/+38
In the linked PR, because the deduction guides depend on an imported type, we never walk the type and so never call add_deduction_guides. This patch ensures that we make bindings for deduction guides if we saw any deduction guide at all. PR c++/120023 gcc/cp/ChangeLog: * module.cc (depset::hash::find_dependencies): Also call add_deduction_guides when walking one. gcc/testsuite/ChangeLog: * g++.dg/modules/dguide-7_a.C: New test. * g++.dg/modules/dguide-7_b.C: New test. * g++.dg/modules/dguide-7_c.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
6 daysc++/modules: Fix imported CNTTPs being considered non-constant [PR119938]Nathaniel Shead3-1/+30
When importing a CNTTP object, since r15-3031-g0b7904e274fbd6 we shortcut the processing of the generated NTTP so that we don't attempt to recursively load pendings. However, due to an oversight we do not properly set TREE_CONSTANT or DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P on the decl, which confuses later processing. This patch ensures that this happens correctly. PR c++/119938 gcc/cp/ChangeLog: * pt.cc (get_template_parm_object): When !check_init, add assert that expr really is constant and mark decl as such. gcc/testsuite/ChangeLog: * g++.dg/modules/tpl-nttp-2_a.H: New test. * g++.dg/modules/tpl-nttp-2_b.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
6 daysc++/modules: Catch exposures of TU-local values through inline references ↵Nathaniel Shead2-7/+53
[PR119996] In r15-9136-g0210bedf481a9f we started erroring for inline variables that exposed TU-local entities in their definition, as such variables would need to have their definitions emitted in importers but would not know about the TU-local entities they referenced. A case we mised was potentially-constant references, which disable streaming of their definitions in make_dependency so as to comply with [expr.const] p9.2. This meant that we didn't see the definition referencing a TU-local entity, leading to nonsensical results. PR c++/119551 PR c++/119996 gcc/cp/ChangeLog: * module.cc (depset::hash::make_dependency): Also mark inline variables referencing TU-local values as exposures here. (depset::hash::finalize_dependencies): Add error message for inline variables. gcc/testsuite/ChangeLog: * g++.dg/modules/internal-13.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
6 daysvectorizer: Fix riscv build [PR120042]Andrew Pinski1-0/+1
r15-9859-ga6cfde60d8c added a call to dominated_by_p to tree-vectorizer.h but dominance.h is not always included; and you get a build failure on riscv building riscv-vector-costs.cc. Let's add the include of dominance.h to tree-vectorizer.h Pushed as obvious after builds for riscv and x86_64. gcc/ChangeLog: PR target/120042 * tree-vectorizer.h: Include dominance.h. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
6 daysprime-paths.cc: remove redundant semicolonsDavid Malcolm1-2/+2
Fixes a couple of pedantic warnings. gcc/ChangeLog: * prime-paths.cc (limit_checked_add): Remove redundant trailing ';'. (enters_through_p): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
6 dayssarif output: introduce sarif_serialization_formatDavid Malcolm7-36/+173
The SARIF 2.1.0 spec says that although a "SARIF log file SHALL contain a serialization of the SARIF object model into the JSON format ... in the future, other serializations might be defined." (§3.1) I've been experimenting with alternative serializations of SARIF (CBOR and JSON5 for now). To help with these experiments, this patch adds a new param "serialization" to -fdiagnostics-add-output='s "sarif" scheme. For now this must have value "json", but will be helpful for any followup patches. gcc/ChangeLog: * diagnostic-format-sarif.cc (sarif_serialization_format_json::write_to_file): New. (sarif_builder::m_formatted): Replace field with... (sarif_builder::m_serialization_format): ...this. (sarif_builder::sarif_builder): Update for field change. (sarif_builder::flush_to_file): Call m_serialization_format's write_to_file vfunc. (sarif_output_format::sarif_output_format): Replace param "formatted" with "serialization_format". (sarif_stream_output_format::sarif_output_format): Likewise. (sarif_file_output_format::sarif_file_output_format): Likewise. (diagnostic_output_format_init_sarif_stderr): Make a sarif_serialization_format_json and pass it to diagnostic_output_format_init_sarif. (diagnostic_output_format_open_sarif_file): Split out into... (diagnostic_output_file::try_to_open): ...this, adding "serialization_kind" param. (diagnostic_output_format_init_sarif_file): Update for new param to diagnostic_output_format_open_sarif_file. Make a sarif_serialization_format_json and pass it to diagnostic_output_format_init_sarif. (diagnostic_output_format_init_sarif_stream): Make a sarif_serialization_format_json and pass it to diagnostic_output_format_init_sarif. (make_sarif_sink): Replace param "formatted" with "serialization". (selftest::test_make_location_object): Update for changes to sarif_builder ctor. * diagnostic-format-sarif.h (enum class sarif_serialization): New. (diagnostic_output_format_open_sarif_file): Add param "serialization_kind". (class sarif_serialization_format): New. (class sarif_serialization_format_json): New. (make_sarif_sink): Replace param "formatted" with "serialization_format". * diagnostic-output-file.h (diagnostic_output_file::try_to_open): New decl. * diagnostic.h (enum diagnostics_output_format): Tweak comments. * doc/invoke.texi (-fdiagnostics-add-output): Add "serialization" param to sarif scheme. * libgdiagnostics.cc (sarif_sink::sarif_sink): Update for change to make_sarif_sink. * opts-diagnostic.cc (sarif_scheme_handler::make_sink): Add "serialization" param and pass it on to make_sarif_sink. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
6 daysanalyzer: add more test coverage for sprintfDavid Malcolm1-0/+44
gcc/testsuite/ChangeLog: PR analyzer/107017 * c-c++-common/analyzer/sprintf-3.c: New test, covering use of sprintf with specific format strings. Doesn't yet find problems as the analyzer doesn't yet understand the format strings. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
6 daysanalyzer: avoid saying "'0' is NULL"David Malcolm8-10/+15
gcc/analyzer/ChangeLog: * sm-malloc.cc (malloc_diagnostic::describe_state_change): Tweak the "EXPR is NULL" message for the case where EXPR is a null pointer. gcc/testsuite/ChangeLog: * c-c++-common/analyzer/data-model-path-1.c: Check for "using NULL here" message. * c-c++-common/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early.c: Likewise. Check for "return of NULL" message. * c-c++-common/analyzer/null-deref-pr108400-SoftEtherVPN-WebUi.c: Likewise. * gcc.dg/analyzer/data-model-5.c: Likewise. * gcc.dg/analyzer/data-model-5b.c: Likewise. * gcc.dg/analyzer/data-model-5c.c: Likewise. * gcc.dg/analyzer/torture/pr93647.c: Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
6 daysUpdate gcc .po filesJoseph Myers20-92971/+96411
* be.po, da.po, de.po, el.po, es.po, fi.po, fr.po, hr.po, id.po, ja.po, ka.po, nl.po, ru.po, sr.po, sv.po, tr.po, uk.po, vi.po, zh_CN.po, zh_TW.po: Update.
6 daystestsuite: Force -mcmodel=small for gcc.target/aarch64/pr115258.cRichard Sandiford1-1/+1
The test implicitly assumed the default code model and so failed for -mcmodel=tiny. gcc/testsuite/ * gcc.target/aarch64/pr115258.c: Add -mcmodel=small.
6 daysc++: UNBOUND_CLASS_TEMPLATE context substitution [PR119981]Patrick Palka2-7/+30
In r15-123 and r14-11434 we unconditionally set processing_template_decl when substituting the context of an UNBOUND_CLASS_TEMPLATE, in order to handle instantiation of the dependently scoped friend declaration template<int N> template<class T> friend class A<N>::B; where the scope A<N> remains dependent after instantiation. But this turns out to misbehave for the UNBOUND_CLASS_TEMPLATE in the below testcase representing g<[]{}>::template fn since with the flag set substituting the args of test3 into the lambda causes us to defer the substitution and yield a lambda that still looks dependent, which in turn makes g<[]{}> still dependent and not suitable for qualified name lookup. This patch restricts setting processing_template_decl during UNBOUND_CLASS_TEMPLATE substitution to the case where there are multiple levels of introduced template parameters, as in the friend declaration. (This means we need to substitute the template parameter list(s) first, which makes sense since they lexically appear first.) PR c++/119981 PR c++/119378 gcc/cp/ChangeLog: * pt.cc (tsubst) <case UNBOUND_CLASS_TEMPLATE>: Substitute into template parameter list first. When substituting the context, only set processing_template_decl if there's more than one level of introduced template parameters. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/lambda-targ15.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
6 daystree-optimization/119960 - add validity checking to SLP schedulingRichard Biener1-8/+28
The following adds checks that when we search for a vector stmt insert location we arrive at one where all required operand defs are dominating the insert location. At the moment any such failure only blows up during SSA verification. There's the long-standing issue that we do not verify there exists a valid schedule of the SLP graph from BB vectorization into the existing CFG. We do not have the ability to insert vector stmts on the dominance frontier "end", nor to insert LC PHIs that would be eventually required. This should be done all differently, computing the schedule during analysis and failing if we can't schedule. PR tree-optimization/119960 * tree-vect-slp.cc (vect_schedule_slp_node): Sanity check dominance check on operand defs.
6 daysRevert "tree-optimization/119960 - failed external SLP promotion"Richard Biener2-71/+7
This reverts commit 51ba233fe2db562390a6e0a3618420889761bc77.
6 daystree-optimization/119960 - fix and guard get_later_stmtRichard Biener1-3/+17
The following makes get_later_stmt handle stmts from different basic-blocks in the case they are orderd and otherwise asserts. * tree-vectorizer.h (get_later_stmt): Robustify against stmts in different BBs, assert when they are unordered.