Skip to content
Snippets Groups Projects
  1. Oct 14, 2024
    • Yangyu Chen's avatar
      RISC-V: Add detailed comments on processing implied extensions. [NFC] · 1c507a02
      Yangyu Chen authored
      
      In some cases, we don't need to handle implied extensions. Add detailed
      comments to help developers understand what implied ISAs should be
      considered.
      
      libgcc/ChangeLog:
      
      	* config/riscv/feature_bits.c (__init_riscv_features_bits_linux):
      	Add detailed comments on processing implied extensions.
      
      Signed-off-by: default avatarYangyu Chen <chenyangyu@isrc.iscas.ac.cn>
      1c507a02
    • Tamar Christina's avatar
      middle-end: support SLP early break · accb8534
      Tamar Christina authored
      This patch introduces feature parity for early break int the SLP only
      vectorizer.
      
      The approach taken here is to treat the early exits as root statements for an
      SLP tree.  This means that we don't need any changes to build_slp to support
      gconds.
      
      Codegen for the gcond itself now has to be done out of line but the body of the
      SLP blocks itself is simply driven by SLP scheduling.  There is a slight
      awkwardness in having re-used vectorizable_early_exit for both SLP and non-SLP
      but I've documented the differences and when I did try to refactor it it wasn't
      really worth it given that this is a temporary state anyway.
      
      This version is restricted to lane = 1, as such we can re-use the existing
      move_early_break function instead of having to do safety update through
      scheduling.  I have a branch where I'm working on that but lane > 1 is out of
      scope for GCC 15 anyway.   The only reason I will try to get moving through
      scheduling done as a stretch goal is so we get epilogue vectorization back for
      early break.
      
      The example:
      
      unsigned test4(unsigned x)
      {
       unsigned ret = 0;
       for (int i = 0; i < N; i++)
       {
         vect_b[i] = x + i;
         if (vect_a[i]*2 != x)
           break;
         vect_a[i] = x;
      
       }
       return ret;
      }
      
      builds the following SLP instance for early break:
      
      note:   Analyzing vectorizable control flow: if (patt_6 != 0)
      note:   Starting SLP discovery for
      note:     patt_6 = _4 != x_9(D);
      note:   starting SLP discovery for node 0x63abc80
      note:   Build SLP for patt_6 = _4 != x_9(D);
      note:   precomputed vectype: vector(4) <signed-boolean:32>
      note:   nunits = 4
      note:   vect_is_simple_use: operand x_9(D), type of def: external
      note:   vect_is_simple_use: operand # RANGE [irange] unsigned int [0, 0][2, +INF] MASK 0xffff
              _3 * 2, type of def: internal
      note:   starting SLP discovery for node 0x63abdc0
      note:   Build SLP for _4 = _3 * 2;
      note:   precomputed vectype: vector(4) unsigned int
      note:   nunits = 4
      note:   vect_is_simple_use: operand #
              vect_aD.4416[i_15], type of def: internal
      note:   vect_is_simple_use: operand 2, type of def: constant
      note:   starting SLP discovery for node 0x63abe60
      note:   Build SLP for _3 = vect_a[i_15];
      note:   precomputed vectype: vector(4) unsigned int
      note:   nunits = 4
      note:   SLP discovery for node 0x63abe60 succeeded
      note:   SLP discovery for node 0x63abdc0 succeeded
      note:   SLP discovery for node 0x63abc80 succeeded
      note:   SLP size 3 vs. limit 10.
      note:   Final SLP tree for instance 0x6474190:
      note:   node 0x63abc80 (max_nunits=4, refcnt=2) vector(4) <signed-boolean:32>
      note:   op template: patt_6 = _4 != x_9(D);
      note:   	stmt 0 patt_6 = _4 != x_9(D);
      note:   	children 0x63abd20 0x63abdc0
      note:   node (external) 0x63abd20 (max_nunits=1, refcnt=1)
      note:   	{ x_9(D) }
      note:   node 0x63abdc0 (max_nunits=4, refcnt=2) vector(4) unsigned int
      note:   op template: _4 = _3 * 2;
      note:   	stmt 0 _4 = _3 * 2;
      note:   	children 0x63abe60 0x63abf00
      note:   node 0x63abe60 (max_nunits=4, refcnt=2) vector(4) unsigned int
      note:   op template: _3 = vect_a[i_15];
      note:   	stmt 0 _3 = vect_a[i_15];
      note:   	load permutation { 0 }
      note:   node (constant) 0x63abf00 (max_nunits=1, refcnt=1)
      note:   	{ 2 }
      
      and during codegen:
      
      note:   ------>vectorizing SLP node starting from: patt_6 = _4 != x_9(D);
      note:   vect_is_simple_use: operand # RANGE [irange] unsigned int [0, 0][2, +INF] MASK 0xffff
              _3 * 2, type of def: internal
      note:   add new stmt: mask_patt_6.18_58 = _53 != vect__4.17_57;
      note:    === vectorizable_early_exit ===
      note:    transform early-exit.
      note:   vectorizing stmts using SLP.
      note:   Vectorizing SLP tree:
      note:   node 0x63abfa0 (max_nunits=4, refcnt=1) vector(4) int
      note:   op template: i_12 = i_15 + 1;
      note:   	stmt 0 i_12 = i_15 + 1;
      note:   	children 0x63aba00 0x63ac040
      note:   node 0x63aba00 (max_nunits=4, refcnt=2) vector(4) int
      note:   op template: i_15 = PHI <i_12(6), 0(14)>
      note:   	[l] stmt 0 i_15 = PHI <i_12(6), 0(14)>
      note:   	children (nil) (nil)
      note:   node (constant) 0x63ac040 (max_nunits=1, refcnt=1) vector(4) int
      note:   	{ 1 }
      
      gcc/ChangeLog:
      
      	* tree-vect-loop.cc (vect_analyze_loop_2): Handle SLP trees with no
      	children.
      	* tree-vectorizer.h (enum slp_instance_kind): Add slp_inst_kind_gcond.
      	(LOOP_VINFO_EARLY_BREAKS_LIVE_IVS): New.
      	(vectorizable_early_exit): Expose.
      	(class _loop_vec_info): Add early_break_live_stmts.
      	* tree-vect-slp.cc (vect_build_slp_instance, vect_analyze_slp_instance):
      	Support gcond instances.
      	(vect_analyze_slp): Analyze gcond roots and early break live statements.
      	(maybe_push_to_hybrid_worklist): Don't sink gconds.
      	(vect_slp_analyze_operations): Support gconds.
      	(vect_slp_check_for_roots): Update comments.
      	(vectorize_slp_instance_root_stmt): Support gconds.
      	(vect_schedule_slp): Pass vinfo to vectorize_slp_instance_root_stmt.
      	* tree-vect-stmts.cc (vect_stmt_relevant_p): Record early break live
      	statements.
      	(vectorizable_early_exit): Support SLP.
      
      gcc/testsuite/ChangeLog:
      
      	* gcc.dg/vect/vect-early-break_126.c: New test.
      	* gcc.dg/vect/vect-early-break_127.c: New test.
      	* gcc.dg/vect/vect-early-break_128.c: New test.
      accb8534
    • Eric Botcazou's avatar
      Add regression test · df25d528
      Eric Botcazou authored
      gcc/testsuite/
      	PR ada/114593
      	* gnat.dg/specs/generic_inst2-child2.ads: New test.
      	* gnat.dg/specs/generic_inst2.ads: New helper.
      	* gnat.dg/specs/generic_inst2-child1.ads: Likewise.
      df25d528
    • Jonathan Wakely's avatar
      libstdc++: Use std::move for iterator in ranges::fill [PR117094] · 03623fa9
      Jonathan Wakely authored
      Input iterators aren't required to be copyable.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/117094
      	* include/bits/ranges_algobase.h (__fill_fn): Use std::move for
      	iterator that might not be copyable.
      	* testsuite/25_algorithms/fill/constrained.cc: Check
      	non-copyable iterator with sized sentinel.
      03623fa9
    • Jonathan Wakely's avatar
      libstdc++: Enable memset optimizations for distinct character types [PR93059] · d8ef4471
      Jonathan Wakely authored
      Currently we only optimize std::fill to memset when the source and
      destination types are the same byte-sized type. This means that we fail
      to optimize cases like std::fill(buf. buf+n, 0) because the literal 0 is
      not the same type as the character buffer.
      
      Such cases can safely be optimized to use memset, because assigning an
      int (or other integer) to a narrow character type has the same effects
      as converting the integer to unsigned char then copying it with memset.
      
      This patch enables the optimized code path when the fill character is a
      memcpy-able integer (using the new __memcpyable_integer trait). We still
      need to check is_same<U, T> to enable the memset optimization for
      filling a range of std::byte with a std::byte value, because that isn't
      a memcpyable integer.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/93059
      	* include/bits/stl_algobase.h (__fill_a1(T*, T*, const T&)):
      	Change template parameters and enable_if condition to allow the
      	fill value to be an integer.
      d8ef4471
    • Jonathan Wakely's avatar
      libstdc++: Enable memcpy optimizations for distinct integral types [PR93059] · 308d19c1
      Jonathan Wakely authored
      Currently we only optimize std::copy, std::copy_n etc. to memmove when
      the source and destination types are the same. This means that we fail
      to optimize copying between distinct 1-byte types, e.g. copying from a
      buffer of unsigned char to a buffer of char8_t or vice versa.
      
      This patch adds more partial specializations of the __memcpyable trait
      so that we allow memcpy between integers of equal widths. This will
      enable memmove for copies between narrow character types and also
      between same-width types like int and unsigned.
      
      Enabling the optimization needs to be based on the width of the integer
      type, not just the size in bytes. This is because some targets define
      non-standard integral types such as __int20 in msp430, which has padding
      bits. It would not be safe to memcpy between e.g. __int20 and int32_t,
      even though sizeof(__int20) == sizeof(int32_t). A new trait is
      introduced to define the width, __memcpyable_integer, and then the
      __memcpyable trait compares the widths.
      
      It's safe to copy between signed and unsigned integers of the same
      width, because GCC only supports two's complement integers.
      
      I initially though it would be useful to define the specialization
      __memcpyable_integer<byte> to enable copying between narrow character
      types and std::byte. But that isn't possible with std::copy, because
      is_assignable<char&, std::byte> is false. Optimized copies using memmove
      will already happen for copying std::byte to std::byte, because
      __memcpyable<T*, T*> is true.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/93059
      	* include/bits/cpp_type_traits.h (__memcpyable): Add partial
      	specialization for pointers to distinct types.
      	(__memcpyable_integer): New trait to control which types can use
      	cross-type memcpy optimizations.
      308d19c1
    • Kito Cheng's avatar
      RISC-V: Implement __init_riscv_feature_bits, __riscv_feature_bits, and __riscv_vendor_feature_bits · ca44eb7f
      Kito Cheng authored
      This provides a common abstraction layer to probe the available extensions at
      run-time. These functions can be used to implement function multi-versioning or
      to detect available extensions.
      
      The advantages of providing this abstraction layer are:
      - Easy to port to other new platforms.
      - Easier to maintain in GCC for function multi-versioning.
        - For example, maintaining platform-dependent code in C code/libgcc is much
          easier than maintaining it in GCC by creating GIMPLEs...
      
      This API is intended to provide the capability to query minimal common available extensions on the system.
      
      The API is defined in the riscv-c-api-doc:
      https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.adoc
      
      Proposal to use unsigned long long for marchid and mimpid:
      https://github.com/riscv-non-isa/riscv-c-api-doc/pull/91
      
      
      
      Full function multi-versioning implementation will come later. We are posting
      this first because we intend to backport it to the GCC 14 branch to unblock
      LLVM 19 to use this with GCC 14.2, rather than waiting for GCC 15.
      
      Changes since v7:
      - Remove vendorID field in __riscv_vendor_feature_bits.
      - Fix C implies Zcf only for RV32.
      - Add more comments to kernel versions.
      
      Changes since v6:
      - Implement __riscv_cpu_model.
      - Set new sub extension bits which implied from previous extensions.
      
      Changes since v5:
      - Minor fixes on indentation.
      
      Changes since v4:
      - Bump to newest riscv-c-api-doc with some new extensions like Zve*, Zc*
        Zimop, Zcmop, Zawrs.
      - Rename the return variable name of hwprobe syscall.
      - Minor fixes on indentation.
      
      Changes since v3:
      - Fix non-linux build.
      - Let __init_riscv_feature_bits become constructor
      
      Changes since v2:
      - Prevent it initialize more than once.
      
      Changes since v1:
      - Fix the format.
      - Prevented race conditions by introducing a local variable to avoid load/store
        operations during the computation of the feature bit.
      
      Co-Developed-by: default avatarYangyu Chen <chenyangyu@isrc.iscas.ac.cn>
      Signed-off-by: default avatarYangyu Chen <chenyangyu@isrc.iscas.ac.cn>
      
      libgcc/ChangeLog:
      
      	* config/riscv/feature_bits.c: New.
      	* config/riscv/t-elf (LIB2ADD): Add feature_bits.c.
      ca44eb7f
    • Stefan Schulze Frielinghaus's avatar
      MAINTAINERS (s390 port): Add myself · fa04a171
      Stefan Schulze Frielinghaus authored
      ChangeLog:
      
      	* MAINTAINERS (s390 port): Add myself.
      fa04a171
    • Victor Do Nascimento's avatar
      middle-end: [PR middle-end/116926] Allow widening optabs for vec-mode -> scalar-mode · a6f44046
      Victor Do Nascimento authored
      The recent refactoring of the dot_prod optab to convert-type exposed a
      limitation in how `find_widening_optab_handler_and_mode' is currently
      implemented, owing to the fact that, while the function expects the
      
        GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
      
      condition to hold, the c6x backend implements a dot product from V2HI
      to SI, which triggers an ICE.
      
      Consequently, this patch adds some logic to allow widening optabs
      which accumulate vector elements to a single scalar.
      
      gcc/ChangeLog:
      
      	PR middle-end/116926
      	* optabs-query.cc (find_widening_optab_handler_and_mode): Add
      	handling of vector -> scalar optab handling.
      a6f44046
    • Richard Sandiford's avatar
      aarch64: Fix folding of degenerate svwhilele case [PR117045] · 50e7c51b
      Richard Sandiford authored
      The svwhilele folder mishandled the degenerate case in which
      the second argument is the maximum integer.  In that case,
      the result is all-true regardless of the first parameter:
      
        If the second scalar operand is equal to the maximum signed integer
        value then a condition which includes an equality test can never fail
        and the result will be an all-true predicate.
      
      This is because the conceptual "increment the first operand
      by 1 after each element" is done modulo the range of the operand.
      The GCC code was instead treating it as infinite precision.
      whilele_5.c even had a test for the incorrect behaviour.
      
      The easiest fix seemed to be to handle that case specially before
      doing constant folding.  This also copes with variable first operands.
      
      gcc/
      	PR target/116999
      	PR target/117045
      	* config/aarch64/aarch64-sve-builtins-base.cc
      	(svwhilelx_impl::fold): Check for WHILELTs of the minimum value
      	and WHILELEs of the maximum value.  Fold them to all-false and
      	all-true respectively.
      
      gcc/testsuite/
      	PR target/116999
      	PR target/117045
      	* gcc.target/aarch64/sve/acle/general/whilele_5.c: Fix bogus
      	expected result.
      	* gcc.target/aarch64/sve/acle/general/whilele_11.c: New test.
      	* gcc.target/aarch64/sve/acle/general/whilele_12.c: Likewise.
      50e7c51b
    • Thomas Schwinge's avatar
      Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP'... · 9f549d21
      Thomas Schwinge authored
      Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' __builtin_is_initial_device: Harmonize 'libgomp.oacc-fortran/acc_on_device-1-*'
      
      The test case 'libgomp.oacc-fortran/acc_on_device-1-1.f90' added in
      commit 3269a722
      "Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' __builtin_is_initial_device"
      was missing '-fno-builtin-acc_on_device', and all
      'libgomp.oacc-fortran/acc_on_device-1-*' need comments, why that option is
      specified.
      
      	PR testsuite/82250
      	libgomp/
      	* testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90: Add
      	'-fno-builtin-acc_on_device'.
      	* testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f: Comment.
      	* testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f: Comment.
      9f549d21
    • Thomas Schwinge's avatar
      Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP'... · c3774b2e
      Thomas Schwinge authored
      Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' __builtin_is_initial_device: Fix effective-target keyword in 'libgomp.oacc-fortran/acc_on_device-2.f90'
      
      The test case 'libgomp.oacc-fortran/acc_on_device-2.f90' added in
      commit 3269a722
      "Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' __builtin_is_initial_device"
      had a mismatch between dump file production and its scanning; the former needs
      to use 'offload_target_nvptx' (like 'offload_target_amdgcn'), not
      'offload_device_nvptx'.
      
      	PR testsuite/82250
      	libgomp/
      	* testsuite/libgomp.oacc-fortran/acc_on_device-2.f90: Fix
      	effective-target keyword.
      c3774b2e
    • Richard Biener's avatar
      middle-end/116891 - fix (negate (IFN_FNMS@3 @0 @1 @2)) -> (IFN_FMA @0 @1 @2) · c53bd48c
      Richard Biener authored
      Transforming -fma (-a, b, -c) to fma (a, b, c) is only valid when
      not rounding towards -inf or +inf as the sign of the multiplication
      changes.
      
      	PR middle-end/116891
      	* match.pd ((negate (IFN_FNMS@3 @0 @1 @2)) -> (IFN_FMA @0 @1 @2)):
      	Only enable for !HONOR_SIGN_DEPENDENT_ROUNDING.
      c53bd48c
    • Pan Li's avatar
      RISC-V: Add testcases for form 4 of vector signed SAT_SUB · 4d8373f8
      Pan Li authored
      
      Form 4:
        #define DEF_VEC_SAT_S_SUB_FMT_4(T, UT, MIN, MAX)                     \
        void __attribute__((noinline))                                       \
        vec_sat_s_sub_##T##_fmt_4 (T *out, T *op_1, T *op_2, unsigned limit) \
        {                                                                    \
          unsigned i;                                                        \
          for (i = 0; i < limit; i++)                                        \
            {                                                                \
              T x = op_1[i];                                                 \
              T y = op_2[i];                                                 \
              T minus;                                                       \
              bool overflow = __builtin_sub_overflow (x, y, &minus);         \
              out[i] = !overflow ? minus : x < 0 ? MIN : 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/rvv/autovec/vec_sat_arith.h: Add test helper macros.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-4-i16.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-4-i32.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-4-i64.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-4-i8.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-4-i16.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-4-i32.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-4-i64.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-4-i8.c: New test.
      
      Signed-off-by: default avatarPan Li <pan2.li@intel.com>
      4d8373f8
    • Pan Li's avatar
      RISC-V: Add testcases for form 3 of vector signed SAT_SUB · b9762922
      Pan Li authored
      
      Form 3:
        #define DEF_VEC_SAT_S_SUB_FMT_3(T, UT, MIN, MAX)                     \
        void __attribute__((noinline))                                       \
        vec_sat_s_sub_##T##_fmt_3 (T *out, T *op_1, T *op_2, unsigned limit) \
        {                                                                    \
          unsigned i;                                                        \
          for (i = 0; i < limit; i++)                                        \
            {                                                                \
              T x = op_1[i];                                                 \
              T y = op_2[i];                                                 \
              T minus;                                                       \
              bool overflow = __builtin_sub_overflow (x, y, &minus);         \
              out[i] = overflow ? x < 0 ? MIN : MAX : minus;                 \
            }                                                                \
        }
      
      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/rvv/autovec/vec_sat_arith.h: Add test helper macros.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-3-i16.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-3-i32.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-3-i64.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-3-i8.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-3-i16.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-3-i32.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-3-i64.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-3-i8.c: New test.
      
      Signed-off-by: default avatarPan Li <pan2.li@intel.com>
      b9762922
    • Pan Li's avatar
      Match: Support form 3 for vector signed integer SAT_SUB · 5920bc84
      Pan Li authored
      
      This patch would like to support the form 3 of the vector signed
      integer SAT_SUB.  Aka below example:
      
      Form 3:
        #define DEF_VEC_SAT_S_SUB_FMT_3(T, UT, MIN, MAX)                     \
        void __attribute__((noinline))                                       \
        vec_sat_s_sub_##T##_fmt_3 (T *out, T *op_1, T *op_2, unsigned limit) \
        {                                                                    \
          unsigned i;                                                        \
          for (i = 0; i < limit; i++)                                        \
            {                                                                \
              T x = op_1[i];                                                 \
              T y = op_2[i];                                                 \
              T minus;                                                       \
              bool overflow = __builtin_sub_overflow (x, y, &minus);         \
              out[i] = overflow ? x < 0 ? MIN : MAX : minus;                 \
            }                                                                \
        }
      
      Before this patch:
        25   │   if (limit_11(D) != 0)
        26   │     goto <bb 3>; [89.00%]
        27   │   else
        28   │     goto <bb 8>; [11.00%]
        29   │ ;;    succ:       3
        30   │ ;;                8
        31   │
        32   │ ;;   basic block 3, loop depth 0
        33   │ ;;    pred:       2
        34   │   _13 = (unsigned long) limit_11(D);
        35   │ ;;    succ:       4
        36   │
        37   │ ;;   basic block 4, loop depth 1
        38   │ ;;    pred:       3
        39   │ ;;                7
        40   │   # ivtmp.7_34 = PHI <0(3), ivtmp.7_30(7)>
        41   │   _26 = op_1_12(D) + ivtmp.7_34;
        42   │   x_29 = MEM[(int8_t *)_26];
        43   │   _1 = op_2_14(D) + ivtmp.7_34;
        44   │   y_24 = MEM[(int8_t *)_1];
        45   │   _9 = .SUB_OVERFLOW (x_29, y_24);
        46   │   _7 = IMAGPART_EXPR <_9>;
        47   │   if (_7 != 0)
        48   │     goto <bb 6>; [50.00%]
        49   │   else
        50   │     goto <bb 5>; [50.00%]
        51   │ ;;    succ:       6
        52   │ ;;                5
        53   │
        54   │ ;;   basic block 5, loop depth 1
        55   │ ;;    pred:       4
        56   │   _42 = REALPART_EXPR <_9>;
        57   │   _2 = out_17(D) + ivtmp.7_34;
        58   │   MEM[(int8_t *)_2] = _42;
        59   │   ivtmp.7_27 = ivtmp.7_34 + 1;
        60   │   if (_13 != ivtmp.7_27)
        61   │     goto <bb 7>; [89.00%]
        62   │   else
        63   │     goto <bb 8>; [11.00%]
        64   │ ;;    succ:       7
        65   │ ;;                8
        66   │
        67   │ ;;   basic block 6, loop depth 1
        68   │ ;;    pred:       4
        69   │   _38 = x_29 < 0;
        70   │   _39 = (signed char) _38;
        71   │   _40 = -_39;
        72   │   _41 = _40 ^ 127;
        73   │   _33 = out_17(D) + ivtmp.7_34;
        74   │   MEM[(int8_t *)_33] = _41;
        75   │   ivtmp.7_25 = ivtmp.7_34 + 1;
        76   │   if (_13 != ivtmp.7_25)
        77   │     goto <bb 7>; [89.00%]
        78   │   else
        79   │     goto <bb 8>; [11.00%]
      
      After this patch:
        77   │   _94 = .SELECT_VL (ivtmp_92, POLY_INT_CST [16, 16]);
        78   │   vect_x_13.9_81 = .MASK_LEN_LOAD (vectp_op_1.7_79, 8B, { -1, ... }, _94, 0);
        79   │   vect_y_15.12_85 = .MASK_LEN_LOAD (vectp_op_2.10_83, 8B, { -1, ... }, _94, 0);
        80   │   vect_patt_49.13_86 = .SAT_SUB (vect_x_13.9_81, vect_y_15.12_85);
        81   │   .MASK_LEN_STORE (vectp_out.14_88, 8B, { -1, ... }, _94, 0, vect_patt_49.13_86);
        82   │   vectp_op_1.7_80 = vectp_op_1.7_79 + _94;
        83   │   vectp_op_2.10_84 = vectp_op_2.10_83 + _94;
        84   │   vectp_out.14_89 = vectp_out.14_88 + _94;
        85   │   ivtmp_93 = ivtmp_92 - _94;
      
      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 matching pattern for vector signed SAT_SUB form 3.
      
      Signed-off-by: default avatarPan Li <pan2.li@intel.com>
      5920bc84
    • Pan Li's avatar
      RISC-V: Add testcases for form 2 of vector signed SAT_SUB · 72d24d2a
      Pan Li authored
      
      Form 2:
        #define DEF_VEC_SAT_S_SUB_FMT_2(T, UT, MIN, MAX)                     \
        void __attribute__((noinline))                                       \
        vec_sat_s_sub_##T##_fmt_2 (T *out, T *op_1, T *op_2, unsigned limit) \
        {                                                                    \
          unsigned i;                                                        \
          for (i = 0; i < limit; i++)                                        \
            {                                                                \
              T x = op_1[i];                                                 \
              T y = op_2[i];                                                 \
              T minus = (UT)x - (UT)y;                                       \
              out[i] = (x ^ y) >= 0 || (minus ^ x) >= 0                      \
                ? minus : x < 0 ? MIN : MAX;                                 \
            }                                                                \
        }
      
      DEF_VEC_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/rvv/autovec/vec_sat_arith.h: Add test helper macros.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-2-i16.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-2-i32.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-2-i64.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-2-i8.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-2-i16.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-2-i32.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-2-i64.c: New test.
      	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-2-i8.c: New test.
      
      Signed-off-by: default avatarPan Li <pan2.li@intel.com>
      72d24d2a
    • Richard Biener's avatar
      tree-optimization/116290 - fix compare-debug issue in ldist · 56674001
      Richard Biener authored
      Loop distribution does different analysis with -g0/-g due to counting
      a debug stmt starting a BB against a limit which will everntually
      lead to different IVOPTs choices.  I've fixed a possible IVOPTs
      issue on the way even though it doesn't make a difference here.
      
      	PR tree-optimization/116290
      	* tree-loop-distribution.cc (determine_reduction_stmt_1): PHIs
      	have no debug variants.  Start with first non-debug real stmt.
      	* tree-ssa-loop-ivopts.cc (find_givs_in_bb): Do not analyze
      	debug stmts.
      
      	* gcc.dg/pr116290.c: New testcase.
      56674001
    • Oleg Endo's avatar
      SH: Fix cost estimation of mem load/store · b717c462
      Oleg Endo authored
      
      For memory loads/stores (that contain a MEM rtx) sh_rtx_costs would wrongly
      report a cost lower than 1 insn which is not accurate as it makes loads/stores
      appear cheaper than simple arithmetic insns.  The cost of a load/store insn is
      at least 1 insn plus the cost of the address expression (some addressing modes
      can be considered more expensive than others due to additional constraints).
      
      gcc/ChangeLog:
      
      	PR target/113533
      	* config/sh/sh.cc (sh_rtx_costs): Adjust cost estimation of MEM rtx
      	to be always at least COST_N_INSNS (1).  Forward speed argument to
      	sh_address_cost.
      
      Co-authored-by: default avatarRoger Sayle <roger@nextmovesoftware.com>
      b717c462
    • Oleg Endo's avatar
      SH: Add -fno-math-errno to fsca,fsrra tests. · 7ec8b4bf
      Oleg Endo authored
      Without -fno-math-errno some of the test might fail because the expected insns
      will not be generated.
      
      gcc/testsuite/ChangeLog:
      	* gcc.target/sh/pr53512-1.c: Add -fno-math-errno option.
      	* gcc.target/sh/pr53512-2.c: Likewise.
      	* gcc.target/sh/pr53512-3.c: Likewise.
      	* gcc.target/sh/pr53512-4.c: Likewise.
      	* gcc.target/sh/pr54680.c: Likewise.
      7ec8b4bf
    • GCC Administrator's avatar
      Daily bump. · c21402eb
      GCC Administrator authored
      c21402eb
  2. Oct 13, 2024
    • Sam James's avatar
      libstdc++: testsuite: adjust name_fortify test for pre-defined _FORTIFY_SOURCE · 90a4851b
      Sam James authored
      Otherwise we get failures with toolchains that have _FORTIFY_SOURCE
      defined already to a different value like 3.
      
      libstdc++-v3/ChangeLog:
      
      	* testsuite/17_intro/names_fortify.cc: Undefine _FORTIFY_SOURCE.
      90a4851b
    • Jonathan Wakely's avatar
      libstdc++: Fix ranges::copy_backward for a single memcpyable element [PR117121] · 27f6b376
      Jonathan Wakely authored
      The result iterator needs to be decremented before writing to it.
      
      Improve the PR 108846 tests for all of std::copy, std::copy_n,
      std::copy_backward, and the std::ranges versions.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/117121
      	* include/bits/ranges_algobase.h (copy_backward): Decrement
      	output iterator before assigning one element through it.
      	* testsuite/25_algorithms/copy/108846.cc: Ensure the algorithm's
      	effects are correct for a single memcpyable element.
      	* testsuite/25_algorithms/copy_backward/108846.cc: Likewise.
      	* testsuite/25_algorithms/copy_n/108846.cc: Likewise.
      27f6b376
    • Josef Melcr's avatar
      MAINTAINERS: Add myself to write after approval · 2ef62aa1
      Josef Melcr authored
      
      ChangeLog:
      
      	* MAINTAINERS: Add myself to write after approval
      
      Signed-off-by: default avatarJosef Melcr <melcrjos@fit.cvut.cz>
      2ef62aa1
    • Simon Martin's avatar
    • Andreas Schwab's avatar
      m68k: replace reload_in_progress by reload_in_progress || lra_in_progress · f0f11559
      Andreas Schwab authored
      For now assume that LRA needs the same treatment as reload.
      
      	* config/m68k/m68k.md ("movsi", "movxf"): Replace
      	reload_in_progress by reload_in_progress || lra_in_progress.
      	* config/m68k/m68k.cc (m68k_legitimate_mem_p)
      	(emit_move_sequence): Likewise.
      	* config/m68k/predicates.md ("fp_src_operand"): Likewise.
      f0f11559
    • Richard Biener's avatar
      tree-optimization/116481 - avoid building function_type[] · 15060273
      Richard Biener authored
      The following avoids building an array type with function or method
      element type during diagnosing an array bound violation as this
      will result in an error, rejecting a program with a not too useful
      error message.  Instead build such array type manually.
      
      	PR tree-optimization/116481
      	* pointer-query.cc (build_printable_array_type):
      	Build an array types with function or method element type
      	manually to avoid bogus diagnostic.
      
      	* gcc.dg/pr116481.c: New testcase.
      15060273
    • Tobias Burnus's avatar
      Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' __builtin_is_initial_device · 3269a722
      Tobias Burnus authored
      It turned out that 'if (omp_is_initial_device() .eqv. true)' gave an ICE
      due to comparing 'int' with 'logical(4)'. When digging deeper, it also
      turned out that when the procedure pointer is needed, the builtin cannot
      be used, either.  (Follow up to r15-2799-gf1bfba3a9b3f31 )
      
      Extend the code to also use the builtin acc_on_device with OpenACC,
      which was previously only used in C/C++.  Additionally, fix folding
      when offloading is not enabled.
      
      Fixes additionally the BT_BOOL data type, which was 'char'/integer(1)
      instead of bool, backing the booleaness; use bool_type_node as the rest
      of GCC.
      
      gcc/fortran/ChangeLog:
      
      	* gfortran.h (gfc_option_t): Add disable_acc_on_device.
      	* options.cc (gfc_handle_option): Handle -fno-builtin-acc_on_device.
      	* trans-decl.cc (gfc_get_extern_function_decl): Move
      	__builtin_omp_is_initial_device handling to ...
      	* trans-expr.cc (get_builtin_fn): ... this new function.
      	(conv_function_val): Call it.
      	(update_builtin_function): New.
      	(gfc_conv_procedure_call): Call it.
      	* types.def (BT_BOOL): Fix type by using bool_type_node.
      
      gcc/ChangeLog:
      
      	* gimple-fold.cc (gimple_fold_builtin_acc_on_device): Also fold
      	when offloading is not configured.
      
      libgomp/ChangeLog:
      
      	* libgomp.texi (TR13): Fix minor typos.
      	(omp_is_initial_device): Improve wording.
      	(acc_on_device): Note how to disable the builtin.
      	* testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90: Remove TODO.
      	* testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f: Likewise.
      	Add -fno-builtin-acc_on_device.
      	* testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f: Likewise.
      	* testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c: Update
      	dg- as !offloading_enabled now compile-time expands acc_on_device.
      	* testsuite/libgomp.fortran/target-is-initial-device-3.f90: New test.
      	* testsuite/libgomp.oacc-fortran/acc_on_device-2.f90: New test.
      3269a722
    • Jivan Hakobyan's avatar
      [RISC-V] Avoid unnecessary extensions when value is already extended · c38385dd
      Jivan Hakobyan authored
      This is a minor patch from Jivan from roughly a year ago.  The basic
      idea here is similar to what we do when extending values for the sake of
      comparisons.  Specifically if the value is already known to be properly
      extended, then an extension is just a copy.
      
      The original idea was to use a similar patch, but which aborted to
      identify cases where these unnecessary promotions where emitted.  All
      that showed up when doing a testsuite run with that abort was the
      promotions created by the arithmetic with overflow patterns such as addv.
      
      Things like addv aren't *that* common so this never got high on my todo
      list, even after a minor issue in this space was raised in bugzilla.
      
      But with stage1 closing soon and no good reason not to go forward, I'm
      submitting this into the pre-commit tester now.  My tester has been
      using it since roughly Feb :-)  Plan would be to commit after the
      pre-commit tester renders its verdict.
      
      	* config/riscv/riscv.md (zero_extendsidi2): If RHS is already
      	zero extended, then this is just a copy.
      	(extendsidi2): Similarly, but for sign extension.
      c38385dd
    • GCC Administrator's avatar
      Daily bump. · f08af081
      GCC Administrator authored
      f08af081
  3. Oct 12, 2024
    • Thomas Koenig's avatar
      Unsigned constants for ISO_FORTRAN_ENV and ISO_C_BINDING. · d09131ee
      Thomas Koenig authored
      gcc/fortran/ChangeLog:
      
      	* dump-parse-tree.cc (get_c_type_name): Also handle BT_UNSIGNED.
      	* gfortran.h (NAMED_UINTCST): Define before inclusion
      	of iso-c-binding.def and iso-fortran-env.def.
      	(gfc_get_uint_kind_from_width_isofortranenv): Prototype.
      	* gfortran.texi: Mention new constants in iso_c_binding and
      	iso_fortran_env.
      	* iso-c-binding.def: Handle NAMED_UINTCST. Add c_unsigned,
      	c_unsigned_short,c_unsigned_char, c_unsigned_long,
      	c_unsigned_long_long, c_uintmax_t, c_uint8_t, c_uint16_t,
      	c_uint32_t, c_uint64_t, c_uint128_t, c_uint_least8_t,
      	c_uint_least16_t, c_uint_least32_t, c_uint_least64_t,
      	c_uint_least128_t, c_uint_fast8_t, c_uint_fast16_t,
      	c_uint_fast32_t, c_uint_fast64_t and c_uint_fast128_t.
      	* iso-fortran-env.def: Handle NAMED_UINTCST. Add uint8, uint16,
      	uint32 and uint64.
      	* module.cc (parse_integer): Whitespace fix.
      	(write_module): Whitespace fix.
      	(NAMED_UINTCST): Define before inclusion of iso-fortran-evn.def
      	and iso-fortran-env.def.
      	* symbol.cc: Likewise.
      	* trans-types.cc (get_unsigned_kind_from_node): New function.
      	(get_uint_kind_from_name): New function.
      	(gfc_get_uint_kind_from_width_isofortranenv): New function.
      	(get_uint_kind_from_width): New function.
      	(gfc_init_kinds): Initialize gfc_c_uint_kind.
      
      gcc/testsuite/ChangeLog:
      
      	* gfortran.dg/unsigned_36.f90: New test.
      d09131ee
    • Feng Xue's avatar
      vect: Fix inconsistency in fully-masked lane-reducing op generation [PR116985] · a9173a50
      Feng Xue authored
      To align vectorized def/use when lane-reducing op is present in loop reduction,
      we may need to insert extra trivial pass-through copies, which would cause
      mismatch between lane-reducing vector copy and loop mask index. This could be
      fixed by computing the right index around a new counter on effective lane-
      reducing vector copies.
      
      2024-10-11 Feng Xue <fxue@os.amperecomputing.com>
      
      gcc/
      	PR tree-optimization/116985
      	* tree-vect-loop.cc (vect_transform_reduction): Compute loop mask
      	index based on effective vector copies for reduction op.
      
      gcc/testsuite/
      	PR tree-optimization/116985
      	* gcc.dg/vect/pr116985.c: New testcase.
      a9173a50
    • Richard Biener's avatar
      tree-optimization/117104 - add missed guards to max(a,b) != a simplification · f54d42e0
      Richard Biener authored
      For vector types we have to make sure the comparison result is a vector
      type and the resulting compare operation is supported.  As the resulting
      compare is never an equality compare I didn't bother to check for the
      cbranch case.
      
      	PR tree-optimization/117104
      	* match.pd ((cmp:c (minmax:c @0 @1) @0) -> (out @0 @1)): Properly
      	guard the vector case.
      
      	* gcc.dg/pr117104.c: New testcase.
      f54d42e0
    • Jeff Law's avatar
      RISC-V] Slightly improve broadcasting small constants into vectors · ba773a86
      Jeff Law authored
      I probably spent way more time on this than it's worth...
      
      I was looking at the code we generate for vector SAD and noticed that we were
      being a bit silly.  Specifically:
      
              li      a4,0            # 272   [c=4 l=4]  *movsi_internal/1
      
      Followed shortly by:
      
              vmv.s.x v3,a4   # 261   [c=4 l=4]  *pred_broadcastrvvm1si/6
      
      And no other uses of a4.  We could have used x0 trivially.
      
      First we adjust the expander so that it doesn't force the constant into a
      register.  In the matching pattern we change the appropriate source constraints
      from "r" to "rJ" and the output template is changed to use %z for the operand.
      The net is we drop the li completely and emit vmv.s.x,v3,x0.
      
      But wait, there's more.  If we're broadcasting a constant in the range
      [-16..15] into a vector, we currently load the constant into a register and use
      vmv.v.r.  We can instead use vmv.v.i, which avoids loading the constant into a
      GPR.  For that case we again avoid forcing the constant into a register in the
      expander and adjust the output template to emit vmv.v.x or vmv.v.i based on
      whether or not the appropriate operand is a constant or general purpose
      register.  So again, we'll drop a load immediate into a scalar for this case.
      
      Whether or not we should use vmv.v.i vs vmv.s.x for loading [-16..15] into the
      0th element is probably uarch dependent.  The tradeoff is loading the GPR vs
      the broadcast in the vector unit.  I didn't bother with this case.
      
      Tested in my tester (which tests rv64gcv as a default codegen option). Will
      wait for the pre-commit tester to render a verdict.
      
      gcc/
      	* config/riscv/constraints.md (P): New constraint.
      	* config/riscv/vector.md (pred_broadcast<mode> expander): Do
      	not force small integers into GPRs so aggressively.
      	(pred_broadcast<mode> insn & splitter): Allow splatting small
      	constants across the vector register directly.  Allow splatting
      	(const_int 0) into element 0 directly.
      ba773a86
    • Tobias Burnus's avatar
      Fortran/OpenMP: Warn when mapping polymorphic variables · 34b77d1b
      Tobias Burnus authored
      OpenMP (TR13) states for Fortran:
      * For map: "If a list item has polymorphic type, the behavior is unspecified."
      * "If the firstprivate clause is on a target construct and a variable is of
        polymorphic type, the behavior is unspecified."
      which this commit now warns for.
      
      gcc/fortran/ChangeLog:
      
      	* openmp.cc (resolve_omp_clauses): Diagnose polymorphic mapping.
      	* trans-openmp.cc (gfc_omp_finish_clause): Warn when
      	polymorphic variable is implicitly mapped.
      
      gcc/testsuite/ChangeLog:
      
      	* gfortran.dg/gomp/polymorphic-mapping.f90: New test.
      	* gfortran.dg/gomp/polymorphic-mapping-2.f90: New test.
      34b77d1b
    • Jakub Jelinek's avatar
      bootstrap: Fix genmatch build where system gcc defaults to -fPIE -pie · 5cf85a2f
      Jakub Jelinek authored
      Seems our buildbot is unhappy about my latest commit to link genmatch with
      libcommon.a in order to support gcc_diag diagnostics in libcpp.
      
      We have in gcc/configure.ac:
      if test x$enable_host_shared = xyes; then
        PICFLAG=-fPIC
      elif test x$enable_host_pie = xyes; then
        PICFLAG=-fPIE
      elif test x$gcc_cv_c_no_fpie = xyes; then
        PICFLAG=-fno-PIE
      else
        PICFLAG=
      fi
      
      if test x$enable_host_pie = xyes; then
        LD_PICFLAG=-pie
      elif test x$gcc_cv_no_pie = xyes; then
        LD_PICFLAG=-no-pie
      else
        LD_PICFLAG=
      fi
      
      if test x$enable_host_bind_now = xyes; then
        LD_PICFLAG="$LD_PICFLAG -Wl,-z,now"
      fi
      
      Now, for object files linked into cc1, cc1plus, xgcc etc. we carefully
      arrange for them to be compiled with $(PICFLAG) and do the link with
      $(LD_PICFLAG).
      For the generator programs, we don't do anything like that, we simply
      compile their objects without $(PICFLAG) and link without $(LD_PICFLAG).
      It isn't that big deal, the generator programs runs once or a couple of
      times during the build and that is it, we don't ship them and don't
      care much if they are PIE or not.
      Except that after my changes to link in libcommon.a into build/genmatch,
      we now link -fno-PIE compiled objects into a binary which is linked with
      default flags.  Our distro compiler just links a normal executable and
      everything works fine (-fPIE/-pie is added through spec file snippet and
      just added in rpm default flags), but seems the buildbot system gcc
      defaults to -fPIE -pie instead and so building build/genmatch fails.
      
      The following patch is a minimal fix for that, just add -no-pie when
      linking build/genmatch, but don't add -pie.
      
      If we wanted to start building even the build/gen* tools with $(PICFLAG)
      and $(LD_PICFLAG), that would be much larger change.
      
      2024-10-12  Jakub Jelinek  <jakub@redhat.com>
      
      	* Makefile.in (LINKER_FOR_BUILD): Append -no-pie if it is in
      	$(LD_PICFLAG) when building build/genmatch.
      5cf85a2f
    • H.J. Lu's avatar
      gcc.target/i386/pr55583.c: Use long long for 64-bit integer · c1034d71
      H.J. Lu authored
      
      Since long is 32-bit for x32, use long long for 64-bit integer.
      
      	* gcc.target/i386/pr55583.c: Use long long for 64-bit integer.
      
      Signed-off-by: default avatarH.J. Lu <hjl.tools@gmail.com>
      c1034d71
    • H.J. Lu's avatar
      gcc.target/i386/pr115749.c: Use word_mode integer · 80d0e108
      H.J. Lu authored
      
      Use word_mode integer with func so that 64-bit integer is used with
      x32.
      
      	* gcc.target/i386/pr115749.c (uword): New.
      	(func): Replace unsigned long with uword.
      
      Signed-off-by: default avatarH.J. Lu <hjl.tools@gmail.com>
      80d0e108
    • H.J. Lu's avatar
      gcc.target/i386/invariant-ternlog-1.c: Also scan (%edx) · a4ce8681
      H.J. Lu authored
      
      Since x32 uses (%edx), instead of (%rdx), also scan (%edx).
      
      	* gcc.target/i386/invariant-ternlog-1.c: Also scan (%edx).
      
      Signed-off-by: default avatarH.J. Lu <hjl.tools@gmail.com>
      a4ce8681
    • Jakub Jelinek's avatar
      libcpp, genmatch: Use gcc_diag instead of printf for libcpp diagnostics · c397a8c1
      Jakub Jelinek authored
      When working on #embed support, or -Wheader-guard or other recent libcpp
      changes, I've been annoyed by the libcpp diagnostics being visually
      different from normal gcc diagnostics, especially in the area of quoting
      stuff in the diagnostic messages.
      Normall GCC diagnostics is gcc_diag/gcc_tdiag, one can use
      %</%>, %qs etc. in there, while libcpp diagnostics was marked as printf
      and in libcpp we've been very creative with quoting stuff, either
      no quotes at all, or "something" quoting, or 'something' quoting, or
      `something' quoting (but in none of the cases it used colors consistently
      with the rest of the compiler).
      
      Now, libcpp diagnostics is always emitted using a callback,
      pfile->cb.diagnostic.  On the gcc/ side, this callback is initialized with
      genmatch.cc:  cb->diagnostic = diagnostic_cb;
      c-family/c-opts.cc:  cb->diagnostic = c_cpp_diagnostic;
      fortran/cpp.cc:  cb->diagnostic = cb_cpp_diagnostic;
      where the latter two just use diagnostic_report_diagnostic, so actually
      support all the gcc_diag stuff, only the genmatch.cc case didn't.
      
      So, the following patch changes genmatch.cc to use pp_format* instead
      of vfprintf so that it supports the gcc_diag formatting (pretty-print.o
      unfortunately has various dependencies, so had to link genmatch with
      libcommon.a libbacktrace.a and tweak Makefile.in so that there are no
      circular dependencies) and marks the libcpp diagnostic routines as
      gcc_diag rather than printf.  That change resulted in hundreds of
      -Wformat-diag new warnings (most of them useful and resulting IMHO in
      better diagnostics), so the rest of the patch is changing the format
      strings to make -Wformat-diag happy and adjusting the testsuite for
      the differences in how is the diagnostic reformatted.
      
      Dunno if some out of GCC tree projects use libcpp, that case would
      make it harder because one couldn't use vfprintf in the diagnostic
      callback anymore, but there is always David's libdiagnostic which could
      be used for that purpose IMHO.
      
      2024-10-12  Jakub Jelinek  <jakub@redhat.com>
      
      libcpp/
      	* include/cpplib.h (ATTRIBUTE_CPP_PPDIAG): Define.
      	(struct cpp_callbacks): Use ATTRIBUTE_CPP_PPDIAG instead of
      	ATTRIBUTE_FPTR_PRINTF on diagnostic callback.
      	(cpp_error, cpp_warning, cpp_pedwarning, cpp_warning_syshdr): Use
      	ATTRIBUTE_CPP_PPDIAG (3, 4) instead of ATTRIBUTE_PRINTF_3.
      	(cpp_warning_at, cpp_pedwarning_at): Use ATTRIBUTE_CPP_PPDIAG (4, 5)
      	instead of ATTRIBUTE_PRINTF_4.
      	(cpp_error_with_line, cpp_warning_with_line, cpp_pedwarning_with_line,
      	cpp_warning_with_line_syshdr): Use ATTRIBUTE_CPP_PPDIAG (5, 6)
      	instead of ATTRIBUTE_PRINTF_5.
      	(cpp_error_at): Use ATTRIBUTE_CPP_PPDIAG (4, 5) instead of
      	ATTRIBUTE_PRINTF_4.
      	* Makefile.in (po/$(PACKAGE).pot): Use --language=GCC-source rather
      	than --language=c.
      	* errors.cc (cpp_diagnostic_at, cpp_diagnostic,
      	cpp_diagnostic_with_line): Use ATTRIBUTE_CPP_PPDIAG instead of
      	-ATTRIBUTE_FPTR_PRINTF.
      	* charset.cc (cpp_host_to_exec_charset, _cpp_valid_ucn, convert_hex,
      	convert_oct, convert_escape): Fix up -Wformat-diag warnings.
      	(cpp_interpret_string_ranges, count_source_chars): Use
      	ATTRIBUTE_CPP_PPDIAG instead of ATTRIBUTE_FPTR_PRINTF.
      	(narrow_str_to_charconst): Fix up -Wformat-diag warnings.
      	* directives.cc (check_eol_1, directive_diagnostics, lex_macro_node,
      	do_undef, glue_header_name, parse_include, do_include_common,
      	do_include_next, _cpp_parse_embed_params, do_embed, read_flag,
      	do_line, do_linemarker, register_pragma_1, do_pragma_once,
      	do_pragma_push_macro, do_pragma_pop_macro, do_pragma_poison,
      	do_pragma_system_header, do_pragma_warning_or_error, _cpp_do__Pragma,
      	do_else, do_elif, do_endif, parse_answer, do_assert,
      	cpp_define_unused): Likewise.
      	* expr.cc (cpp_classify_number, parse_defined, eval_token,
      	_cpp_parse_expr, reduce, check_promotion): Likewise.
      	* files.cc (_cpp_find_file, finish_base64_embed,
      	_cpp_pop_file_buffer): Likewise.
      	* init.cc (sanity_checks): Likewise.
      	* lex.cc (_cpp_process_line_notes, maybe_warn_bidi_on_char,
      	_cpp_warn_invalid_utf8, _cpp_skip_block_comment,
      	warn_about_normalization, forms_identifier_p, maybe_va_opt_error,
      	identifier_diagnostics_on_lex, cpp_maybe_module_directive): Likewise.
      	* macro.cc (class vaopt_state, builtin_has_include_1,
      	builtin_has_include, builtin_has_embed, _cpp_warn_if_unused_macro,
      	_cpp_builtin_macro_text, builtin_macro, stringify_arg,
      	_cpp_arguments_ok, collect_args, enter_macro_context,
      	_cpp_save_parameter, parse_params, create_iso_definition,
      	_cpp_create_definition, check_trad_stringification): Likewise.
      	* pch.cc (cpp_valid_state): Likewise.
      	* traditional.cc (_cpp_scan_out_logical_line, recursive_macro):
      	Likewise.
      gcc/
      	* Makefile.in (generated_files): Remove {gimple,generic}-match*.
      	(generated_match_files): New variable.  Add a dependency of
      	$(filter-out $(OBJS-libcommon),$(ALL_HOST_OBJS)) files on those.
      	(build/genmatch$(build_exeext)): Depend on and link against
      	libcommon.a and $(LIBBACKTRACE).
      	* genmatch.cc: Include pretty-print.h and input.h.
      	(ggc_internal_cleared_alloc, ggc_free): Remove.
      	(fatal): New function.
      	(line_table): Remove.
      	(linemap_client_expand_location_to_spelling_point): Remove.
      	(diagnostic_cb): Use gcc_diag rather than printf format.  Use
      	pp_format_verbatim on a temporary pretty_printer instead of
      	vfprintf.
      	(fatal_at, warning_at): Use gcc_diag rather than printf format.
      	(output_line_directive): Rename location_hash to loc_hash.
      	(parser::eat_ident, parser::parse_operation, parser::parse_expr,
      	parser::parse_pattern, parser::finish_match_operand): Fix up
      	-Wformat-diag warnings.
      gcc/c-family/
      	* c-lex.cc (c_common_has_attribute,
      	c_common_lex_availability_macro): Fix up -Wformat-diag warnings.
      gcc/testsuite/
      	* c-c++-common/cpp/counter-2.c: Adjust expected diagnostics for
      	libcpp diagnostic formatting changes.
      	* c-c++-common/cpp/embed-3.c: Likewise.
      	* c-c++-common/cpp/embed-4.c: Likewise.
      	* c-c++-common/cpp/embed-16.c: Likewise.
      	* c-c++-common/cpp/embed-18.c: Likewise.
      	* c-c++-common/cpp/eof-2.c: Likewise.
      	* c-c++-common/cpp/eof-3.c: Likewise.
      	* c-c++-common/cpp/fmax-include-depth.c: Likewise.
      	* c-c++-common/cpp/has-builtin.c: Likewise.
      	* c-c++-common/cpp/line-2.c: Likewise.
      	* c-c++-common/cpp/line-3.c: Likewise.
      	* c-c++-common/cpp/macro-arg-count-1.c: Likewise.
      	* c-c++-common/cpp/macro-arg-count-2.c: Likewise.
      	* c-c++-common/cpp/macro-ranges.c: Likewise.
      	* c-c++-common/cpp/named-universal-char-escape-4.c: Likewise.
      	* c-c++-common/cpp/named-universal-char-escape-5.c: Likewise.
      	* c-c++-common/cpp/pr88974.c: Likewise.
      	* c-c++-common/cpp/va-opt-error.c: Likewise.
      	* c-c++-common/cpp/va-opt-pedantic.c: Likewise.
      	* c-c++-common/cpp/Wheader-guard-2.c: Likewise.
      	* c-c++-common/cpp/Wheader-guard-3.c: Likewise.
      	* c-c++-common/cpp/Winvalid-utf8-1.c: Likewise.
      	* c-c++-common/cpp/Winvalid-utf8-2.c: Likewise.
      	* c-c++-common/cpp/Winvalid-utf8-3.c: Likewise.
      	* c-c++-common/diagnostic-format-sarif-file-bad-utf8-pr109098-1.c:
      	Likewise.
      	* c-c++-common/diagnostic-format-sarif-file-bad-utf8-pr109098-3.c:
      	Likewise.
      	* c-c++-common/pr68833-3.c: Likewise.
      	* c-c++-common/raw-string-directive-1.c: Likewise.
      	* gcc.dg/analyzer/named-constants-Wunused-macros.c: Likewise.
      	* gcc.dg/binary-constants-4.c: Likewise.
      	* gcc.dg/builtin-redefine.c: Likewise.
      	* gcc.dg/cpp/19951025-1.c: Likewise.
      	* gcc.dg/cpp/c11-warning-1.c: Likewise.
      	* gcc.dg/cpp/c11-warning-2.c: Likewise.
      	* gcc.dg/cpp/c11-warning-3.c: Likewise.
      	* gcc.dg/cpp/c23-elifdef-2.c: Likewise.
      	* gcc.dg/cpp/c23-warning-2.c: Likewise.
      	* gcc.dg/cpp/embed-2.c: Likewise.
      	* gcc.dg/cpp/embed-3.c: Likewise.
      	* gcc.dg/cpp/embed-4.c: Likewise.
      	* gcc.dg/cpp/expr.c: Likewise.
      	* gcc.dg/cpp/gnu11-elifdef-2.c: Likewise.
      	* gcc.dg/cpp/gnu11-elifdef-3.c: Likewise.
      	* gcc.dg/cpp/gnu11-elifdef-4.c: Likewise.
      	* gcc.dg/cpp/gnu11-warning-1.c: Likewise.
      	* gcc.dg/cpp/gnu11-warning-2.c: Likewise.
      	* gcc.dg/cpp/gnu11-warning-3.c: Likewise.
      	* gcc.dg/cpp/gnu23-warning-2.c: Likewise.
      	* gcc.dg/cpp/include6.c: Likewise.
      	* gcc.dg/cpp/pr35322.c: Likewise.
      	* gcc.dg/cpp/tr-warn6.c: Likewise.
      	* gcc.dg/cpp/undef2.c: Likewise.
      	* gcc.dg/cpp/warn-comments.c: Likewise.
      	* gcc.dg/cpp/warn-comments-2.c: Likewise.
      	* gcc.dg/cpp/warn-comments-3.c: Likewise.
      	* gcc.dg/cpp/warn-cxx-compat.c: Likewise.
      	* gcc.dg/cpp/warn-cxx-compat-2.c: Likewise.
      	* gcc.dg/cpp/warn-deprecated.c: Likewise.
      	* gcc.dg/cpp/warn-deprecated-2.c: Likewise.
      	* gcc.dg/cpp/warn-long-long.c: Likewise.
      	* gcc.dg/cpp/warn-long-long-2.c: Likewise.
      	* gcc.dg/cpp/warn-normalized-1.c: Likewise.
      	* gcc.dg/cpp/warn-normalized-2.c: Likewise.
      	* gcc.dg/cpp/warn-normalized-3.c: Likewise.
      	* gcc.dg/cpp/warn-normalized-4-bytes.c: Likewise.
      	* gcc.dg/cpp/warn-normalized-4-unicode.c: Likewise.
      	* gcc.dg/cpp/warn-redefined.c: Likewise.
      	* gcc.dg/cpp/warn-redefined-2.c: Likewise.
      	* gcc.dg/cpp/warn-traditional.c: Likewise.
      	* gcc.dg/cpp/warn-traditional-2.c: Likewise.
      	* gcc.dg/cpp/warn-trigraphs-1.c: Likewise.
      	* gcc.dg/cpp/warn-trigraphs-2.c: Likewise.
      	* gcc.dg/cpp/warn-trigraphs-3.c: Likewise.
      	* gcc.dg/cpp/warn-trigraphs-4.c: Likewise.
      	* gcc.dg/cpp/warn-undef.c: Likewise.
      	* gcc.dg/cpp/warn-undef-2.c: Likewise.
      	* gcc.dg/cpp/warn-unused-macros.c: Likewise.
      	* gcc.dg/cpp/warn-unused-macros-2.c: Likewise.
      	* gcc.dg/pch/counter-2.c: Likewise.
      	* g++.dg/cpp0x/udlit-error1.C: Likewise.
      	* g++.dg/cpp23/named-universal-char-escape1.C: Likewise.
      	* g++.dg/cpp23/named-universal-char-escape2.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-1.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-2.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-3.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-4.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-5.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-6.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-7.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-8.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-9.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-10.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-11.C: Likewise.
      	* g++.dg/cpp23/Winvalid-utf8-12.C: Likewise.
      	* g++.dg/cpp/elifdef-3.C: Likewise.
      	* g++.dg/cpp/elifdef-5.C: Likewise.
      	* g++.dg/cpp/elifdef-6.C: Likewise.
      	* g++.dg/cpp/elifdef-7.C: Likewise.
      	* g++.dg/cpp/embed-1.C: Likewise.
      	* g++.dg/cpp/embed-2.C: Likewise.
      	* g++.dg/cpp/pedantic-errors.C: Likewise.
      	* g++.dg/cpp/warning-1.C: Likewise.
      	* g++.dg/cpp/warning-2.C: Likewise.
      	* g++.dg/ext/bitint1.C: Likewise.
      	* g++.dg/ext/bitint2.C: Likewise.
      c397a8c1
Loading