aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2025-08-29PR modula2/121709: Failed bootstrap in m2Gaius Mulley2-27/+82
This patch is a followup to PR modula2/121629 which uses the cpp_include_defaults array to configure the default search path entries. In particular it creates default search paths based on LOCAL_INCLUDE_DIR, PREFIX_INCLUDE_DIR, gcc version path and NATIVE_SYSTEM_HEADER_DIR. gcc/m2/ChangeLog: PR modula2/121709 * gm2-lang.cc (concat_component): New function. (find_cpp_entry): Ditto. (lookup_cpp_default): Ditto. (add_default_include_paths): Rewrite. (m2_pathname_root): Remove. gcc/ChangeLog: PR modula2/121709 * doc/gm2.texi (Module Search Path): Reflect the new search order. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2025-08-29c++: array subscript with COND_EXPR as the arraySirui Mu2-13/+44
The following minimum reproducer would miscompile with vanilla gcc: extern int x[10], y[10]; bool g(); void f() { 0[g() ? x : y] = 1; } gcc would mistakenly treat the subexpression (g() ? x : y) as a prvalue and move that array to stack. The following assignment would then write to the stack instead of to the global arrays. When optimizations are enabled, this assignment is discarded by dse and gcc generates the following code for the f function: "_Z1fi": jmp "_Z1gv" The miscompilation requires all the following conditions to be met: - The array subscription expression is written as idx[array], instead of the usual form array[idx]; - The "array" part must be a ternary expression (COND_EXPR in gcc tree) and it must be an lvalue. - The code must be compiled with -fstrong-eval-order which is the default for -std=c++17 or later. The cause of the issue lies in cp_build_array_ref, where it mistakenly generates a COND_EXPR with ARRAY_TYPE to the IL when all the criteria above are met. This patch tries to resolve this issue. It moves the canonicalization step that transforms idx[array] to array[idx] early in cp_build_array_ref to ensure we handle these two forms of array subscription consistently. Tested on x86_64-linux. gcc/cp/ChangeLog: * typeck.cc (cp_build_array_ref): Handle 0[arr] earlier. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/array-condition-expr.C: New test. Signed-off-by: Sirui Mu <msrlancern@gmail.com>
2025-08-29diagnostics: add GCC_DIAGNOSTICS_LOGDavid Malcolm15-36/+784
Whilst experimenting with PR diagnostics/121039 (potentially capturing suppressed diagnostics in SARIF output), I found it very useful to have a text log from the diagnostic subsystem to track what it's doing and the decisions it's making (e.g. exactly when and why a diagnostic is being rejected). This patch adds a simple logging mechanism to the diagnostics subsystem, enabled by setting GCC_DIAGNOSTICS_LOG in the environment, which emits nested text like this to stderr (or a named file): warning (option_id: 668, gmsgid: "%<-Wformat-security%> ignored without %<-Wformat%>") diagnostics::context::diagnostic_impl (option_id: 668, kind: warning, gmsgid: "%<-Wformat-security%> ignored without %<-Wformat%>") diagnostics::context::report_diagnostic rejecting: diagnostic not enabled false <- diagnostics::context::diagnostic_impl false <- warning This logging mechanism doesn't use pretty_printer because it can be helpful to use it to debug pretty_printer itself. gcc/ChangeLog: * Makefile.in (OBJS-libcommon): Add diagnostics/logging.o. * diagnostic-global-context.cc: Include "diagnostics/logging.h". (log_function_params, auto_inc_log_depth): New "using" decls. (verbatim): Add logging. (emit_diagnostic): Likewise. (emit_diagnostic_valist): Likewise. (emit_diagnostic_valist_meta): Likewise. (inform): Likewise. (inform_n): Likewise. (warning): Likewise. (warning_at): Likewise. (warning_meta): Likewise. (warning_n): Likewise. (pedwarn): Likewise. (permerror): Likewise. (permerror_opt): Likewise. * diagnostics/context.cc: Include "diagnostics/logging.h". (context::initialize): Initialize m_logger. Add logging. (context::finish): Add logging. Clean up m_logger. (context::dump): Add indent param. (context::set_sink): Add logging. (context::add_sink): Add logging. (diagnostic_kind_debug_text): New. (get_debug_string_for_kind): New. (context::report_diagnostic): Add logging. (context::diagnostic_impl): Likewise. (context::diagnostic_n_impl): Likewise. (context::end_group): Likewise. * diagnostics/context.h: Include "diagnostics/logging.h". (context::dump): Add indent param. (context::get_logger): New accessor. (context::classify_diagnostics): Add logging. (context::push_diagnostics): Likewise. (context::pop_diagnostics): Likewise. (context::m_logger): New field. * diagnostics/html-sink.cc: Include "diagnostics/logging.h". (html_builder::flush_to_file): Add logging. (html_sink::on_report_diagnostic): Likewise. * diagnostics/kinds.h (get_debug_string_for_kind): New decl. * diagnostics/logging.cc: New file. * diagnostics/logging.h: New file. * diagnostics/output-file.h: Include "label-text.h". * diagnostics/sarif-sink.cc: Include "diagnostics/logging.h". (sarif_builder::flush_to_object): Add logging. (sarif_builder::flush_to_file): Likewise. (sarif_sink::on_report_diagnostic): Likewise. * diagnostics/sink.h (sink::get_logger): New. * diagnostics/text-sink.cc: Include "diagnostics/logging.h". (text_sink::on_report_diagnostic): Add logging. * doc/invoke.texi (Environment Variables): Document GCC_DIAGNOSTICS_LOG. * opts-diagnostic.cc: Include "diagnostics/logging.h". (handle_OPT_fdiagnostics_add_output_): Add loggging. (handle_OPT_fdiagnostics_set_output_): Likewise. gcc/analyzer/ChangeLog: * pending-diagnostic.cc: Include "diagnostics/logging.h". (diagnostic_emission_context::warn): Add logging. (diagnostic_emission_context::inform): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-08-29xtensa: Rewrite bswapsi2_internal with compact syntaxTakayuki 'January June' Suwa4-29/+126
Also, the omission of the instruction that sets the shift amount register (SAR) to 8 is now more efficient: it is omitted if there was a previous bswapsi2 in the same BB, but not omitted if no bswapsi2 is found or another insn that modifies SAR is found first (see below). Note that the five instructions for writing to SAR are as follows, along with the insns that use them (except for bswapsi2_internal itself): - SSA8B *shift_per_byte, *shlrd_per_byte - SSA8L *shift_per_byte, *shlrd_per_byte - SSR ashrsi3 (alt 1), lshrsi3 (alt 1), *shlrd_reg, rotrsi3 (alt 1) - SSL ashlsi3_internal (alt 1), *shlrd_reg, rotlsi3 (alt 1) - SSAI *shlrd_const, rotlsi3 (alt 0), rotrsi3 (alt 0) gcc/ChangeLog: * config/xtensa/xtensa-protos.h (xtensa_bswapsi2_output): New function prototype. * config/xtensa/xtensa.cc (xtensa_bswapsi2_output_1, xtensa_bswapsi2_output): New functions. * config/xtensa/xtensa.md (bswapsi2_internal): Rewrite in compact syntax and use xtensa_bswapsi2_output() as asm output. gcc/testsuite/ChangeLog: * gcc.target/xtensa/bswap-SSAI8.c: New.
2025-08-29[RISC-V][PR target/121548] Avoid bogus index into recog operand cacheJeff Law2-0/+7
So the RISC-V port has attributes which indicate the index within the recog_data where certain operands will be found. For this BZ the default value for the merge_op_idx attribute on the given insn is "2". But the insn only has operands 0 & 1. So we do an out of bounds array access and boom the ICE/valgrind failure. As we discussed in the patchwork meeting, this is all a bit clunky and has been fairly error prone. This doesn't add any massive checking, but does introduce some asserts to help catch problems a bit earlier and clearer. In particular in cases where we're already asserting that the returned index is valid (!= INVALID_ATTRIBUTE) we also assert that the index is less than the total number of operands. In the get_vlmax_ta_preferred_avl routine it appears like we need to handle these two cases more gracefully as we apparently legitimately query for the merge_op_idx on a fairly arbitrary insn. We just have to make sure to not *use* the result if it's INVALID_ATTRIBUTE. So for that code we assert that merge_op_idx is either INVALID_ATTRIBUTE or smaller than the number of operands. This patch also adds overrides for 3 patterns to return INVALID_ATTRIBUTE for merge_op_idx, similar to how they already do for mode_idx and avl_type_idx. This has been bootstrapped and regression tested on the bpi & pioneer systems and regression tested for riscv32-elf and riscv64-elf. Waiting on CI before pushing. PR target/121548 gcc/ * config/riscv/riscv-avlprop.cc (get_insn_vtype_mode): Assert MODE_IDX is smaller than the number of operands. (simplify_replace_vlmax_avl): Similarly. (pass_avlprop::get_vlmax_ta_preferred_avl): Similarly. * config/riscv/vector.md: Override merge_op_idx computation for simple moves, just like is done for avl_type_idx and mode_idx.
2025-08-29Fortran: improve compile-time checking of character dummy arguments [PR93330]Harald Anlauf7-38/+370
PR fortran/93330 gcc/fortran/ChangeLog: * interface.cc (get_sym_storage_size): Add argument size_known to indicate that the storage size could be successfully determined. (get_expr_storage_size): Likewise. (gfc_compare_actual_formal): Use them to handle zero-sized dummy and actual arguments. If a character formal argument has the pointer or allocatable attribute, or is an array that is not assumed or explicit size, we generate an error by default unless -std=legacy is specified, which falls back to just giving a warning. If -Wcharacter-truncation is given, warn on a character actual argument longer than the dummy. Generate an error for too short scalar character arguments if -std=f* is given instead of just a warning. gcc/testsuite/ChangeLog: * gfortran.dg/argument_checking_15.f90: Adjust dg-pattern. * gfortran.dg/bounds_check_strlen_7.f90: Add dg-pattern. * gfortran.dg/char_length_3.f90: Adjust options. * gfortran.dg/whole_file_24.f90: Add dg-pattern. * gfortran.dg/whole_file_29.f90: Likewise. * gfortran.dg/argument_checking_27.f90: New test.
2025-08-29RISC-V: Add patterns for vector-scalar IEEE floating-point minPaul-Antoine Arras17-14/+139
This pattern enables the combine pass (or late-combine, depending on the case) to merge a vec_duplicate into an unspec_vfmin RTL instruction. Before this patch, we have two instructions, e.g.: vfmv.v.f v2,fa0 vfmin.vv v1,v1,v2 After, we get only one: vfmin.vf v1,v1,fa0 gcc/ChangeLog: * config/riscv/autovec-opt.md (*vfmin_vf_ieee_<mode>): Add new patterns to combine vec_duplicate + vfmin.vv (unspec) into vfmin.vf. (*vfmul_vf_<mode>, *vfrdiv_vf_<mode>, *vfmin_vf_<mode>): Fix attribute types. * config/riscv/vector.md (@pred_<ieee_fmaxmin_op><mode>_scalar): Allow VLS modes. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c: Add vfmin. * gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-5-f16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-5-f32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-5-f64.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-6-f16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-6-f32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-6-f64.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-7-f16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-7-f32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-7-f64.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-8-f16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-8-f32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf-8-f64.c: New test.
2025-08-29x86: Allow by_pieces op when expanding memcpy/memset epilogueH.J. Lu11-0/+132
Since commit 401199377c50045ede560daf3f6e8b51749c2a87 Author: H.J. Lu <hjl.tools@gmail.com> Date: Tue Jun 17 10:17:17 2025 +0800 x86: Improve vector_loop/unrolled_loop for memset/memcpy uses move_by_pieces and store_by_pieces to expand memcpy/memset epilogue with vector_loop even when targetm.use_by_pieces_infrastructure_p returns false, which triggers gcc_assert (targetm.use_by_pieces_infrastructure_p (len, align, memsetp ? SET_BY_PIECES : STORE_BY_PIECES, optimize_insn_for_speed_p ())); in store_by_pieces. Fix it by: 1. Add by_pieces_in_use to machine_function to indicate that by_pieces op is currently in use. 2. Set and clear by_pieces_in_use when expanding memcpy/memset epilogue with move_by_pieces and store_by_pieces. 3. Define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P to return true if by_pieces_in_use is true. gcc/ PR target/121096 * config/i386/i386-expand.cc (expand_cpymem_epilogue): Set and clear by_pieces_in_use when using by_pieces op. (expand_setmem_epilogue): Likewise. * config/i386/i386.cc (ix86_use_by_pieces_infrastructure_p): New. (TARGET_USE_BY_PIECES_INFRASTRUCTURE_P): Likewise. * config/i386/i386.h (machine_function): Add by_pieces_in_use. gcc/testsuite/ PR target/121096 * gcc.target/i386/memcpy-strategy-14.c: New test. * gcc.target/i386/memcpy-strategy-15.c: Likewise. * gcc.target/i386/memset-strategy-10.c: Likewise. * gcc.target/i386/memset-strategy-11.c: Likewise. * gcc.target/i386/memset-strategy-12.c: Likewise. * gcc.target/i386/memset-strategy-13.c: Likewise. * gcc.target/i386/memset-strategy-14.c: Likewise. * gcc.target/i386/memset-strategy-15.c: Likewise. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-08-29x86: Handle constant in any modes in setmem_epilogue_gen_valH.J. Lu2-8/+14
Since the constant passed to setmem_epilogue_gen_val may not be in word_mode, update setmem_epilogue_gen_val to handle any integer modes. gcc/ PR target/121108 * config/i386/i386-expand.cc (setmem_epilogue_gen_val): Don't assert op_mode == word_mode and handle any integer modes. gcc/testsuite/ PR target/121108 * gcc.target/i386/memset-strategy-16.c: New test. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-08-29x86-64: Improve source operand check for TLS_CALLH.J. Lu4-78/+154
Source operands of 2 TLS_CALL patterns in (insn 10 9 11 3 (set (reg:DI 100) (unspec:DI [ (symbol_ref:DI ("caml_state") [flags 0x10] <var_decl 0x7fe10e1d9e40 caml_state>) ] UNSPEC_TLSDESC)) "x.c":7:16 1674 {*tls_dynamic_gnu2_lea_64_di} (nil)) (insn 11 10 12 3 (parallel [ (set (reg:DI 99) (unspec:DI [ (symbol_ref:DI ("caml_state") [flags 0x10] <var_decl 0x7fe10e1d9e40 caml_state>) (reg:DI 100) (reg/f:DI 7 sp) ] UNSPEC_TLSDESC)) (clobber (reg:CC 17 flags)) ]) "x.c":7:16 1676 {*tls_dynamic_gnu2_call_64_di} (expr_list:REG_DEAD (reg:DI 100) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) and (insn 19 17 20 4 (set (reg:DI 104) (unspec:DI [ (symbol_ref:DI ("caml_state") [flags 0x10] <var_decl 0x7fe10e1d9e40 caml_state>) ] UNSPEC_TLSDESC)) "x.c":6:10 discrim 1 1674 {*tls_dynamic_gnu2_lea_64_di} (nil)) (insn 20 19 21 4 (parallel [ (set (reg:DI 103) (unspec:DI [ (symbol_ref:DI ("caml_state") [flags 0x10] <var_decl 0x7fe10e1d9e40 caml_state>) (reg:DI 104) (reg/f:DI 7 sp) ] UNSPEC_TLSDESC)) (clobber (reg:CC 17 flags)) ]) "x.c":6:10 discrim 1 1676 {*tls_dynamic_gnu2_call_64_di} (expr_list:REG_DEAD (reg:DI 104) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) are the same even though rtx_equal_p returns false since (reg:DI 100) and (reg:DI 104) are set from the same symbol. Use the UNSPEC_TLSDESC symbol (unspec:DI [(symbol_ref:DI ("caml_state") [flags 0x10])] UNSPEC_TLSDESC)) to check if 2 TLS_CALL patterns have the same source. For TLS64_COMBINE, use both UNSPEC_TLSDESC and UNSPEC_DTPOFF unspecs to check if 2 TLS64_COMBINE patterns have the same source. gcc/ PR target/121694 * config/i386/i386-features.cc (redundant_pattern): Add tlsdesc_val. (pass_x86_cse): Likewise. (pass_x86_cse::tls_set_insn_from_symbol): New member function. (pass_x86_cse::candidate_gnu2_tls_p): Set tlsdesc_val. For TLS64_COMBINE, match both UNSPEC_TLSDESC and UNSPEC_DTPOFF symbols. For TLS64_CALL, match the UNSPEC_TLSDESC sumbol. (pass_x86_cse::x86_cse): Initialize the tlsdesc_val field in load. Pass the tlsdesc_val field to ix86_place_single_tls_call for X86_CSE_TLSDESC. gcc/testsuite/ PR target/121694 * gcc.target/i386/pr121668-1b.c: New test. * gcc.target/i386/pr121694-1a.c: Likewise. * gcc.target/i386/pr121694-1b.c: Likewise. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-08-29c++: -fimplicit-constexpr testcase tweakJason Merrill1-1/+1
If B::get is (implictly or explicitly) constexpr the individual b bindings have constant initialization and get optimized away, so their symbols don't appear in the assembly. gcc/testsuite/ChangeLog: * g++.dg/cpp26/decomp26.C: Add -fimplicit-constexpr.
2025-08-29invoke.texi: AMD GCN - remove '(experimental)' from some gfx*-genericTobias Burnus1-3/+3
GCC added generic support in r15-7406-gb5a29a93ee29a8 (Feb 2025) with an '(experimental)' marker, also because ROCm only supported it in their git repository and not in a released version. Since ROCm 6.4 (Apr 2025), generic is also supported in released ROCm versions - and has been meanwhile tested by us. For architectures that have a well tested architecture, there is no reason that a binary, compiled for the associated generic architecture, performs any different to the specific version. Hence, this commit removes the marker for gfx-9-generic (gfx900, gfx906, gfx90c are known to work specific architectures), gfx10-3-generic (likewise for gfx1030 and gfx1036), and gfx11-generic (gfx1100 and gfx1103). gcc/ChangeLog: * doc/invoke.texi (AMD GCN Options: -march): Remove '(experimental)' from gfx-{9,10-3,11}-generic.
2025-08-29install.texi: For amdgcn, clarify which llvm-* binaries are requiredTobias Burnus1-3/+7
Also remove future tense for ROCm as 6.4.0 has been released in April 2025 and it supports generic architectures. gcc/ChangeLog: * doc/install.texi (amdgcn): Clarify which binaries must be the LLVM version and which must be installed. Update version data for ROCm for generic architectures.
2025-08-29i386: Fix vect-pragma-target-[12].c testcase for -march=XYZ [PR120643]Andrew Pinski2-2/+2
These 2 testcases were originally designed for the default -march= of x86_64 so if you pass -march=native (on a target with AVX512 enabled), they will fail. It fix this, we add `-mno-sse3 -mtune=generic` to the options to force a specific arch to the testcase. Changes since v1: * v2: Use -mtune=generic instead of -mprefer-vector-width=512. Tested on a skylake-avx512 machine with -march=native. PR testsuite/120643 gcc/testsuite/ChangeLog: * gcc.target/i386/vect-pragma-target-1.c: Add `-mno-sse3 -mtune=generic` to the options. * gcc.target/i386/vect-pragma-target-2.c: Likewise. Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
2025-08-28aarch64/testsuite: Fix vld2-1.c after r16-3201 [PR121713]Andrew Pinski1-1/+2
After r16-3201-gee67004474d521, this testcase started to fail as we can copy prop into arguments now so the number of "after previous" check has doubled. Pushed after a quick check to make sure the testcase is now passing. PR testsuite/121713 gcc/testsuite/ChangeLog: * gcc.target/aarch64/vld2-1.c: Update the number of "after previous" checks. Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
2025-08-28Document -param=ix86-vect-unroll-limit.liuhongt1-0/+3
gcc/ChangeLog: * doc/invoke.texi: Document -param=ix86-vect-unroll-limit.
2025-08-29RISC-V: Add test for vec_duplicate + vnmsac.vv unsigned combine with GR2VR ↵Pan Li16-0/+76
cost 0, 1 and 15 Add asm dump check and run test for vec_duplicate + vnmsac.vvm combine to vnmsac.vx, with the GR2VR cost is 0, 2 and 15. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Add asm check for vnmsac.vx. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-u16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-u32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-u64.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-u8.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
2025-08-29RISC-V: Add test for vec_duplicate + vnmsac.vv signed combine with GR2VR ↵Pan Li18-0/+446
cost 0, 1 and 15 Add asm dump check and run test for vec_duplicate + vnmsac.vvm combine to vnmsac.vx, with the GR2VR cost is 0, 2 and 15. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c: Add asm check for vnmsac.vx. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx_ternary.h: Add test helper macros. * gcc.target/riscv/rvv/autovec/vx_vf/vx_ternary_data.h: Add test data for run test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-i16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-i32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-i64.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vnmsac-run-1-i8.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
2025-08-29RISC-V: Combine vec_duplicate + vnmsac.vv to vnmsac.vx on GR2VR costPan Li2-0/+118
This patch would like to combine the vec_duplicate + vnmsac.vv to the vnmsac.vx. From example as below code. The related pattern will depend on the cost of vec_duplicate from GR2VR. Then the late-combine will take action if the cost of GR2VR is zero, and reject the combination if the GR2VR cost is greater than zero. Assume we have example code like below, GR2VR cost is 0. #define DEF_VX_TERNARY_CASE_0(T, OP_1, OP_2, NAME) \ void \ test_vx_ternary_##NAME##_##T##_case_0 (T * restrict vd, T * restrict vs2, \NAME T rs1, unsigned n) \ { \ for (unsigned i = 0; i < n; i++) \ vd[i] = vd[i] OP_2 vs2[i] OP_1 rs1; \ } DEF_VX_TERNARY_CASE_0(int32_t, *, +, macc) Before this patch: 11 │ beq a3,zero,.L8 12 │ vsetvli a5,zero,e32,m1,ta,ma 13 │ vmv.v.x v2,a2 ... 16 │ .L3: 17 │ vsetvli a5,a3,e32,m1,ta,ma ... 22 │ vnmsac.vv v1,v2,v3 ... 25 │ bne a3,zero,.L3 After this patch: 11 │ beq a3,zero,.L8 ... 14 │ .L3: 15 │ vsetvli a5,a3,e32,m1,ta,ma ... 20 │ vnmsac.vx v1,a2,v3 ... 23 │ bne a3,zero,.L3 gcc/ChangeLog: * config/riscv/autovec-opt.md (*vnmsac_vx_<mode>): Add new pattern to combine to vx. * config/riscv/vector.md (@pred_vnmsac_vx_<mode>): Add new pattern to generate rtl. (*pred_nmsac_<mode>_scalar_undef): Ditto. Signed-off-by: Pan Li <pan2.li@intel.com>
2025-08-28Fix _Decimal128 arithmetic error under FE_UPWARD.liuhongt6-215/+586
libgcc/config/libbid/ChangeLog: PR target/120691 * bid128_div.c: Fix _Decimal128 arithmetic error under FE_UPWARD. * bid128_rem.c: Ditto. * bid128_sqrt.c: Ditto. * bid64_div.c (bid64_div): Ditto. * bid64_sqrt.c (bid64_sqrt): Ditto. gcc/testsuite/ChangeLog: * gcc.target/i386/pr120691.c: New test.
2025-08-29Daily bump.GCC Administrator9-1/+294
2025-08-28fixincludes: Skip pthread_incomplete_struct_argument for modern glibc [PR118009]Jonathan Wakely3-5/+13
The pthread_incomplete_struct_argument fix was intended for ancient versions of Glibc (only 2.3.3 and 2.3.4, I believe). From Glibc 2.3.5 the pthread.h header already included the change to use a pointer instead of an array, so the fixinclude was no longer used. However, the https://sourceware.org/bugzilla/show_bug.cgi?id=26647 fix changed the __setjmpbuf declaration to use struct __jmp_buf_tag __env[1] again, which caused this fixinclude to start matching again. This means that GCC now installs a "fixed" pthread.h with a change to a declaration that guarded by #if ! __GNUC_PREREQ (11, 0), i.e. it's not even relevant for modern versions of GCC. The "fixed" pthread.h causes problems for users because of changes to internal implementation details of the pthread_cond_t type, which require the "fixed" pthread.h to be updated with mkheaders if Glibc is updated. This change adds a bypass to the fixinclude, so that it no longer matches modern Glibc versions, and only applies to glibc versions 2.3.3 and 2.3.4 as originally intended. Also remove outdated reference to svn in the comment at the top of the generated file. fixincludes/ChangeLog: PR bootstrap/118009 PR bootstrap/119089 * inclhack.def (pthread_incomplete_struct_argument): Add bypass. * fixincl.tpl: Remove reference to svn in comment. * fixincl.x: Regenerate. Reviewed-by: Jason Merrill <jason@redhat.com>
2025-08-28libstdc++: Implement C++26 <debugging> features [PR119670]Jonathan Wakely17-3/+464
This implements P2546R5 (Debugging Support), including the P2810R4 (is_debugger_present is_replaceable) changes, allowing std::is_debugger_present to be replaced by the program. It would be good to provide a macOS definition of is_debugger_present as per https://developer.apple.com/library/archive/qa/qa1361/_index.html but that isn't included in this change. The src/c++26/debugging.cc file defines a global volatile int which can be set by debuggers to indicate when they are attached and detached from a running process. This allows std::is_debugger_present() to give a reliable answer, and additionally allows a debugger to choose how std::breakpoint() should behave. Setting the global to a positive value will cause std::breakpoint() to use that value as an argument to std::raise, so debuggers that prefer SIGABRT for breakpoints can select that. By default std::breakpoint() will use a platform-specific action such as the INT3 instruction on x86, or GCC's __builtin_trap(). On Linux the std::is_debugger_present() function checks whether the process is being traced by a process named "gdb", "gdbserver" or "lldb-server", to try to avoid interpreting other tracing processes (such as strace) as a debugger. There have been comments suggesting this isn't desirable and that std::is_debugger_present() should just return true for any tracing process (which is the case for non-Linux targets that support the ptrace system call). libstdc++-v3/ChangeLog: PR libstdc++/119670 * acinclude.m4 (GLIBCXX_CHECK_DEBUGGING): Check for facilities needed by <debugging>. * config.h.in: Regenerate. * configure: Regenerate. * configure.ac: Use GLIBCXX_CHECK_DEBUGGING. * include/Makefile.am: Add new header. * include/Makefile.in: Regenerate. * include/bits/version.def (debugging): Add. * include/bits/version.h: Regenerate. * include/precompiled/stdc++.h: Add new header. * src/c++26/Makefile.am: Add new file. * src/c++26/Makefile.in: Regenerate. * include/std/debugging: New file. * src/c++26/debugging.cc: New file. * testsuite/19_diagnostics/debugging/breakpoint.cc: New test. * testsuite/19_diagnostics/debugging/breakpoint_if_debugging.cc: New test. * testsuite/19_diagnostics/debugging/is_debugger_present.cc: New test. * testsuite/19_diagnostics/debugging/is_debugger_present-2.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-08-28c++: > in lambda in template arg [PR107953]Jason Merrill2-0/+15
As with PR116928, we need to set greater_than_is_operator_p within the lambda delimiters. PR c++/107953 gcc/cp/ChangeLog: * parser.cc (cp_parser_lambda_expression): Set greater_than_is_operator_p. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/lambda-targ18.C: New test.
2025-08-28passes: Move cleanup_eh before first tailr [PR115201]Andrew Pinski1-1/+3
So the current pass order is: ``` NEXT_PASS (pass_tail_recursion); NEXT_PASS (pass_if_to_switch); NEXT_PASS (pass_convert_switch); NEXT_PASS (pass_cleanup_eh); ``` But nothing in if_to_switch nor convert_switch will change the IR such that cleanup eh will take into account. tail_recusion benifits the most by not having "almost" empty landing pads. This order was originally done when cleanup_eh was added in r0-92178-ga8da523f8a442f but it looks like it was just done just before inlining rather than thinking it could improve passes before hand. An example where this helps is PR 115201 where we have: ``` ;; basic block 5, loop depth 0, maybe hot ;; prev block 4, next block 6, flags: (NEW, REACHABLE, VISITED) ;; pred: 4 (TRUE_VALUE,EXECUTABLE) [LP 1] # .MEM_19 = VDEF <.MEM_45> # USE = nonlocal escaped # CLB = nonlocal escaped D.4770 = _Z12binarySearchIi2itIiEET0_RKT_S2_S2_D.4690 (item_15(D), startD.4711, midD.4717); goto <bb 7>; [INV] ;; succ: 8 (EH,EXECUTABLE) ;; 7 (FALLTHRU,EXECUTABLE) ... ;; basic block 8, loop depth 0, maybe hot ;; prev block 7, next block 1, flags: (NEW, REACHABLE, VISITED) ;; pred: 5 (EH,EXECUTABLE) ;; 6 (EH,EXECUTABLE) # .MEM_7 = PHI <.MEM_19(5), .MEM_18(6)> <L6>: [LP 1] # .MEM_20 = VDEF <.MEM_7> midD.4717 ={v} {CLOBBER(eos)}; resx 1 ;; succ: ``` As you can see the empty landing pad should be able to remove away and then a tail recursion can happen. Bootstrapped and tested x86_64-linux-gnu. PR tree-optimization/115201 gcc/ChangeLog: * passes.def: Move cleanup_eh before first tail_recursion. Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
2025-08-28MAINTAINERS: add myself to write after approvalYuao Ma1-0/+2
ChangeLog: * MAINTAINERS: add myself to write after approval
2025-08-28RISC-V: Add pattern for vector-scalar floating-point minPaul-Antoine Arras18-16/+340
This pattern enables the combine pass (or late-combine, depending on the case) to merge a vec_duplicate into an smin RTL instruction. Before this patch, we have two instructions, e.g.: vfmv.v.f v2,fa0 vfmin.vv v1,v1,v2 After, we get only one: vfmin.vf v1,v1,fa0 gcc/ChangeLog: * config/riscv/autovec-opt.md (*vfmin_vf_<mode>): Add new pattern to combine vec_duplicate + vfmin.vv into vfmin.vf. * config/riscv/vector.md (@pred_<optab><mode>_scalar): Allow VLS modes. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vls/floating-point-min-2.c: Adjust scan dump. * gcc.target/riscv/rvv/autovec/vls/floating-point-min-4.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c: Add vfmin. * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c: Likewise. * gcc.target/riscv/rvv/autovec/vx_vf/vf_binop.h: Add support for function variants. * gcc.target/riscv/rvv/autovec/vx_vf/vf_binop_data.h: Add data for vfmin. * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmin-run-1-f16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmin-run-1-f32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmin-run-1-f64.c: New test.
2025-08-28Dump niter assumption versioning when vectorizingRichard Biener1-0/+11
The following emits the assumption that is used for versioning from niter analysis. * tree-vect-loop.cc (vect_analyze_loop_form): Dump niter assumption used for versioning.
2025-08-28AArch64: Add isinf expander [PR 66462]Wilco Dijkstra3-1/+64
Add an expander for isinf using integer arithmetic. This is typically faster and avoids generating spurious exceptions on signaling NaNs. This fixes part of PR66462. int isinf1 (float x) { return __builtin_isinf (x); } Before: fabs s0, s0 mov w0, 2139095039 fmov s31, w0 fcmp s0, s31 cset w0, le eor w0, w0, 1 ret After: fmov w1, s0 mov w0, -16777216 cmp w0, w1, lsl 1 cset w0, eq ret gcc: PR middle-end/66462 * config/aarch64/aarch64.md (isinf<mode>2): Add new expander. * config/aarch64/iterators.md (mantissa_bits): Add new mode_attr. gcc/testsuite: PR middle-end/66462 * gcc.target/aarch64/pr66462.c: Add new test.
2025-08-28libstdc++: Test comparing ordering with type convertible to any pointer.Tomasz Kamiński1-0/+16
libstdc++-v3/ChangeLog: * testsuite/18_support/comparisons/categories/zero_neg.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-08-28Compute reduction var in vectorize_fold_left_reductionRichard Biener1-5/+8
Instead of going via the PHI node accessible through the reduc-dec link, use the scalar def of the reduction SLP node. Compute this in vectorize_fold_left_reduction itself. * tree-vect-loop.cc (vectorize_fold_left_reduction): Do not get reduc_var as argument, instead compute it here. (vect_transform_reduction): Adjust.
2025-08-28libstdc++: Remove implicit type conversions in std::complexWeslley da Silva Pereira1-7/+8
The current implementation of `complex<_Tp>` assumes that int `int` is implicitly convertible to `_Tp`, e.g., when using `complex<_Tp>(1)`. This patch transforms the implicit conversions into explicit type casts. As a result, `std::complex` is now able to support more types. One example is the type `Eigen::Half` from https://eigen.tuxfamily.org/dox-devel/Half_8h_source.html which does not implement implicit type conversions. libstdc++-v3/ChangeLog: * include/std/complex (polar, __complex_sqrt, pow) (__complex_pow_unsigned): Use explicit conversions from int to the complex value_type.
2025-08-28libstdc++: Constrain bitset(const CharT*) constructor [PR121046]Jonathan Wakely2-1/+18
Asking std::is_constructible_v<std::bitset<1>, NonTrivial*> gives an error, rather than answering the query. The problem is that the constructor for std::bitset("010101") is not constrained to only accept pointers to char-like types, and for the second parameter (which has a default argument) std::basic_string_view<CharT> gets instantiated. If the type is not char-like then that has undefined behaviour, and might trigger a static_assert to fail in the body of std::basic_string_view. We can fix it by constraining that constructor using the requirements for char-like types from [strings.general] p1. I've submitted LWG 4294 and proposed making this change in the standard. libstdc++-v3/ChangeLog: PR libstdc++/121046 * include/std/bitset (bitset(const CharT*, ...)): Add constraints on CharT type. * testsuite/23_containers/bitset/lwg4294.cc: New test.
2025-08-28libstdc++: Provide helpers to interoperate between __cmp_cat::_Ord and ↵Tomasz Kamiński1-44/+41
ordering types. This patch adds two new internal helpers for ordering types: * __cmp_cat::__ord to retrieve an internal _Ord value, * __cmp_cat::__make<Ordering> to create an ordering from an _Ord value. Conversions between ordering types are now handled by __cmp_cat::__make. As a result, ordering types no longer need to befriend each other, only the new helpers. The __fp_weak_ordering implementation has also been simplified by: * using the new helpers to convert partial_ordering to weak_ordering, * using strong_ordering to weak_ordering conversion operator, for the __isnan_sign comparison, * removing the unused __cat local variable. Finally, the _Ncmp enum is removed, and the unordered enumerator is added to the existing _Ord enum. libstdc++-v3/ChangeLog: * libsupc++/compare (__cmp_cat::_Ord): Add unordered enumerator. (__cmp_cat::_Ncmp): Remove. (__cmp_cat::__ord, __cmp_cat::__make): Define. (partial_ordering::partial_ordering(__cmp_cat::_Ncmp)): Remove. (operator<=>(__cmp_cat::__unspec, partial_ordering)) (partial_ordering::unordered): Replace _Ncmp with _Ord. (std::partial_ordering, std::weak_ordering, std::strong_ordering): Befriend __ord and __make helpers, remove friend declartions for other orderings. (__compare::__fp_weak_ordering): Remove unused __cat variable. Simplify ordering conversions. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-08-28c++/modules: Add explanatory note for incomplete types with definition in ↵Nathaniel Shead4-4/+186
different module [PR119844] The confusion in the PR arose because the definition of 'User' in a separate named module did not provide an implementation for the forward-declaration in the global module. This seems likely to be a common mistake while people are transitioning to modules, so this patch adds an explanatory note. While I was looking at this I also noticed that the existing handling of partial specialisations for this note was wrong (we pointed at the primary template declaration rather than the relevant partial spec), so this patch fixes that up, and also gives a more precise error message for using a template other than by self-reference while it's being defined. PR c++/119844 gcc/cp/ChangeLog: * typeck2.cc (cxx_incomplete_type_inform): Add explanation when a similar type is complete but attached to a different module. Also fix handling of partial specs and templates. gcc/testsuite/ChangeLog: * g++.dg/modules/pr119844_a.C: New test. * g++.dg/modules/pr119844_b.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2025-08-28PR modula2/121629: adding third party modulesGaius Mulley9-94/+384
This patch makes it easier to add third party modules. cc1gm2 now appends the search directory prefix/include/m2 to the search path for non dialect specific modules. Prior to this it appends the dialect specific subdirectories {m2pim,m2iso,m2log,m2min} with the appropriate dialect pathname. The patch also includes a new option -fm2-pathname-root=prefix which allow additional prefix/m2 directories to be searched before the default. gcc/ChangeLog: PR modula2/121629 * doc/gm2.texi (Module Search Path): New section. (Compiler options): New option -fm2-pathname-root=. New option -fm2-pathname-rootI. gcc/m2/ChangeLog: PR modula2/121629 * gm2-compiler/PathName.mod: Add copyright notice. * gm2-lang.cc (named_path): Add field lib_root. (push_back_Ipath): Set lib_root false. (push_back_lib_root): New function. (get_dir_sep_size): Ditto. (add_path_component): Ditto. (add_one_import_path): Ditto. (add_non_dialect_specific_path): Ditto. (foreach_lib_gen_import_path): Ditto. (get_module_source_dir): Ditto. (add_default_include_paths): Ditto. (assign_flibs): Ditto. (m2_pathname_root): Ditto. (add_m2_import_paths): Remove function. (gm2_langhook_post_options): Call assign_flibs. Check np.lib_root and call foreach_lib_gen_import_path. Replace call to add_m2_import_paths with a call to add_default_include_paths. (gm2_langhook_handle_option): Add case OPT_fm2_pathname_rootI_. * gm2spec.cc (named_path): Add field lib_root. (push_back_Ipath): Set lib_root false. (push_back_lib_root): New function. (add_m2_I_path): Add OPT_fm2_pathname_rootI_ option if np.lib_root. (lang_specific_driver): Add case OPT_fm2_pathname_root_. * lang.opt (fm2-pathname-root=): New option. (fm2-pathname-rootI=): Ditto. gcc/testsuite/ChangeLog: PR modula2/121629 * gm2/switches/pathnameroot/pass/switches-pathnameroot-pass.exp: New test. * gm2/switches/pathnameroot/pass/test.mod: New test. * gm2/switches/pathnameroot/pass/testlib/m2/foo.def: New test. * gm2/switches/pathnameroot/pass/testlib/m2/foo.mod: New test. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2025-08-28[gcn] gcc/configure.ac + install.texi - changes to detect HAVE_AS_LEB128 ↵Tobias Burnus3-0/+9
[PR119367] The llvm-mc linker by default assemblies to another assembly file and not to an ELF binary; that usually does not matter – but for the LEB128 check, additionally, the resulting binary is checked. Hence, when using llvm-mc as target linker for amdgcn-*-*, we better add the "--filetype=obj -triple=amdgcn--amdhsa" flags. The current patch does so unconditionally, assuming that always llvm-mc is used. Additionally, the resulting ELF file is checked, which requires an ELF reader such as objdump. This commit adds llvm-objdump to the build documentation for amdgcn, albeit also, e.g., Binutil's 'objdump' would do - as long as either amdgcn-amdhsa-objdump or amdgcn-amdhsa/bin/objdump is found during the amdgcn cross build. gcc/ChangeLog: PR debug/119367 * acinclude.m4 (gcc_GAS_FLAGS): For gcn, use "--filetype=obj -triple=amdgcn--amdhsa", if supported. * configure: Regenerate. * doc/install.texi (amdgcn-*-*): Also add llvm-objdump to the list of to-be-copied files.
2025-08-28c++: Fix auto return type deduction with expansion statements [PR121583]Jakub Jelinek3-1/+28
The following testcase ICEs during expansion, because cfun->returns_struct wasn't cleared, despite auto being deduced to int. The problem is that check_return_type -> apply_deduced_return_type is called when parsing the expansion stmt body, at that time processing_template_decl is non-zero and apply_deduced_return_type in that case doesn't do the if (function *fun = DECL_STRUCT_FUNCTION (fco)) { bool aggr = aggregate_value_p (result, fco); #ifdef PCC_STATIC_STRUCT_RETURN fun->returns_pcc_struct = aggr; #endif fun->returns_struct = aggr; } My assumption is that !processing_template_decl in that case is used in the sense "the fco function is not a function template", for function templates no reason to bother with fun->returns*struct, nothing will care about that. When returning a type dependent expression in the expansion stmt body, apply_deduced_return_type just won't be called during parsing, but when instantiating the body and all will be fine. But when returning a non-type-dependent expression, while check_return_type will be called again during instantiation of the body, as the return type is no longer auto in that case apply_deduced_return_type will not be called again and so nothing will fix up fun->returns*struct. The following patch fixes that by using !uses_template_parms (fco) check instead of !processing_template_decl. 2025-08-28 Jakub Jelinek <jakub@redhat.com> PR c++/121583 * semantics.cc (apply_deduced_return_type): Adjust fun->returns*_struct when !uses_template_parms (fco) instead of when !processing_template_decl. * g++.dg/cpp26/expansion-stmt23.C: New test. * g++.dg/cpp26/expansion-stmt24.C: New test.
2025-08-28c++: Fix ICE with parameter uses in expansion stmts [PR121575]Jakub Jelinek2-0/+64
The following testcase shows an ICE when a parameter of a non-template function is referenced in expansion stmt body. tsubst_expr in that case assumes that either the PARM_DECL has registered local specialization, or is this argument or it is in unevaluated context. Parameters are always defined outside of the expansion statement for-range-declaration or body, so for the instantiation of the body outside of templates should always map to themselves. It could be fixed by registering local self-specializations for all the function parameters, but just handling it in tsubst_expr seems to be easier and less costly. Some PARM_DECLs, e.g. from concepts, have NULL DECL_CONTEXT, those are handled like before (and assert it is unevaluated operand), for others this checks if the PARM_DECL is from a non-template and in that case it will just return t. 2025-08-28 Jakub Jelinek <jakub@redhat.com> Jason Merrill <jason@redhat.com> PR c++/121575 * pt.cc (tsubst_expr) <case PARM_DECL>: If DECL_CONTEXT (t) isn't a template return t for PARM_DECLs without local specialization. * g++.dg/cpp26/expansion-stmt20.C: New test.
2025-08-28Avoid mult pattern if that will break reduction constraintsRichard Biener1-0/+29
synth-mult introduces multiple uses of a reduction variable in some cases which will ultimatively fail vectorization (or ICE with a pending change). So avoid applying the pattern in such case. * tree-vect-patterns.cc (vect_synth_mult_by_constant): Avoid in cases that introduce multiple uses of reduction operands. Co-authored-by: Jakub Jelinek <jakub@redhat.com>
2025-08-28The divmod pattern will break reduction constraintsRichard Biener1-1/+3
When we apply a divmod pattern this will break reductions by introducing multiple uses of the reduction var, so avoid this pattern in reductions. * tree-vect-patterns.cc (vect_recog_divmod_pattern): Avoid for stmts participating in a reduction.
2025-08-28configure: Add readelf fallback for HAVE_AS_ULEB128 test [PR119367]Jakub Jelinek2-4/+14
The following patch adds a readelf fallback if objdump nor otool don't exist. All of GNU binutils readelf, eu-readelf and llvm-readelf can handle it with those options. 2025-08-28 Jakub Jelinek <jakub@redhat.com> PR debug/119367 * configure.ac (gcc_cv_as_leb128): Add fallback using readelf. Grammar fix in comment. * configure: Regenerate.
2025-08-28dwarf2out: Use DW_LNS_advance_pc instead of DW_LNS_fixed_advance_pc if ↵Jakub Jelinek1-3/+19
possible [PR119367] In the usual case we use .loc directives and don't emit the line table manually. And assembler usually uses DW_LNS_advance_pc which has uleb128 argument and in most cases will have just a single byte operand. But if we do emit it for whatever reason (old or buggy assembler or -gno-as-loc{,view}-support option), we do use DW_LNS_fixed_advance_pc instead, which has fixed 2 byte operand. That is both wasteful in the usual case of very small advances, and more importantly will just result in assembler errors if we need to advance over more than 65535 bytes. The following patch uses DW_LNS_advance_pc instead if assembler supports .uleb128 directive with a difference of two labels in the same section. This is only possible if Minimum Instruction Length in the .debug_line header is 1 (otherwise DW_LNS_advance_pc operand is multiplied by that value and DW_LNS_fixed_advance_pc is not), but we emit 1 for that on all targets. Looking at dwarf2out.o (from dwarf2out.cc with this patch) compiled with compilers before/after this change with additional -fpic -gno-as-loc{,view}-support options, I see .debug_line section shrunk from 878067 bytes to 773381 bytes, so shrink by 12%. Admittedly gas generated .debug_line is even smaller, 501374 bytes (with -fpic and without -gno-as-loc{,view}-support options). 2025-08-28 Jakub Jelinek <jakub@redhat.com> PR debug/119367 * dwarf2out.cc (output_one_line_info_table) <case LI_adv_address>: If HAVE_AS_LEB128, use DW_LNS_advance_pc with dw2_asm_output_delta_uleb128 instead of DW_LNS_fixed_advance_pc with dw2_asm_output_delta.
2025-08-28Fortran: Constructors with PDT components did not work [PR82843]Paul Thomas3-0/+66
2025-08-28 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/82843 * intrinsic.cc (gfc_convert_type_warn): If the 'from_ts' is a PDT instance, copy the derived type to the target ts. * resolve.cc (gfc_resolve_ref): A PDT component in a component reference can be that of the pdt_template. Unconditionally use component of the PDT instance to ensure that the backend_decl is set during translation. Likewise if a component is encountered that is a PDT template type, use the component parmeters to convert to the correct PDT instance. gcc/testsuite/ PR fortran/82843 * gfortran.dg/pdt_40.f03: New test.
2025-08-28Fortran: Implement correct form of PDT constructors [PR82205]Paul Thomas7-17/+111
2025-08-28 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/82205 * decl.cc (gfc_get_pdt_instance): Copy the default initializer for components that are not PDT parameters or parameterized. If any component is a pointer or allocatable set the attributes 'pointer_comp' or 'alloc_comp' of the new PDT instance. * primary.cc (gfc_match_rvalue): Implement the correct form of PDT constructors with 'name (type parms)(component values)'. * trans-array.cc (structure_alloc_comps): Apply scalar default initializers. Array initializers await the coming change in PDT representation. * trans-io.cc (transfer_expr): Do not output the type parms of a PDT in list directed output. gcc/testsuite/ PR fortran/82205 * gfortran.dg/pdt_22.f03: Use the correct for PDT constructors. * gfortran.dg/pdt_23.f03: Likewise. * gfortran.dg/pdt_3.f03: Likewise.
2025-08-28Daily bump.GCC Administrator6-1/+147
2025-08-27Remove xfail marker on RISC-V testJeff Law1-3/+3
So yet another testsuite hygiene patch. This time turning XPASS -> PASS. My tester treats those cases the same so I didn't get notified that nozicond-2.c was passing after some recent changes. This removes the xfail marker on that test and thus the test is expected to pass now. Pushing to the trunk momentarily. gcc/testsuite/ * gcc.target/riscv/nozicond-2.c: Remove xfails.
2025-08-27Fortran: H edit descriptor error with -std=f95Jerry DeLisle11-27/+32
PR fortran/114611 gcc/fortran/ChangeLog: * io.cc: Issue an error on use of the H descriptor in a format with -std=f95 or higher. Otherwise, issue a warning. gcc/testsuite/ChangeLog: * gfortran.dg/aliasing_dummy_1.f90: Accommodate errors and warnings as needed. * gfortran.dg/eoshift_8.f90: Likewise. * gfortran.dg/g77/f77-edit-h-out.f: Likewise. * gfortran.dg/hollerith_1.f90: Likewise. * gfortran.dg/io_constraints_1.f90: Likewise. * gfortran.dg/io_constraints_2.f90: Likewise. * gfortran.dg/longline.f: Likewise. * gfortran.dg/pr20086.f90: Likewise. * gfortran.dg/unused_artificial_dummies_1.f90: Likewise. * gfortran.dg/x_slash_1.f: Likewise.
2025-08-27ifcvt: fix factor_out_operators (again) [PR121695]Andrew Pinski2-1/+26
r16-2648-gaebbc90d8c7c70 had a copy and pasto where the second statement was supposed to be setting the operand 1 of the phi but it was setting operand 0 instead. This fixes typo. Push as obvious after a quick build test for x86_64-linux-gnu. PR tree-optimization/121695 gcc/ChangeLog: * tree-if-conv.cc (factor_out_operators): Fix typo in assignment of the phi. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr121695-1.c: New test. Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
2025-08-27RISC-V: testsuite: Fix vf_vfmul and vf_vfrdivPaul-Antoine Arras3-9/+1
Fix type and remove useless DejaGnu directives. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmul-run-1-f64.c: Fix type. * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrdiv-run-1-f32.c: Remove useless dg directives. * gcc.target/riscv/rvv/autovec/vx_vf/vf_vfrdiv-run-1-f64.c: Likewise.