aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-10-03AVR: Make gcc.dg/c23-stdarg-9.c work.Georg-Johann Lay1-0/+5
gcc/testsuite/ * gcc.dg/c23-stdarg-9.c (struct S) [AVR]: Only use int a[500].
2024-10-03Restore aarch64 bootstrapRichard Biener1-1/+1
This zero-initializes vec_init to avoid a bogus maybe-uninitialized diagnostic. * tree-vect-loop.cc (vectorizable_induction): Initialize vec_init.
2024-10-03aarch64: Fix early ra for -fno-delete-dead-exceptions [PR116927]Andrew Pinski2-0/+21
Early-RA was considering throwing instructions as being dead and removing them even if -fno-delete-dead-exceptions was in use. This fixes that oversight. Built and tested for aarch64-linux-gnu. PR target/116927 gcc/ChangeLog: * config/aarch64/aarch64-early-ra.cc (early_ra::is_dead_insn): Insns that throw are not dead with -fno-delete-dead-exceptions. gcc/testsuite/ChangeLog: * g++.dg/torture/pr116927-1.C: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-02diagnostics: support SARIF 2.2 output, undocumented for now [PR116301]David Malcolm14-92/+3459
GCC currently supports outputting SARIF v2.1.0 Version 2.2 of the SARIF spec is not yet official, but the draft has already gained features we might might want to use. This patch extends the SARIF output code to accept a enum sarif_version parameter internally, representing 2.1.0 or a prerelease of 2.2 The patch updates the SARIF output selftests so that they are run for all such versions. I hope to expose this "properly" via the mechanism described in comment #13 of PR116613. In the meantime, the patch adds a new -fdiagnostics-format=sarif-file-2.2-prerelease for use by the DejaGnu testsuite, deliberately left undocumented for now. The copy of the 2.2 draft schema in the testsuite was downloaded from https://raw.githubusercontent.com/oasis-tcs/sarif-spec/refs/tags/2.2-prerelease-2024-08-08/sarif-2.2/schema/sarif-2-2.schema.json The patch adds support for capturing related locations within an ICE notification for SARIF 2.2 onwards, thus capturing "include chain" information for SARIF-based reports of ICEs that occur within a header; see https://github.com/oasis-tcs/sarif-spec/issues/540 The patch does *not* add support for the "scannedFile" role, leaving it to followup work; see https://github.com/oasis-tcs/sarif-spec/issues/459 gcc/ChangeLog: PR other/116301 * common.opt (sarif-file-2.2-prerelease): New value for -fdiagnostics-format=. * diagnostic-format-sarif.cc (sarif_location_manager::sarif_location_manager): Move initialization of m_related_locations_arr here from sarif_result's ctor. (sarif_location_manager::add_related_location): Implement for base class, taking sarif_result's implementation. Add "builder" param. (sarif_location_manager::m_related_locations_arr): Move here from class sarif_result. (class sarif_result): Move m_related_locations_arr field and add_related_location vfunc to class sarif_location_manager. (sarif_builder::get_version): New accessor. (sarif_builder::m_version): New field. (sarif_invocation::add_notification_for_ice): Call process_worklist on the notification for SARIF 2.2 and later. (sarif_location_manager::process_worklist_item): Pass builder to calls to add_related_location. (sarif_result::on_nested_diagnostic): Likewise. (sarif_result::on_diagram): Likewise. (sarif_ice_notification::add_related_location): Add builder param. For SARIF 2.2 and later chain up to base class impl so that notifications get related locations. (sarif_builder::sarif_builder): Add "version" param. (SARIF_SCHEMA): Delete in favor of... (sarif_version_to_url): New function. (SARIF_VERSION): Delete in favor of... (sarif_version_to_property): New function. (make_top_level_object): Update to use m_version for "$schema" and "version". (sarif_output_format::sarif_output_format): Add "version" param. (sarif_stream_output_format::sarif_stream_output_format): Likewise. (sarif_file_output_format::sarif_file_output_format): Likewise. (diagnostic_output_format_init_sarif_stderr): Likewise. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. (selftest::test_sarif_diagnostic_context): Likewise. (selftest::test_make_location_object): Likewise. (selftest::test_simple_log): Likewise. Update schema and version tests accordingly. (selftest::test_simple_log_2): Add "version" param. (selftest::test_message_with_embedded_link): Likewise. (selftest::run_tests_per_version): New, based on the for_each_line_table_case calls in... (selftest::diagnostic_format_sarif_cc_tests): Add loop over sarif versions. Replace for_each_line_table_case calls with one call to run_tests_per_version. * diagnostic-format-sarif.h: Include "diagnostic-format.h". (enum class sarif_version): New. (diagnostic_output_format_init_sarif_stderr): Move to here from diagnostic-format.h. Add "version" param. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. * diagnostic-format.h: Include "diagnostic.h". (diagnostic_output_format_init_sarif_stderr): Move from here to diagnostic-format-sarif.h. * diagnostic.cc: Define INCLUDE_MEMORY. Include "diagnostic-format-sarif.h". (diagnostic_output_format_init): Pass sarif_version::v2_1_0 to existing SARIF options. Add case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE_2_2_PRERELEASE. * diagnostic.h (enum diagnostics_output_format): Add DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE_2_2_PRERELEASE. gcc/testsuite/ChangeLog: PR other/116301 * gcc.dg/plugin/crash-test-ice-in-header-sarif-2.1.c: New test. * gcc.dg/plugin/crash-test-ice-in-header-sarif-2.2.c: New test. * gcc.dg/plugin/crash-test-ice-in-header-sarif-2_1.py: Support script for new test. * gcc.dg/plugin/crash-test-ice-in-header-sarif-2_2.py: Likewise. * gcc.dg/plugin/crash-test-ice-in-header.h: New header. * gcc.dg/plugin/plugin.exp: Add the new tests. * lib/sarif-schema-2.2-prerelease-2024-08-08.json: New schema file. * lib/scansarif.exp (verify-sarif-file): Add optional argument for specifying which version of the schema to validate against, supporting "2.1" and "2.2", defaulting to the former. Update the test name to capture the version of the schema tested against. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-10-03Daily bump.GCC Administrator5-1/+244
2024-10-02phiopt: Fix VCE moving by rewriting it into cast [PR116098]Andrew Pinski3-1/+106
Phiopt match_and_simplify might move a well defined VCE assign statement from being conditional to being uncondtitional; that VCE might no longer being defined. It will need a rewrite into a cast instead. This adds the rewriting code to move_stmt for the VCE case. This is enough to fix the issue at hand. It should also be using rewrite_to_defined_overflow but first I need to move the check to see a rewrite is needed into its own function and that is causing issues (see https://gcc.gnu.org/pipermail/gcc-patches/2024-September/663938.html). Plus this version is easiest to backport. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/116098 gcc/ChangeLog: * tree-ssa-phiopt.cc (move_stmt): Rewrite VCEs from integer to integer types to case. gcc/testsuite/ChangeLog: * c-c++-common/torture/pr116098-2.c: New test. * g++.dg/torture/pr116098-1.C: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-02testsuite/52641 - Make gcc.dg/strict-flex-array-3.c work on int != 32 bits.Georg-Johann Lay1-2/+17
PR testsuite/52641 gcc/testsuite/ * gcc.dg/strict-flex-array-3.c (expect) [AVR]: Use custom version due to AVR-LibC limitations. (stuff): Use __SIZEOF_INT__ instead of hard-coded values.
2024-10-02AVR: Make gcc.dg/pr113596.c work.Georg-Johann Lay1-1/+9
gcc/testsuite/ * gcc.dg/pr113596.c: Require less memory so it works on AVR.
2024-10-02testsuite/52641 - Require int32 for gcc.dg/pr93820-2.c.Georg-Johann Lay1-0/+1
PR testsuite/52641 gcc/testsuite/ * gcc.dg/pr93820-2.c: Add dg-require-effective-target int32.
2024-10-02testsuite/52641 - Fix gcc.dg/signbit-6.c for int != 32-bit targets.Georg-Johann Lay1-2/+4
PR testsuite/52641 gcc/testsuite/ * gcc.dg/signbit-6.c (main): Initialize a[0] and b[0] with INT32_MIN (instead of with INT_MIN).
2024-10-02middle-end: Fix ifcvt predicate generation for masked function callsVictor Do Nascimento2-1/+44
Up until now, due to a latent bug in the code for the ifcvt pass, irrespective of the branch taken in a conditional statement, the original condition for the if statement was used in masking the function call. Thus, for code such as: if (a[i] > limit) b[i] = fixed_const; else b[i] = fn (a[i]); we would generate the following (wrong) if-converted tree code: _1 = a[i_1]; _2 = _1 > limit; _3 = .MASK_CALL (fn, _1, _2); cstore_4 = _2 ? fixed_const : _3; as opposed to the correct expected sequence: _1 = a[i_1]; _2 = _1 > limit; _3 = ~_2; _4 = .MASK_CALL (fn, _1, _3); cstore_5 = _2 ? fixed_const : _4; This patch ensures that the correct predicate mask generation is carried out such that, upon autovectorization, the correct vector lanes are selected in the vectorized function call. gcc/ChangeLog: * tree-if-conv.cc (predicate_statements): Fix handling of predicated function calls. gcc/testsuite/ChangeLog: * gcc.dg/vect/vect-fncall-mask.c: New.
2024-10-02arm: Prevent ICE when doloop dec_set is not PLUS exprAndre Vieira2-17/+59
This patch refactors and fixes an issue where arm_mve_dlstp_check_dec_counter was making an assumption about the form of what a candidate for a dec_insn should be, which caused an ICE. This dec_insn is the instruction that decreases the loop counter inside a decrementing loop and we expect it to have the following form: (set (reg CONDCOUNT) (plus (reg CONDCOUNT) (const_int))) Where CONDCOUNT is the loop counter, and const int is the negative constant used to decrement it. This patch also improves our search for a valid dec_insn. Before this patch we'd only look for a dec_insn inside the loop header if the loop latch was empty. We now also search the loop header if the loop latch is not empty but the last instruction is not a valid dec_insn. This could potentially be improved to search all instructions inside the loop latch. gcc/ChangeLog: * config/arm/arm.cc (check_dec_insn): New helper function containing code hoisted from... (arm_mve_dlstp_check_dec_counter): ... here. Use check_dec_insn to check the validity of the candidate dec_insn. gcc/testsuite/ChangeLog: * gcc.target/arm/mve/dlstp-loop-form.c: New test.
2024-10-02c++: Fix regression introduced by r15-3796 [PR116722]Simon Martin1-0/+6
Jason pointed out that the fix I made for PR116722 via r15-3796 introduces a regression when running constexpr-dynamic10.C with -fimplicit-constexpr. The problem is that my change makes us leave cxx_eval_call_expression early, and bypass the call to cxx_eval_thunk_call (through a recursive call to cxx_eval_call_expression) that used to emit an error for that testcase with -fimplicit-constexpr. This patch emits the error if !ctx->quiet before bailing out because the {con,de}structor belongs to a class with virtual bases. PR c++/116722 gcc/cp/ChangeLog: * constexpr.cc (cxx_bind_parameters_in_call): When !ctx->quiet, emit error before bailing out due to a call to {con,de}structor for a class with virtual bases.
2024-10-02Replace another missed iterative_hash_objectRichard Biener1-1/+1
I missed one that's actually hit quite a lot, hashing of the canonical type TYPE_HASH. gcc/cp/ * pt.cc (iterative_hash_template_arg): Use iterative_hash_hashval_t to hash TYPE_HASH.
2024-10-02gimple ssa: Don't use __builtin_popcount in switch exp transform [PR116616]Filip Kastl3-74/+23
Switch exponential transformation in the switch conversion pass currently generates tmp1 = __builtin_popcount (var); tmp2 = tmp1 == 1; when inserting code to determine if var is power of two. If the target doesn't support expanding the builtin as special instructions switch conversion relies on this whole pattern being expanded as bitmagic. However, it is possible that other GIMPLE optimizations move the two statements of the pattern apart. In that case the builtin becomes a libgcc call in the final binary. The call is slow and in case of freestanding programs can result in linking error (this bug was originally found while compiling Linux kernel). This patch modifies switch conversion to insert the bitmagic (var ^ (var - 1)) > (var - 1) instead of the builtin. gcc/ChangeLog: PR tree-optimization/116616 * tree-switch-conversion.cc (can_pow2p): Remove this function. (gen_pow2p): Generate bitmagic instead of a builtin. Remove the TYPE parameter. (switch_conversion::is_exp_index_transform_viable): Don't call can_pow2p. (switch_conversion::exp_index_transform): Call gen_pow2p without the TYPE parameter. * tree-switch-conversion.h: Remove m_exp_index_transform_pow2p_type. gcc/testsuite/ChangeLog: PR tree-optimization/116616 * gcc.target/i386/switch-exp-transform-1.c: Don't test for presence of the POPCOUNT internal fn call. Signed-off-by: Filip Kastl <fkastl@suse.cz>
2024-10-02Speedup iterative_hash_template_argRichard Biener1-3/+3
Using iterative_hash_object is expensive compared to using iterative_hash_hashval_t which is fit for integer sized values. The following reduces the number of perf cycles spent in iterative_hash_template_arg and iterative_hash combined by 20%. gcc/cp/ * pt.cc (iterative_hash_template_arg): Avoid using iterative_hash_object.
2024-10-02Adjust gcc.dg/vect/slp-12a.cRichard Biener1-2/+1
We can now SLP the loop. There's PR116583 tracking that this still fails for VLA vectors when load-lanes doesn't support a group of size 8. We can't express this right now so the testcase keeps FAILing for aarch64 with SVE (but passes now for riscv). * gcc.dg/vect/slp-12a.c: Adjust.
2024-10-02Adjust expectation for gcc.dg/vect/slp-19c.cRichard Biener1-2/+6
We can now vectorize the first loop with SLP when using V2SImode vectors since then we can handle the non-power-of-two interleaving. We can also SLP the second loop reliably now after adding induction support for VLA vectors. * gcc.dg/vect/slp-19c.c: Adjust expectation.
2024-10-02un-XFAIL gcc.dg/vect/vect-double-reduc-5.cRichard Biener1-4/+1
The testcase now passes, we can handle double reductions with multiple types fine. * gcc.dg/vect/vect-double-reduc-5.c: Un-XFAIL everywhere.
2024-10-02testsuite/116596 - fix gcc.dg/vect/slp-11a.cRichard Biener1-1/+1
The condition on "vectorizing stmts using SLP" needs to match that of "vectorized 1 loops", obviously. PR testsuite/116596 * gcc.dg/vect/slp-11a.c: Fix.
2024-10-02tree-optimization/113197 - bougs assert in PTARichard Biener3-1/+18
PTA asserts that EAF_NO_DIRECT_READ is not set when flags are set consistently which doesn't make sense. The following removes the assert. PR tree-optimization/113197 * tree-ssa-structalias.cc (handle_call_arg): Remove bougs assert. * gcc.dg/lto/pr113197_0.c: New testcase. * gcc.dg/lto/pr113197_1.c: Likewise.
2024-10-02tree-optimiztation/114855 - profile prediction slownessRichard Biener1-26/+91
The testcase in PR114855 shows profile prediction to evaluate the same SSA def via expr_expected_value for each condition or switch in a function. The following patch caches the expected value (and probability/predictor) for each visited SSA def, also protecting against recursion and thus obsoleting the visited bitmap. This reduces the time spent in branch prediction from 1.2s to 0.3s, though callgrind which was how I noticed this seems to be comparatively very much happier about the change than this number suggests. PR tree-optimization/114855 * predict.cc (ssa_expected_value): New global. (expr_expected_value): Do not take bitmap. (expr_expected_value_1): Likewise. Use ssa_expected_value to cache results for a SSA def. (tree_predict_by_opcode): Adjust. (tree_estimate_probability): Manage ssa_expected_value. (tree_guess_outgoing_edge_probabilities): Likewise.
2024-10-02testsuite/116660 - adjust testcases unexpectedly failing on 32bit sparcRichard Biener2-1/+3
Both testcases miss some effective target requires. PR testsuite/116660 * gcc.dg/vect/no-scevccp-outer-12.c: Add vect_pack_trunc. * gcc.dg/vect/vect-multitypes-6.c: Add vect_char_add, remove explicit 32bit sparc XFAIL.
2024-10-02tree-optimization/116566 - single lane SLP for VLA inductionsRichard Biener2-59/+190
The following adds SLP support for vectorizing single-lane inductions with variable length vectors. PR tree-optimization/116566 * tree-vect-loop.cc (vectorizable_induction): Handle single-lane SLP for VLA vectors. * gcc.dg/tree-ssa/reassoc-46.c: When using partial vectors the dump-scan doesn't look for the required .COND_ADD so skip for partial vectors.
2024-10-02doc: Drop h8300-hms reference to binaries downloadsGerald Pfeifer1-2/+0
gcc: PR target/69374 * doc/install.texi (Specific) <h8300-hms>: Drop obsolete reference to binaries download docs.
2024-10-02libcpp: Implement clang -Wheader-guard warning [PR96842]Jakub Jelinek21-1/+127
The following patch implements the clang -Wheader-guard warning, which warns if a valid multiple inclusion header guard's #ifndef/#if !defined directive is immediately (no other non-line directives nor other (non-comment) tokens in between) followed by #define directive for some different macro, which in get_suggestion rules is close enough to the actual header guard macro (i.e. likely misspelling), the #define is object-like with empty definition (I've followed what clang implements) and the macro isn't defined later on (at least not on the final #endif at the end of a header). In this case it emits a warning, so that #ifndef STDIO_H #define STDOI_H ... #endif or similar misspellings can be caught. clang enables this warning by default, but I've put it into -Wall instead as it still seems to be a style warning, nothing more severe; if a header doesn't survive multiple inclusion because of the misspelling, users will get different diagnostics. 2024-10-02 Jakub Jelinek <jakub@redhat.com> PR preprocessor/96842 libcpp/ * include/cpplib.h (struct cpp_options): Add warn_header_guard member. (enum cpp_warning_reason): Add CPP_W_HEADER_GUARD enumerator. * internal.h (struct cpp_reader): Add mi_def_cmacro, mi_loc and mi_def_loc members. (_cpp_defined_macro_p): Constify type pointed by argument type. Formatting fix. * init.cc (cpp_create_reader): Clear CPP_OPTION (pfile, warn_header_guard). * directives.cc (struct if_stack): Add def_loc and mi_def_cmacro members. (DIRECTIVE_TABLE): Add IF_COND flag to define. (do_define): Set ifs->mi_def_cmacro on a define immediately following #ifndef directive for the guard. Clear pfile->mi_valid. Formatting fix. (do_endif): Copy over pfile->mi_def_cmacro and pfile->mi_def_loc if ifs->mi_def_cmacro is set and pfile->mi_cmacro isn't a defined macro. (push_conditional): Clear mi_def_cmacro and mi_def_loc members. * files.cc (_cpp_pop_file_buffer): Emit -Wheader-guard diagnostics. gcc/ * doc/invoke.texi (Wheader-guard): Document. gcc/c-family/ * c.opt (Wheader-guard): New option. * c.opt.urls: Regenerated. * c-ppoutput.cc (init_pp_output): Initialize also cb->get_suggestion. gcc/testsuite/ * c-c++-common/cpp/Wheader-guard-1.c: New test. * c-c++-common/cpp/Wheader-guard-1-1.h: New test. * c-c++-common/cpp/Wheader-guard-1-2.h: New test. * c-c++-common/cpp/Wheader-guard-1-3.h: New test. * c-c++-common/cpp/Wheader-guard-1-4.h: New test. * c-c++-common/cpp/Wheader-guard-1-5.h: New test. * c-c++-common/cpp/Wheader-guard-1-6.h: New test. * c-c++-common/cpp/Wheader-guard-1-7.h: New test. * c-c++-common/cpp/Wheader-guard-1-8.h: New test. * c-c++-common/cpp/Wheader-guard-1-9.h: New test. * c-c++-common/cpp/Wheader-guard-1-10.h: New test. * c-c++-common/cpp/Wheader-guard-1-11.h: New test. * c-c++-common/cpp/Wheader-guard-1-12.h: New test. * c-c++-common/cpp/Wheader-guard-2.c: New test. * c-c++-common/cpp/Wheader-guard-2.h: New test. * c-c++-common/cpp/Wheader-guard-3.c: New test. * c-c++-common/cpp/Wheader-guard-3.h: New test.
2024-10-02opts: Fix up regenerate-opt-urls dependenciesJakub Jelinek1-2/+2
It seems that we currently require 1) enabling at least c,c++,fortran,d in --enable-languages 2) first doing make html before one can successfully regenerate-opt-urls, otherwise without 2) one gets make regenerate-opt-urls make: *** No rule to make target '/home/jakub/src/gcc/obj12x/gcc/HTML/gcc-15.0.0/gcc/Option-Index.html', needed by 'regenerate-opt-urls'. Stop. or say if not configuring d after make html one still gets make regenerate-opt-urls make: *** No rule to make target '/home/jakub/src/gcc/obj12x/gcc/HTML/gcc-15.0.0/gdc/Option-Index.html', needed by 'regenerate-opt-urls'. Stop. Now, I believe neither 1) nor 2) is really necessary. The regenerate-opt-urls goal has dependency on 3 Option-Index.html files, but those files don't have dependencies how to generate them. make html has dependency on $(HTMLS_BUILD) which adds $(build_htmldir)/gcc/index.html and lang.html among other things, where the former actually builds not just index.html but also Option-Index.html and tons of other files, and lang.html is filled in by configure depending on configured languages, so sometimes will include gfortran.html and sometimes d.html. The following patch adds dependencies of the Option-Index.html on their corresponding index.html files and that is all that seems to be needed, make regenerate-opt-urls then works even without prior make html and even if just a subset of c/c++, fortran and d is enabled. 2024-10-02 Jakub Jelinek <jakub@redhat.com> * Makefile.in ($(OPT_URLS_HTML_DEPS)): Add dependencies of the Option-Index.html files on the corresponding index.html files. Don't mention the requirement that all languages that have their own HTML manuals to be enabled.
2024-10-02backprop: Fix deleting of a phi node [PR116922]Andrew Pinski2-2/+27
The problem here is remove_unused_var is called on a name that is defined by a phi node but it deletes it like removing a normal statement. remove_phi_node should be called rather than gsi_remove for phinodes. Note there is a possibility of using simple_dce_from_worklist instead but that is for another day. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/116922 gcc/ChangeLog: * gimple-ssa-backprop.cc (remove_unused_var): Handle phi nodes correctly. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr116922.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-02Fix gcc.dg/pr116905.cRichard Biener1-0/+1
I missed { dg-add-options float16 }. * gcc.dg/pr116905.c: Add float16 options.
2024-10-02testsuite/116654 - adjust gcc.target/powerpc/p9-vec-length-full-8.cRichard Biener1-3/+4
gcc.target/powerpc/p9-vec-length-full-8.c was expecting all loops to use -with-len fully masked vectorization to avoid epilogues because the loops needed peeling for gaps. With SLP we have improved things here and the loops using V2D[IF]mode no longer need peeling for gaps since the target can compose those vectors from two scalars and in turn we generate better code and not need an epilogue either (the iteration count divides by the VF). PR testsuite/116654 * gcc.target/powerpc/p9-vec-length-full-8.c: Adjust.
2024-10-02testsuite/116654 - adjust gcc.dg/vect/costmodel/ppc/costmodel-slp-12.cRichard Biener1-1/+1
As we now SLP non-grouped stores we have to adjust the expected count. PR testsuite/116654 * gcc.dg/vect/costmodel/ppc/costmodel-slp-12.c: Adjust.
2024-10-02tree-optimization/116654 - missed dr_explicit_realign[_optimized] with SLPRichard Biener1-5/+5
With single-lane SLP we miss to use the power realing loads causing some testsuite FAILs. r14-2430-g4736ddd11874fe exempted SLP of non-grouped accesses because that could have been only splats where the scheme isn't used anyway, but now with single-lane SLP it can be contiguous accesses. PR tree-optimization/116654 * tree-vect-data-refs.cc (vect_supportable_dr_alignment): Treat non-grouped accesses like non-SLP.
2024-10-02RISC-V: Add testcases for form 2 of scalar signed SAT_SUBPan Li9-0/+192
Form 2: #define DEF_SAT_S_SUB_FMT_2(T, UT, MIN, MAX) \ T __attribute__((noinline)) \ sat_s_sub_##T##_fmt_1 (T x, T y) \ { \ T minus = (UT)x - (UT)y; \ if ((x ^ y) >= 0 || (minus ^ x) >= 0) \ return minus; \ return x < 0 ? MIN : MAX; \ } DEF_SAT_S_SUB_FMT_2(int8_t, uint8_t, INT8_MIN, INT8_MAX) The below test are passed for this patch. * The rv64gcv fully regression test. It is test only patch and obvious up to a point, will commit it directly if no comments in next 48H. gcc/testsuite/ChangeLog: * gcc.target/riscv/sat_arith.h: Add test helper macros. * gcc.target/riscv/sat_s_sub-2-i16.c: New test. * gcc.target/riscv/sat_s_sub-2-i32.c: New test. * gcc.target/riscv/sat_s_sub-2-i64.c: New test. * gcc.target/riscv/sat_s_sub-2-i8.c: New test. * gcc.target/riscv/sat_s_sub-run-2-i16.c: New test. * gcc.target/riscv/sat_s_sub-run-2-i32.c: New test. * gcc.target/riscv/sat_s_sub-run-2-i64.c: New test. * gcc.target/riscv/sat_s_sub-run-2-i8.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-10-02Match: Support form 2 for scalar signed integer SAT_SUBPan Li1-0/+14
This patch would like to support the form 2 of the scalar signed integer SAT_SUB. Aka below example: Form 2: #define DEF_SAT_S_SUB_FMT_2(T, UT, MIN, MAX) \ T __attribute__((noinline)) \ sat_s_sub_##T##_fmt_1 (T x, T y) \ { \ T minus = (UT)x - (UT)y; \ if ((x ^ y) >= 0 || (minus ^ x) >= 0) \ return minus; \ return x < 0 ? MIN : MAX; \ } DEF_SAT_S_SUB_FMT_2(int8_t, uint8_t, INT8_MIN, INT8_MAX) Before this patch: 4 │ __attribute__((noinline)) 5 │ int8_t sat_s_sub_int8_t_fmt_2 (int8_t x, int8_t y) 6 │ { 7 │ int8_t minus; 8 │ unsigned char x.0_1; 9 │ unsigned char y.1_2; 10 │ unsigned char _3; 11 │ signed char _4; 12 │ signed char _5; 13 │ int8_t _6; 14 │ _Bool _11; 15 │ signed char _12; 16 │ signed char _13; 17 │ signed char _14; 18 │ signed char _15; 19 │ 20 │ ;; basic block 2, loop depth 0 21 │ ;; pred: ENTRY 22 │ x.0_1 = (unsigned char) x_7(D); 23 │ y.1_2 = (unsigned char) y_8(D); 24 │ _3 = x.0_1 - y.1_2; 25 │ minus_9 = (int8_t) _3; 26 │ _4 = x_7(D) ^ y_8(D); 27 │ _5 = x_7(D) ^ minus_9; 28 │ _15 = _4 & _5; 29 │ if (_15 >= 0) 30 │ goto <bb 4>; [42.57%] 31 │ else 32 │ goto <bb 3>; [57.43%] 33 │ ;; succ: 4 34 │ ;; 3 35 │ 36 │ ;; basic block 3, loop depth 0 37 │ ;; pred: 2 38 │ _11 = x_7(D) < 0; 39 │ _12 = (signed char) _11; 40 │ _13 = -_12; 41 │ _14 = _13 ^ 127; 42 │ ;; succ: 4 43 │ 44 │ ;; basic block 4, loop depth 0 45 │ ;; pred: 2 46 │ ;; 3 47 │ # _6 = PHI <minus_9(2), _14(3)> 48 │ return _6; 49 │ ;; succ: EXIT 50 │ 51 │ } After this patch: 4 │ __attribute__((noinline)) 5 │ int8_t sat_s_sub_int8_t_fmt_2 (int8_t x, int8_t y) 6 │ { 7 │ int8_t _6; 8 │ 9 │ ;; basic block 2, loop depth 0 10 │ ;; pred: ENTRY 11 │ _6 = .SAT_SUB (x_7(D), y_8(D)); [tail call] 12 │ return _6; 13 │ ;; succ: EXIT 14 │ 15 │ } The below test suites are passed for this patch. * The rv64gcv fully regression test. * The x86 bootstrap test. * The x86 fully regression test. gcc/ChangeLog: * match.pd: Add case 2 matching pattern for signed SAT_SUB. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-10-02Daily bump.GCC Administrator7-1/+204
2024-10-01c++: don't advertise C++20 concepts in C++14Jason Merrill1-1/+1
There have been various problems with -std=c++14 -fconcepts; let's stop defining the feature test macro in that case. gcc/c-family/ChangeLog: * c-cppbuiltin.cc (c_cpp_builtins): Don't define __cpp_concepts before C++17.
2024-10-01AVR: avr.cc - Drop a superfluous sub-condition in avr_out_compare.Georg-Johann Lay1-1/+0
In avr.cc::avr_out_compare() there is this condition: if (n_bytes == 4 && eqne_p && AVR_HAVE_ADIW && REGNO (xreg) >= REG_22 && (xval == const0_rtx || (IN_RANGE (avr_int16 (xval, 2), 0, 63) && eqne_p && reg_unused_after (insn, xreg)))) where the 2nd sub-expression "&& eqne_p" is superfluous. gcc/ * config/avr/avr.cc (avr_out_compare): Drop superfluous sub-condition.
2024-10-01AVR: avr-passes.cc - Fix a build warning.Georg-Johann Lay1-1/+2
gcc/ * config/avr/avr-passes.cc (avr_split_fake_addressing_move): Fix a build warning.
2024-10-01aarch64: Introduce new unspecs for smax/sminSaurabh Jha2-61/+45
Introduce two new unspecs, UNSPEC_COND_SMAX and UNSPEC_COND_SMIN, corresponding to rtl operators smax and smin. UNSPEC_COND_SMAX is used to generate fmaxnm instruction and UNSPEC_COND_SMIN is used to generate fminnm instruction. With these new unspecs, we can generate SVE2 max/min instructions using existing generic unpredicated and predicated instruction patterns that use optab attribute. Thus, we have removed specialised instruction patterns for max/min instructions that were using SVE_COND_FP_MAXMIN_PUBLIC iterator. No new test cases as the existing test cases should be enough to test this refactoring. gcc/ChangeLog: * config/aarch64/aarch64-sve.md (<fmaxmin><mode>3): Remove this instruction pattern. (cond_<fmaxmin><mode>): Remove this instruction pattern. * config/aarch64/iterators.md: New unspecs and changes to iterators and attrs to use the new unspecs
2024-10-01Implement MAXVAL and MINVAL for UNSIGNED.Thomas Koenig4-5/+109
gcc/fortran/ChangeLog: * check.cc (int_or_real_or_char_or_unsigned_check_f2003): New function. (gfc_check_minval_maxval): Use it. * trans-intrinsic.cc (gfc_conv_intrinsic_minmaxval): Handle initial values for UNSIGNED. * gfortran.texi: Document MINVAL and MAXVAL for unsigned. libgfortran/ChangeLog: * Makefile.am: Add minval and maxval files. * Makefile.in: Regenerated. * gfortran.map: Add new functions. * generated/maxval_m1.c: New file. * generated/maxval_m16.c: New file. * generated/maxval_m2.c: New file. * generated/maxval_m4.c: New file. * generated/maxval_m8.c: New file. * generated/minval_m1.c: New file. * generated/minval_m16.c: New file. * generated/minval_m2.c: New file. * generated/minval_m4.c: New file. * generated/minval_m8.c: New file. gcc/testsuite/ChangeLog: * gfortran.dg/unsigned_34.f90: New test.
2024-10-01Fix wrong code out of NRV + RSO + inliningEric Botcazou6-1/+69
The testcase is miscompiled with -O -flto beccause the three optimizations NRV + RSO + inlining are applied to the same call: when the LHS of the call is marked write-only before inlining, it will keep the mark after inlining although it may be read in GIMPLE from that point on. The fix is to apply the removal of the store, that would have been applied later if the call was not inlined, right before inlining, which will prevent the problematic references to the LHS from being generated during inlining. gcc/ * tree-inline.cc (expand_call_inline): Remove the store to the return slot if it is a global variable that is only written to. gcc/testsuite/ * gnat.dg/lto28.adb: New test. * gnat.dg/lto28_pkg1.ads: New helper. * gnat.dg/lto28_pkg2.ads: Likewise. * gnat.dg/lto28_pkg2.adb: Likewise. * gnat.dg/lto28_pkg3.ads: Likewise.
2024-10-01c++: introduce __builtin_is_virtual_base_ofGiuseppe D'Angelo9-4/+225
P2985R0 (C++26) introduces std::is_virtual_base_of; this is the compiler builtin that will back up the library trait (which strictly requires compiler support). The name has been chosen to match LLVM/MSVC's, as per the discussion here: https://github.com/llvm/llvm-project/issues/98310 The actual user-facing type trait in libstdc++ will be added later. gcc/cp/ChangeLog: * constraint.cc (diagnose_trait_expr): New diagnostic. * cp-trait.def (IS_VIRTUAL_BASE_OF): New builtin. * cp-tree.h (enum base_access_flags): Add a new flag to be able to request a search for a virtual base class. * cxx-pretty-print.cc (pp_cxx_userdef_literal): Update the list of GNU extensions to the grammar. * search.cc (struct lookup_base_data_s): Add a field to request searching for a virtual base class. (dfs_lookup_base): Add the ability to look for a virtual base class. (lookup_base): Forward the flag to dfs_lookup_base. * semantics.cc (trait_expr_value): Implement the builtin by calling lookup_base with the new flag. (finish_trait_expr): Handle the new builtin. gcc/ChangeLog: * doc/extend.texi: Document the new __builtin_is_virtual_base_of builtin; amend the docs for __is_base_of. gcc/testsuite/ChangeLog: * g++.dg/ext/is_virtual_base_of.C: New test. * g++.dg/ext/is_virtual_base_of_diagnostic.C: New test. Signed-off-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-10-01phi-opt: Improve factor heurstic with constants and conversions from bool ↵Andrew Pinski4-4/+50
[PR116890] Take: ``` if (t_3(D) != 0) goto <bb 3>; else goto <bb 4>; <bb 3> _8 = c_4(D) != 0; _9 = (int) _8; <bb 4> # e_2 = PHI <_9(3), 0(2)> ``` We should factor out the conversion here as that will allow a simplfication to `(t_3 != 0) & (c_4 != 0)`. Unlike most other types; `a ? b : CST` will simplify for boolean result type to either `a | b` or `a & b` so allowing this conversion for all operations will be always profitable. Bootstrapped and tested on x86_64-linux-gnu with no regressions. Note on the phi-opt-7.c testcase change, we are now able to optimize this and remove the if due to the factoring out now so this is an improvement. PR tree-optimization/116890 gcc/ChangeLog: * tree-ssa-phiopt.cc (factor_out_conditional_operation): Conversions from bool is also should be considered as wanting to happen. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/phi-opt-7.c: Update testcase for no ifs left. * gcc.dg/tree-ssa/phi-opt-42.c: New test. * gcc.dg/tree-ssa/phi-opt-43.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-01modula2: Add FindIndice to library module gm2-libs/IndexingGaius Mulley2-0/+36
This patch introduces the procedure function FindIndice to library module Indexing. gcc/m2/ChangeLog: * gm2-libs/Indexing.def (FindIndice): New procedure function. * gm2-libs/Indexing.mod (FindIndice): Implement new procedure function. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-10-01PR modula2/116918 -fswig correct syntaxGaius Mulley1-11/+11
This patch fixes the syntax for the generated swig interface file. The % characters in fprintf require escaping. gcc/m2/ChangeLog: PR modula2/116918 * gm2-compiler/M2Swig.mod (AnnotateProcedure): Capitalize the generated comment, split comment into multiple lines and terminate the comment with ". */". (DoCheckUnbounded): Escape the % character with %%. (DoWriteFile): Ditto. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2024-10-01aarch64: Add fp8 scalar typesClaudio Bantaloukas8-2/+994
The ACLE defines a new scalar type, __mfp8. This is an opaque 8bit types that can only be used by fp8 intrinsics. Additionally, the mfloat8_t type is made available in arm_neon.h and arm_sve.h as an alias of the same. This implementation uses an unsigned INTEGER_TYPE, with precision 8 to represent __mfp8. Conversions to int and other types are disabled via the TARGET_INVALID_CONVERSION hook. Additionally, operations that are typically available to integer types are disabled via TARGET_INVALID_UNARY_OP and TARGET_INVALID_BINARY_OP hooks. gcc/ChangeLog: * config/aarch64/aarch64-builtins.cc (aarch64_mfp8_type_node): Add node for __mfp8 type. (aarch64_mfp8_ptr_type_node): Add node for __mfp8 pointer type. (aarch64_init_fp8_types): New function to initialise fp8 types and register with language backends. * config/aarch64/aarch64.cc (aarch64_mangle_type): Add ABI mangling for new type. (aarch64_invalid_conversion): Add function implementing TARGET_INVALID_CONVERSION hook that blocks conversion to and from the __mfp8 type. (aarch64_invalid_unary_op): Add function implementing TARGET_UNARY_OP hook that blocks operations on __mfp8 other than &. (aarch64_invalid_binary_op): Extend TARGET_BINARY_OP hook to disallow operations on __mfp8 type. (TARGET_INVALID_CONVERSION): Add define. (TARGET_INVALID_UNARY_OP): Likewise. * config/aarch64/aarch64.h (aarch64_mfp8_type_node): Add node for __mfp8 type. (aarch64_mfp8_ptr_type_node): Add node for __mfp8 pointer type. * config/aarch64/arm_private_fp8.h (mfloat8_t): Add typedef. gcc/testsuite/ChangeLog: * g++.target/aarch64/fp8_mangling.C: New tests exercising mangling. * g++.target/aarch64/fp8_scalar_typecheck_2.C: New tests in C++. * gcc.target/aarch64/fp8_scalar_1.c: New tests in C. * gcc.target/aarch64/fp8_scalar_typecheck_1.c: Likewise.
2024-10-01tree-optimization/116902 - vectorizer load hosting breaks UID order #2Richard Biener2-29/+45
This is another case of load hoisting breaking UID order in the preheader, this time between two hoistings. The easiest way out is to do what we do for the main stmt - copy instead of move. PR tree-optimization/116902 PR tree-optimization/116842 * tree-vect-stmts.cc (sort_after_uid): Remove again. (hoist_defs_of_uses): Copy defs instead of hoisting them so we can zero their UID. (vectorizable_load): Separate analysis and transform call, do transform on the stmt copy. * g++.dg/torture/pr116902.C: New testcase.
2024-10-01tree-optimization/116905 - ICE with bogus range opsRichard Biener2-2/+18
The following avoids querying ranges of vector entities. PR tree-optimization/116905 * tree-vect-stmts.cc (supportable_indirect_convert_operation): Fix guard for vect_get_range_info. * gcc.dg/pr116905.c: New testcase.
2024-10-01tree-optimization/116906 - unsafe PRE with never executed edgesRichard Biener3-6/+93
When we're computing ANTIC for PRE we treat edges to not yet visited blocks as having a maximum ANTIC solution to get at an optimistic solution in the iteration. That assumes the edges visted eventually execute. This is a wrong assumption that can lead to wrong code (and not only non-optimality) when possibly trapping expressions are involved as the testcases in the PR show. The following mitigates this by pruning trapping expressions from ANTIC computed when maximum sets are involved. PR tree-optimization/116906 * tree-ssa-pre.cc (prune_clobbered_mems): Add clean_traps argument. (compute_antic_aux): Direct prune_clobbered_mems to prune all traps when any MAX solution was involved in the ANTIC computation. (compute_partial_antic_aux): Adjust. * gcc.dg/pr116906-1.c: New testcase. * gcc.dg/pr116906-2.c: Likewise.
2024-10-01range-cache: Fix ranger ICE if number of bbs increases [PR116899]Jakub Jelinek2-7/+21
Ranger cache during initialization reserves number of basic block slots in the m_workback vector (in an inefficient way by doing create (0) and safe_grow_cleared (n) and truncate (0) rather than say create (n) or reserve (n) after create). The problem is that some passes split bbs and/or create new basic blocks and so when one is unlucky, the quick_push into that vector can ICE. The following patch replaces those 4 quick_push calls with safe_push. I've also gathered some statistics from compiling 63 gcc sources (picked those that dependent on gimple-range-cache.h just because I had to rebuild them once for the instrumentation), and that showed that in 81% of cases nothing has been pushed into the vector at all (and note, not everything was small, there were even cases with 10000+ basic blocks), another 18.5% of cases had just 1-4 elements in the vector at most, 0.08% had 5-8 and 19 out of 305386 cases had at most 9-11 elements, nothing more. So, IMHO reserving number of basic block in the vector is a waste of compile time memory and with the safe_push calls, the patch just initializes the vector to vNULL. 2024-10-01 Jakub Jelinek <jakub@redhat.com> PR middle-end/116899 * gimple-range-cache.cc (ranger_cache::ranger_cache): Set m_workback to vNULL instead of creating it, growing and then truncating. (ranger_cache::fill_block_cache): Use safe_push rather than quick_push on m_workback. (ranger_cache::range_from_dom): Likewise. * gcc.dg/bitint-111.c: New test.