Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LoongArch: Add vector calling convention support #113

Open
wants to merge 7,633 commits into
base: dev/vecarg
Choose a base branch
from

Conversation

ChenghuiPan
Copy link

This patch adds Proof-of-Concept LoongArch vector calling convention support, and can be enabled by __attribute__ ((vecarg)) or -mvecarg option. The details and discussion can be found at Github loongson/gcc repo's issue list.

rguenth and others added 26 commits October 11, 2024 15:11
It turns out target costing code looks at STMT_VINFO_MEMORY_ACCESS_TYPE
to identify operations from (emulated) gathers for example.  This
doesn't work for SLP loads since we do not set STMT_VINFO_MEMORY_ACCESS_TYPE
there as the vectorization strathegy might differ between different
stmt uses.  It seems we got away with setting it for stores though.
The following adds a memory_access_type field to slp_tree and sets it
from load and store vectorization code.  All the costing doesn't record
the SLP node (that was only done selectively for some corner case).  The
costing is really in need of a big overhaul, the following just massages
the two relevant ops to fix gcc.dg/target/pr88531-2[bc].c FAILs when
switching on SLP for non-grouped stores.  In particular currently
we either have a SLP node or a stmt_info in the cost hook but not both.

So the following mitigates this, postponing a rewrite of costing to
next stage1.  Other targets look possibly affected as well but are
left to respective maintainers to update.

	PR tree-optimization/117080
	* tree-vectorizer.h (_slp_tree::memory_access_type): Add.
	(SLP_TREE_MEMORY_ACCESS_TYPE): New.
	(record_stmt_cost): Add another overload.
	* tree-vect-slp.cc (_slp_tree::_slp_tree): Initialize
	memory_access_type.
	* tree-vect-stmts.cc (vectorizable_store): Set
	SLP_TREE_MEMORY_ACCESS_TYPE.
	(vectorizable_load): Likewise.  Also record the SLP node
	when costing emulated gather offset decompose and vector
	composition.
	* config/i386/i386.cc (ix86_vector_costs::add_stmt_cost): Also
	recognize SLP emulated gather/scatter.
libstdc++-v3/ChangeLog:

	* testsuite/22_locale/time_get/get/char/5.cc: Fix dg-do
	directive.
	* testsuite/22_locale/time_get/get/wchar_t/5.cc: Likewise.
When formatting a time point with %c we call std::vformat_to using the
formatting locale's D_T_FMT string, but we weren't adding the L option
to the format string. This meant we always interpreted D_T_FMT in the C
locale, instead of using the formatting locale as obviously intended
when %c is used.

libstdc++-v3/ChangeLog:

	PR libstdc++/117085
	* include/bits/chrono_io.h (__formatter_chrono::_M_c): Add L
	option to format string.
	* testsuite/std/time/format.cc: Move to...
	* testsuite/std/time/format/format.cc: ...here.
	* testsuite/std/time/format_localized.cc: Move to...
	* testsuite/std/time/format/localized.cc: ...here.
	* testsuite/std/time/format/pr117085.cc: New test.
libstdc++-v3/ChangeLog:

	* include/bits/cpp_type_traits.h (__is_byte<byte>): Guard with
	__glibcxx_byte macro instead of checking __cplusplus.
This patch implements 4 rules for logarithmic identities in match.pd
under -funsafe-math-optimizations:
1) logN(1.0/a) -> -logN(a). This avoids the division instruction.
2) logN(C/a) -> logN(C) - logN(a), where C is a real constant. Same as 1).
3) logN(a) + logN(b) -> logN(a*b). This reduces the number of calls to
log function.
4) logN(a) - logN(b) -> logN(a/b). Same as 4).
Tests were added for float, double, and long double.

The patch was bootstrapped and regtested on aarch64-linux-gnu and
x86_64-linux-gnu, no regression.
Additionally, SPEC 2017 fprate was run. While the transform does not seem
to be triggered, we also see no non-noise impact on performance.
OK for mainline?

Signed-off-by: Jennifer Schmitz <[email protected]>

gcc/
	PR tree-optimization/116826
	PR tree-optimization/86710
	* match.pd: Fold logN(1.0/a) -> -logN(a),
	logN(C/a) -> logN(C) - logN(a),	logN(a) + logN(b) -> logN(a*b),
	and logN(a) - logN(b) -> logN(a/b).

gcc/testsuite/
	PR tree-optimization/116826
	PR tree-optimization/86710
	* gcc.dg/tree-ssa/log_ident.c: New test.
This patch removes a large number of unused static functions from error.cc,
which previously were used for diagnostic but have been replaced by the common
diagnostic code.

gcc/fortran/ChangeLog:

	* error.cc (error_char, error_string, error_uinteger, error_integer,
	error_hwuint, error_hwint, gfc_widechar_display_length,
	gfc_wide_display_length, error_printf, show_locus, show_loci):
	Remove unused static functions.
	(IBUF_LEN, MAX_ARGS): Remove now unused #define.
…sformation to vector operands

In the testcase from patch [2/2] we want to match a vector rotate operate from
an IOR of left and right shifts by immediate.  simplify-rtx has code for just
that but it looks like it's prepared to do handle only scalar operands.
In practice most of the code works for vector modes as well except the shift
amounts are checked to be CONST_INT rather than vector constants that we have
here.  This is easily extended by using unwrap_const_vec_duplicate to extract
the repeating constant shift amount.  With this change combine now tries
matching the simpler and expected:
(set (reg:V2DI 119 [ _14 ])
    (rotate:V2DI (xor:V2DI (reg:V2DI 114 [ vect__1.12_16 ])
            (reg:V2DI 116 [ *m1_01_8(D) ]))
        (const_vector:V2DI [
                (const_int 32 [0x20]) repeated x2
            ])))
instead of the previous:
(set (reg:V2DI 119 [ _14 ])
    (ior:V2DI (ashift:V2DI (xor:V2DI (reg:V2DI 114 [ vect__1.12_16 ])
                (reg:V2DI 116 [ *m1_01_8(D) ]))
            (const_vector:V2DI [
                    (const_int 32 [0x20]) repeated x2
                ]))
        (lshiftrt:V2DI (xor:V2DI (reg:V2DI 114 [ vect__1.12_16 ])
                (reg:V2DI 116 [ *m1_01_8(D) ]))
            (const_vector:V2DI [
                    (const_int 32 [0x20]) repeated x2
                ]))))

To actually fix the PR the aarch64 backend needs some adjustment as well
which is done in patch [2/2], which adds the testcase as well.

Bootstrapped and tested on aarch64-none-linux-gnu.

Signed-off-by: Kyrylo Tkachov <[email protected]>

	PR target/117048
	* simplify-rtx.cc (simplify_context::simplify_binary_operation_1):
	Handle vector constants in (x << C1) | (x >> C2) -> ROTATE
	simplification.
…y representation for XAR instruction

The pattern for the Advanced SIMD XAR instruction isn't very
optimization-friendly at the moment.
In the testcase from the PR once simlify-rtx has done its work it
generates the RTL:
(set (reg:V2DI 119 [ _14 ])
    (rotate:V2DI (xor:V2DI (reg:V2DI 114 [ vect__1.12_16 ])
            (reg:V2DI 116 [ *m1_01_8(D) ]))
        (const_vector:V2DI [
                (const_int 32 [0x20]) repeated x2
            ])))

which fails to match our XAR pattern because the pattern expects:
1) A ROTATERT instead of the ROTATE.  However, according to the RTL ops
documentation the preferred form of rotate-by-immediate is ROTATE, which
I take to mean it's the canonical form.
ROTATE (x, C) <-> ROTATERT (x, MODE_WIDTH - C) so it's better to match just
one canonical representation.
2) A CONST_INT shift amount whereas the midend asks for a repeated vector
constant.

These issues are fixed by introducing a dedicated expander for the
aarch64_xarqv2di name, needed by the arm_neon.h intrinsic, that translate
the intrinsic-level CONST_INT immediate (the right-rotate amount) into
a repeated vector constant subtracted from 64 to give the corresponding
left-rotate amount that is fed to the new representation for the XAR
define_insn that uses the ROTATE RTL code.  This is a similar approach
to have we handle the discrepancy between intrinsic-level and RTL-level
vector lane numbers for big-endian.

With this patch and [1/2] the arithmetic parts of the testcase now simplify
to just one XAR instruction.

Bootstrapped and tested on aarch64-none-linux-gnu.

Signed-off-by: Kyrylo Tkachov <[email protected]>

gcc/
	PR target/117048
	* config/aarch64/aarch64-simd.md (aarch64_xarqv2di): Redefine into a
	define_expand.
	(*aarch64_xarqv2di_insn): Define.

gcc/testsuite/
	PR target/117048
	* g++.target/aarch64/pr117048.C: New test.
The __niter_base(move_iterator<I>) overload and __is_move_iterator trait
were originally immediately after the definition of move_iterator. The
addition of C++20 features after move_iterator meant that those helpers
were no longer anywhere near move_iterator.

This change puts them back where they used to be, before all the new
C++20 additions.

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (__niter_base(move_iterator<I>))
	(__is_move_iterator, __miter_base, _GLIBCXX_MAKE_MOVE_ITERATOR)
	(_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR): Move earlier in the
	file.
gcc/ada/
	PR ada/116498
	PR ada/117087
	* gcc-interface/decl.cc (validate_size): Fix thinko.
Since -mcmodel=large is valid only for lp64, run pr115407.c only for
lp64.

	* gcc.target/i386/pr115407.c: Only run for lp64.

Signed-off-by: H.J. Lu <[email protected]>
Since -mabi=ms isn't supported for x32, skip g++.target/i386/pr105953.C
for x32.

	* g++.target/i386/pr105953.C: Skip for x32.

Signed-off-by: H.J. Lu <[email protected]>
Since long is 64-bit for x32, replace long with long long for x32.

	* gcc.target/i386/bmi2-pr112526.c: Replace long with long long.
	* gcc.target/i386/pr105854.c: Likewise.
	* gcc.target/i386/pr112943.c: Likewise.
	* gcc.target/i386/pr67325.c: Likewise.
	* gcc.target/i386/pr97971.c: Likewise.

Signed-off-by: H.J. Lu <[email protected]>
This patch creates an unsigned "standard" for the
gfc_option.allow_std field.

One of the main reason why people want UNSIGNED for Fortran is
interfacing for C.

This is a preparation for further work on the ISO_C_BINDING constants.
That, we do via iso-c-binding.def , whose last field is a standard
for the constant to be defined for the standard in question, which is
then checked.  I could try and invent a different method for this,
but I'd rather not.

gcc/fortran/ChangeLog:

	* intrinsic.cc (add_functions): Convert uint and
	selected_unsigned_kind to GFC_STD_UNSIGNED.
	(gfc_check_intrinsic_standard): Handle GFC_STD_UNSIGNED.
	* libgfortran.h (GFC_STD_UNSIGNED): Add.
	* options.cc (gfc_post_options): Set GFC_STD_UNSIGNED
	if -funsigned is set.
This patch would like to support the form 1 of the vector signed
integer SAT_SUB.  Aka below example:

Form 1:
  #define DEF_VEC_SAT_S_SUB_FMT_1(T, UT, MIN, MAX)                     \
  void __attribute__((noinline))                                       \
  vec_sat_s_add_##T##_fmt_1 (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                                                      \
          : (minus ^ x) >= 0                                           \
            ? minus                                                    \
            : x < 0 ? MIN : MAX;                                       \
      }                                                                \
  }

DEF_VEC_SAT_S_SUB_FMT_1(int8_t, uint8_t, INT8_MIN, INT8_MAX)

Before this patch:
  91   │   _108 = .SELECT_VL (ivtmp_106, POLY_INT_CST [16, 16]);
  92   │   vect_x_16.11_80 = .MASK_LEN_LOAD (vectp_op_1.9_78, 8B, { -1, ... }, _108, 0);
  93   │   _69 = vect_x_16.11_80 >> 7;
  94   │   vect_x.12_81 = VIEW_CONVERT_EXPR<vector([16,16]) unsigned char>(vect_x_16.11_80);
  95   │   vect_y_18.15_85 = .MASK_LEN_LOAD (vectp_op_2.13_83, 8B, { -1, ... }, _108, 0);
  96   │   vect__7.21_91 = vect_x_16.11_80 ^ vect_y_18.15_85;
  97   │   mask__44.22_92 = vect__7.21_91 < { 0, ... };
  98   │   vect_y.16_86 = VIEW_CONVERT_EXPR<vector([16,16]) unsigned char>(vect_y_18.15_85);
  99   │   vect__6.17_87 = vect_x.12_81 - vect_y.16_86;
 100   │   vect_minus_19.18_88 = VIEW_CONVERT_EXPR<vector([16,16]) signed char>(vect__6.17_87);
 101   │   vect__8.19_89 = vect_x_16.11_80 ^ vect_minus_19.18_88;
 102   │   mask__42.20_90 = vect__8.19_89 < { 0, ... };
 103   │   mask__41.23_93 = mask__42.20_90 & mask__44.22_92;
 104   │   _4 = .COND_XOR (mask__41.23_93, _69, { 127, ... }, vect_minus_19.18_88);
 105   │   .MASK_LEN_STORE (vectp_out.31_102, 8B, { -1, ... }, _108, 0, _4);
 106   │   vectp_op_1.9_79 = vectp_op_1.9_78 + _108;
 107   │   vectp_op_2.13_84 = vectp_op_2.13_83 + _108;
 108   │   vectp_out.31_103 = vectp_out.31_102 + _108;
 109   │   ivtmp_107 = ivtmp_106 - _108;

After this patch:
  81   │   _102 = .SELECT_VL (ivtmp_100, POLY_INT_CST [16, 16]);
  82   │   vect_x_16.11_89 = .MASK_LEN_LOAD (vectp_op_1.9_87, 8B, { -1, ... }, _102, 0);
  83   │   vect_y_18.14_93 = .MASK_LEN_LOAD (vectp_op_2.12_91, 8B, { -1, ... }, _102, 0);
  84   │   vect_patt_38.15_94 = .SAT_SUB (vect_x_16.11_89, vect_y_18.14_93);
  85   │   .MASK_LEN_STORE (vectp_out.16_96, 8B, { -1, ... }, _102, 0, vect_patt_38.15_94);
  86   │   vectp_op_1.9_88 = vectp_op_1.9_87 + _102;
  87   │   vectp_op_2.12_92 = vectp_op_2.12_91 + _102;
  88   │   vectp_out.16_97 = vectp_out.16_96 + _102;
  89   │   ivtmp_101 = ivtmp_100 - _102;

The below test suites are passed for this patch.
* The rv64gcv fully regression test.
* The x86 bootstrap test.
* The x86 fully regression test.

gcc/ChangeLog:

	* match.pd: Add case 1 matching pattern for vector signed SAT_SUB.

Signed-off-by: Pan Li <[email protected]>
Almost the same as vector unsigned integer SAT_SUB, try to match
the signed version during the vector pattern matching.

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:

	* tree-vect-patterns.cc (gimple_signed_integer_sat_sub): Add new
	func decl for signed SAT_SUB.
	(vect_recog_sat_sub_pattern_transform): Update comments.
	(vect_recog_sat_sub_pattern): Try the vector signed SAT_SUB
	pattern.

Signed-off-by: Pan Li <[email protected]>
This patch would like to implement the sssub for vector signed integer.

Form 1:
  #define DEF_VEC_SAT_S_SUB_FMT_1(T, UT, MIN, MAX)                     \
  void __attribute__((noinline))                                       \
  vec_sat_s_add_##T##_fmt_1 (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                                                      \
          : (minus ^ x) >= 0                                           \
            ? minus                                                    \
            : x < 0 ? MIN : MAX;                                       \
      }                                                                \
  }

DEF_VEC_SAT_S_SUB_FMT_1(int8_t, uint8_t, INT8_MIN, INT8_MAX)

Before this patch:
  28   │     vle8.v  v1,0(a1)
  29   │     vle8.v  v2,0(a2)
  30   │     sub a3,a3,a5
  31   │     add a1,a1,a5
  32   │     add a2,a2,a5
  33   │     vsra.vi v4,v1,7
  34   │     vsub.vv v3,v1,v2
  35   │     vxor.vv v2,v1,v2
  36   │     vxor.vv v0,v1,v3
  37   │     vmslt.vi    v2,v2,0
  38   │     vmslt.vi    v0,v0,0
  39   │     vmand.mm    v0,v0,v2
  40   │     vxor.vv v3,v4,v5,v0.t
  41   │     vse8.v  v3,0(a0)
  42   │     add a0,a0,a5

After this patch:
  25   │     vle8.v  v1,0(a1)
  26   │     vle8.v  v2,0(a2)
  27   │     sub a3,a3,a5
  28   │     add a1,a1,a5
  29   │     add a2,a2,a5
  30   │     vssub.vv    v1,v1,v2
  31   │     vse8.v  v1,0(a0)
  32   │     add a0,a0,a5

The below test suites are passed for this patch.
* The rv64gcv fully regression test.

gcc/ChangeLog:

	* config/riscv/autovec.md (sssub<mode>3): Add new pattern for
	signed SAT_SUB.
	* config/riscv/riscv-protos.h (expand_vec_sssub): Add new func
	decl to expand sssub to vssub.
	* config/riscv/riscv-v.cc (expand_vec_sssub): Add new func
	impl to expand sssub to vssub.

Signed-off-by: Pan Li <[email protected]>
Form 1:
  #define DEF_VEC_SAT_S_SUB_FMT_1(T, UT, MIN, MAX)                     \
  void __attribute__((noinline))                                       \
  vec_sat_s_add_##T##_fmt_1 (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                                                      \
          : (minus ^ x) >= 0                                           \
            ? minus                                                    \
            : x < 0 ? MIN : MAX;                                       \
      }                                                                \
  }

DEF_VEC_SAT_S_SUB_FMT_1(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/binop/vec_sat_data.h: Add test
	data for run test.
	* gcc.target/riscv/rvv/autovec/vec_sat_arith.h: Add test helper
	macros.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-1-i16.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-1-i32.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-1-i64.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-1-i8.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-1-i16.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-1-i32.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-1-i64.c: New test.
	* gcc.target/riscv/rvv/autovec/binop/vec_sat_s_sub-run-1-i8.c: New test.

Signed-off-by: Pan Li <[email protected]>
…09918]

We currently emit an incorrect -Woverloaded-virtual warning upon the
following test case

=== cut here ===
struct A {
  virtual operator int() { return 42; }
  virtual operator char() = 0;
};
struct B : public A {
  operator char() { return 'A'; }
};
=== cut here ===

The problem is that when iterating over ovl_range (fns), warn_hidden
gets confused by the conversion operator marker, concludes that
seen_non_override is true and therefore emits a warning for all
conversion operators in A that do not convert to char, even if
-Woverloaded-virtual is 1 (e.g. with -Wall, the case reported).

A second set of problems is highlighted when -Woverloaded-virtual is 2.

First, with the same test case, since base_fndecls contains all
conversion operators in A (except the one to char, that's been removed
when iterating over ovl_range (fns)), we emit a spurious warning for
the conversion operator to int, even though it's unrelated.

Second, in case there are several conversion operators with different
cv-qualifiers to the same type in A, we rightfully emit a warning,
however the note uses the location of the conversion operator marker
instead of the right one; location_of should go over conv_op_marker.

This patch fixes all these by explicitly keeping track of (1) base
methods that are overriden, as well as (2) base methods that are hidden
but not overriden (and by what), and warning about methods that are in
(2) but not (1). It also ignores non virtual base methods, per
"definition" of -Woverloaded-virtual.

	PR c++/109918

gcc/cp/ChangeLog:

	* class.cc (warn_hidden): Keep track of overloaded and of hidden
	base methods. Mention the actual hiding function in the warning,
	not the first overload.
	* error.cc (location_of): Skip over conv_op_marker.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Woverloaded-virt1.C: Check that no warning is
	emitted for non virtual base methods.
	* g++.dg/warn/Woverloaded-virt5.C: New test.
	* g++.dg/warn/Woverloaded-virt6.C: New test.
	* g++.dg/warn/Woverloaded-virt7.C: New test.
	* g++.dg/warn/Woverloaded-virt8.C: New test.
	* g++.dg/warn/Woverloaded-virt9.C: New test.
ChangeLog:

	* MAINTAINERS: Add myself to write after approval.
	PR middle-end/112600

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr112600-4a.c: New test.
	* gcc.target/i386/pr112600-4b.c: New test.
This commit reduces code duplication by moving gfc_get_location
from trans.cc to error.cc.  The gcc_assert is now used more often
and reveald a bug in gfc_match_array_constructor where the union
expr->ts.u.derived of a derived type is partially overwritten by
the assignment expr->ts.u.cl->... as a ts.type == BT_CHARACTER check
was missing.

gcc/fortran/ChangeLog:

	* array.cc (gfc_match_array_constructor): Only update the
	character length if the expression is of character type.
	* error.cc (gfc_get_location_with_offset): New; split off
	from ...
	(gfc_format_decoder): ... here; call it.
	* gfortran.h (gfc_get_location_with_offset): New prototype.
	(gfc_get_location): New inline function.
	* trans.cc (gfc_get_location): Remove function definition.
	* trans.h (gfc_get_location): Remove declaration.
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  <[email protected]>

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.
Since x32 uses (%edx), instead of (%rdx), also scan (%edx).

	* gcc.target/i386/invariant-ternlog-1.c: Also scan (%edx).

Signed-off-by: H.J. Lu <[email protected]>
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: H.J. Lu <[email protected]>
Thomas Koenig and others added 29 commits October 18, 2024 17:58
gcc/fortran/ChangeLog:

	* error.cc (notify_std_msg): Handle GFC_STD_UNSIGNED.

gcc/testsuite/ChangeLog:

	* gfortran.dg/unsigned_37.f90: New test.
2024-10-18  John David Anglin  <[email protected]>

gcc/ChangeLog:

	* config/pa/pa.opt.urls: Fix for -mlra.
Fixes ianlancetaylor/libbacktrace#137.

	* dwarf.c (resolve_unit_addrs_overlap_walk): New static function.
	(resolve_unit_addrs_overlap): New static function.
	(build_dwarf_data): Call resolve_unit_addrs_overlap.
The old name was misleading.

While at it, also rename some temporary variables that are used with
this function, for consistency.

Link: <https://inbox.sourceware.org/gcc-patches/[email protected]/T/#m2f661c67c8f7b2c405c8c7fc3152dd85dc729120>

gcc/ChangeLog:

	* tree.cc (array_type_nelts, array_type_nelts_minus_one)
	* tree.h (array_type_nelts, array_type_nelts_minus_one)
	* expr.cc (count_type_elements)
	* config/aarch64/aarch64.cc
	(pure_scalable_type_info::analyze_array)
	* config/i386/i386.cc (ix86_canonical_va_list_type):
	Rename array_type_nelts => array_type_nelts_minus_one
	The old name was misleading.

gcc/c/ChangeLog:

	* c-decl.cc (one_element_array_type_p, get_parm_array_spec)
	* c-fold.cc (c_fold_array_ref):
	Rename array_type_nelts => array_type_nelts_minus_one

gcc/cp/ChangeLog:

	* decl.cc (reshape_init_array)
	* init.cc
	(build_zero_init_1)
	(build_value_init_noctor)
	(build_vec_init)
	(build_delete)
	* lambda.cc (add_capture)
	* tree.cc (array_type_nelts_top):
	Rename array_type_nelts => array_type_nelts_minus_one

gcc/fortran/ChangeLog:

	* trans-array.cc (structure_alloc_comps)
	* trans-openmp.cc
	(gfc_walk_alloc_comps)
	(gfc_omp_clause_linear_ctor):
	Rename array_type_nelts => array_type_nelts_minus_one

gcc/rust/ChangeLog:

	* backend/rust-tree.cc (array_type_nelts_top):
	Rename array_type_nelts => array_type_nelts_minus_one

Suggested-by: Richard Biener <[email protected]>
Signed-off-by: Alejandro Colomar <[email protected]>
There were two identical definitions, and none of them are available
where they are needed for implementing a number-of-elements-of
operator.  Merge them, and provide the single definition in
gcc/tree.{h,cc}, where it's available for that operator, which will be
added in a following commit.

gcc/ChangeLog:

	* tree.h (array_type_nelts_top)
	* tree.cc (array_type_nelts_top):
	Define function (moved from gcc/cp/).

gcc/cp/ChangeLog:

	* cp-tree.h (array_type_nelts_top)
	* tree.cc (array_type_nelts_top):
	Remove function (move to gcc/).

gcc/rust/ChangeLog:

	* backend/rust-tree.h (array_type_nelts_top)
	* backend/rust-tree.cc (array_type_nelts_top):
	Remove function.

Signed-off-by: Alejandro Colomar <[email protected]>
We don't yet have clear agreement on removing -Wtraditional (although
it seems there is little to no use for most of the warnings therein),
so fix the bug in its interaction with -std=gnu23 to continue progress
on making -std=gnu23 the default while -Wtraditional remains under
discussion.

The warning for ISO C function definitions with -Wtraditional properly
covers (void), but also wrongly warned for () in C23 mode as that has
the same semantics as (void) in that case.  Keep track in c_arg_info
of when () was converted to (void) for C23 so that -Wtraditional can
avoid warning in that case (with an appropriate comment on the
definition of the new field to make clear it can be removed along with
-Wtraditional).

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc/c/
	* c-tree.h (c_arg_info): Add c23_empty_parens.
	* c-decl.cc (grokparms): Set c23_empty_parens.
	(build_arg_info): Clear c23_empty_parens.
	(store_parm_decls_newstyle): Do not give -Wtraditional warning for
	ISO C function definition if c23_empty_parens.

gcc/testsuite/
	* gcc.dg/wtr-gnu17-1.c, gcc.dg/wtr-gnu23-1.c: New tests.
This commit expands on r15-3973-g4c7a58ac2617e2, which added
debug "dump" member functiosn to pretty_printer and output_buffer.

This followup adds "dump" member functions to diagnostic_context and
diagnostic_format, extends the existing dump functions and adds
indentation to make it much easier to see the various relationships
between context, format, printer, etc.

Hence you can now do:

(gdb) call global_dc->dump ()

and get a useful summary of what the diagnostic subsystem is doing;
for example:

(gdb) call global_dc->dump()
diagnostic_context:
  counts:
  output format:
    sarif_output_format
  printer:
    m_show_color: false
    m_url_format: bel
    m_buffer:
      m_formatted_obstack current object: length 0:
      m_chunk_obstack current object: length 0:
      pp_formatted_chunks: depth 0
        0: TEXT("Function ")]
        1: BEGIN_QUOTE, TEXT("program"), END_QUOTE]
        2: TEXT(" requires an argument list at ")]
        3: TEXT("(1)")]

showing the counts of all diagnostic kind that are non-zero (none yet),
that we have a sarif output format, and the printer is part-way through
formatting a string.

gcc/ChangeLog:
	* diagnostic-format-json.cc (json_output_format::dump): New.
	* diagnostic-format-sarif.cc (sarif_output_format::dump): New.
	(sarif_file_output_format::dump): New.
	* diagnostic-format-text.cc (diagnostic_text_output_format::dump):
	New.
	* diagnostic-format-text.h (diagnostic_text_output_format::dump):
	New decl.
	* diagnostic-format.h (diagnostic_output_format::dump): New decls.
	* diagnostic.cc (diagnostic_context::dump): New.
	(diagnostic_output_format::dump): New.
	* diagnostic.h (diagnostic_context::dump): New decls.
	* pretty-print-format-impl.h (pp_formatted_chunks::dump): Add
	"indent" param.
	* pretty-print.cc (bytes_per_hexdump_line): New constant.
	(print_hexdump_line): New.
	(print_hexdump): New.
	(output_buffer::dump): Add "indent" param and use it.  Add
	hexdump of current object in m_formatted_obstack and
	m_chunk_obstack.
	(pp_formatted_chunks::dump): Add "indent" param and use it.
	(pretty_printer::dump): Likewise.  Add dumping of m_show_color
	and m_url_format.
	* pretty-print.h (output_buffer::dump): Add "indent" param.
	(pretty_printer::dump): Likewise.

gcc/testsuite/ChangeLog:
	* gcc.dg/plugin/diagnostic_plugin_xhtml_format.c
	(xhtml_output_format::dump): New.

Signed-off-by: David Malcolm <[email protected]>
I believe this hasn't been necessary since r15-1413-gd3878c85f331c7.

gcc/ChangeLog:
	* diagnostic.h (json::value): Remove forward decl.

Signed-off-by: David Malcolm <[email protected]>
Backport https://go.dev/cl/620955 from main repo.  Original description:

    src/runtime/testdata/testprogcgo/threadprof.go contains C code with a
    variable called nullptr.  This conflicts with the nullptr keyword in
    the C23 revision of the C standard (showing up as gccgo test build
    failures when updating GCC to use C23 by default when building C
    code).

    Rename that variable to nullpointer to avoid the clash with the
    keyword (any other name that's not a keyword would work just as well).

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/621059
gcc/fortran/ChangeLog:

	PR fortran/117225
	* primary.cc (match_sym_complex_part): An UNSIGNED in
	a complex part is an error.

gcc/testsuite/ChangeLog:

	PR fortran/117225
	* gfortran.dg/unsigned_38.f90: New test.
GCC's diagnostic engine gained a while ago support for ranges, i.e. instead
of pointing at a single character '^', it can also have a '~~~~^~~~~~' range.

This patch adds support for this and adds 9 users for it, which covers the
most common cases. A single '^' can be still useful. Some location data in
gfortran is rather bad - often the matching pattern includes whitespace such
that the before or after location points to the beginning/end of the
whitespace, which can be far of especially when comments and/or continuation
lines are involed. Otherwise, often a '^' still sufficient, albeit wrong
location data only becomes obvious once starting to use ranges.

The 'locus' is extended to support two ways to store the data; hereby
gfc_current_locus always contains the old format (at least during parsing)
and gfc_current_locus shall not be used in trans*.cc. The latter permits
a nice cleanup to just use input_location. Otherwise, the new format is
only used when switching to ranges.
The only reason to convert from location_t to locus occurs in trans*.cc
for the gfc_error (etc.) diagnostic and for gfc_trans_runtime_check; there
are 5 currently 5 such cases.  For gfc_* diagnostic, we could think of
another letter besides %L or a modifier like '%lL', if deemed useful.

In any case, the new format is just:
  locus->u.location = linemap_position_for_loc_and_offset (line_table,
                         loc->u.lb->location, loc->nextc - loc->u.lb->line);
  locus->nextc = (gfc_char_t *) -1;  /* Marker for new format. */
i.e. using the existing location_t location in in the linebuffer (which
points to column 0) and add as offset the actually used column number.

As location_t handles ranges, we just use it also to store them via:
  location = make_location (caret, begin, end)
There are a few convenience macros/functions but that's all.

Alongside, a few minor fixes were done: linemap_location_before_p replaces
a line-number based comparison, which does not handle multiple statements
in the same line that ';' allows for.

gcc/fortran/ChangeLog:

	* data.cc (gfc_assign_data_value): Use linemap_location_before_p
	and GFC_LOCUS_IS_SET.
	* decl.cc (gfc_verify_c_interop_param): Make better translatable.
	(build_sym, variable_decl, gfc_match_formal_arglist,
	gfc_match_subroutine): Add range-based locations, use it in
	diagnostic and gobble whitespace for better locations.
	* error.cc (gfc_get_location_with_offset): Handle new format.
	(gfc_get_location_range): New.
	* expr.cc (gfc_check_assign): Use GFC_LOCUS_IS_SET.
	* frontend-passes.cc (check_locus_code, check_locus_expr):
	Likewise.
	(runtime_error_ne): Use GFC_LOCUS_IS_SET.
	* gfortran.h (locus): Change lb to union with lb and location.
	(GFC_LOCUS_IS_SET): Define.
	(gfc_get_location_range): New prototype.
	(gfc_new_symbol, gfc_get_symbol, gfc_get_sym_tree,
	gfc_get_ha_symbol, gfc_get_ha_sym_tree): Take optional locus
	argument.
	* io.cc (io_constraint): Use GFC_LOCUS_IS_SET.
	* match.cc (gfc_match_sym_tree): Use range locus.
	* openmp.cc (gfc_match_omp_variable_list,
	gfc_match_omp_doacross_sink): Likewise.
	* parse.cc (next_free): Update for locus struct change.
	* primary.cc (gfc_match_varspec): Likewise.
	(match_variable): Use range locus.
	* resolve.cc (find_array_spec): Use GFC_LOCUS_IS_SET.
	* scanner.cc (gfc_at_eof, gfc_at_bol, gfc_start_source_files,
	gfc_advance_line, gfc_define_undef_line, skip_fixed_comments,
	gfc_gobble_whitespace, include_stmt, gfc_new_file): Update
	for locus struct change.
	* symbol.cc (gfc_new_symbol, gfc_get_sym_tree, gfc_get_symbol,
	gfc_get_ha_sym_tree, gfc_get_ha_symbol): Take optional locus.
	* trans-array.cc (gfc_trans_array_constructor_value): Use %L not %C.
	(gfc_trans_g77_array, gfc_trans_dummy_array_bias,
	gfc_trans_class_array, gfc_trans_deferred_array): Replace
	gfc_{save,set,restore}_backend_locus by directly using
	input_location.
	* trans-common.cc (build_equiv_decl, get_init_field): Likewise.
	* trans-decl.cc (gfc_get_extern_function_decl, build_function_decl,
	build_entry_thunks, gfc_null_and_pass_deferred_len,
	gfc_trans_deferred_vars, gfc_trans_use_stmts, finish_oacc_declare,
	gfc_generate_block_data): Likewise.
	* trans-expr.cc (gfc_copy_class_to_class, gfc_conv_expr): Changes
	to avoid gfc_current_locus.
	* trans-io.cc (set_error_locus): Likewise.
	* trans-openmp.cc (gfc_trans_omp_workshare): Use input_locus directly.
	* trans-stmt.cc (gfc_trans_if_1): Likewise and use GFC_LOCUS_IS_SET.
	* trans-types.cc (gfc_get_union_type, gfc_get_derived_type): Likewise.
	* trans.cc (gfc_locus_from_location): New.
	(trans_runtime_error_vararg, gfc_trans_runtime_check): Use location_t
	for file + line data.
	(gfc_current_backend_file, gfc_save_backend_locus,
	gfc_set_backend_locus, gfc_restore_backend_locus): Remove.
	(trans_code): Use input_location directly, don't set gfc_current_locus.
	* trans.h (gfc_save_backend_locus, gfc_set_backend_locus,
	gfc_restore_backend_locus): Remove prototypes.
	(gfc_locus_from_location): Add prototype.

gcc/testsuite/ChangeLog:

	* gfortran.dg/bounds_check_25.f90: Update expected column
	in the diagnostic.
	* gfortran.dg/goacc/pr92793-1.f90: Likewise.
	* gfortran.dg/gomp/allocate-14.f90: Likewise.
	* gfortran.dg/gomp/polymorphic-mapping.f90: Likewise.
	* gfortran.dg/gomp/reduction5.f90: Likewise.
	* gfortran.dg/gomp/reduction6.f90: Likewise.
gcc/fortran/ChangeLog:

	* check.cc (is_c_interoperable): Use _(...) around to mark strings
	as translatable.
	* data.cc (gfc_assign_data_value): Move string literal to gfc_error
	to make it translatable.
	* resolve.cc (resolve_fl_variable, resolve_equivalence): Use G_(...)
	around string literals.
	* scanner.cc (skip_fixed_omp_sentinel): Replace '...' by %<...%>.
	* trans-openmp.cc (gfc_split_omp_clauses,
	gfc_trans_omp_declare_variant): Likewise.
This patch implements the FORWARD keyword found in the ISO standard.
The patch checks incoming parameters against the prior declaration
found in definition/forward sections and will issue an error based
on virtual tokens highlighing the full parameter declaration.

gcc/m2/ChangeLog:

	PR modula2/115328
	* gm2-compiler/M2MetaError.def: Extend comment documentating
	new format specifiers.
	* gm2-compiler/M2MetaError.mod (GetTokProcedure): New declaration.
	(doErrorScopeModule): New procedure.
	(doErrorScopeForward): Ditto.
	(doErrorScopeMod): Reimplement.
	(doErrorScopeFor): New procedure.
	(declarationMod): Ditto.
	(doErrorScopeDefinition): Ditto.
	(doErrorScopeDef): Reimplement.
	(declaredDef): New procedure.
	(declaredFor): Ditto.
	(doErrorScopeProc): Ditto.
	(declaredVar): Ditto.
	(declaredType): Ditto.
	(declaredFull): Ditto.
	* gm2-compiler/M2Options.mod (SetAutoInit): Add missing
	return type.
	(GetDumpGimple): Remove duplicate implementation.
	* gm2-compiler/M2Quads.def (DupFrame): New procedure.
	* gm2-compiler/M2Quads.mod (DupFrame): New procedure.
	* gm2-compiler/M2Reserved.def (ForwardTok): New variable.
	* gm2-compiler/M2Reserved.mod (ForwardTok): Initialize variable.
	* gm2-compiler/M2Scaffold.mod (DeclareArgEnvParams): Add
	tokno parameter for call to PutParam.
	* gm2-compiler/P0SymBuild.def (EndForward): New procedure.
	* gm2-compiler/P0SymBuild.mod (EndForward): New procedure.
	* gm2-compiler/P0SyntaxCheck.bnf (BlockAssert): New procedure.
	(ProcedureDeclaration): Reimplement rule.
	(PostProcedureHeading): New rule.
	(ForwardDeclaration): Ditto.
	(ProperProcedure): Ditto.
	* gm2-compiler/P1Build.bnf (ProcedureDeclaration): Reimplement rule.
	(PostProcedureHeading): New rule.
	(ForwardDeclaration): Ditto.
	(ProperProcedure): Ditto.
	* gm2-compiler/P1SymBuild.def (Export): Removed unnecessary
	export.
	(EndBuildForward): New procedure.
	* gm2-compiler/P1SymBuild.mod (StartBuildProcedure): Reimplement.
	(EndBuildProcedure): Ditto.
	(EndBuildForward): Ditto.
	* gm2-compiler/P2Build.bnf (ProcedureDeclaration): Reimplement rule.
	(PostProcedureHeading): New rule.
	(ForwardDeclaration): Ditto.
	(ProperProcedure): Ditto.
	* gm2-compiler/P2SymBuild.def (BuildProcedureDefinedByForward):
	New procedure.
	(BuildProcedureDefinedByProper): Ditto.
	(CheckProcedure): Ditto.
	(EndBuildForward): Ditto.
	* gm2-compiler/P2SymBuild.mod (EndBuildProcedure): Reimplement.
	(EndBuildForward): New procedure.
	(BuildFPSection): Reimplement to allow forward declaration or
	checking of parameters.
	(BuildProcedureDefinedByProper): New procedure.
	(BuildProcedureDefinedByForward): Ditto
	(FailParameter): Remove.
	(ParameterError): New procedure.
	(ParameterMismatch): Ditto.
	(EndBuildFormalParameters): Add parameter number check.
	(GetComparison): New procedure function.
	(GetSourceDesc): Ditto.
	(GetCurSrcDesc): Ditto.
	(GetDeclared): New procedure.
	(ReturnTypeMismatch): Ditto.
	(BuildFunction): Reimplement.
	(CheckProcedure): New procedure.
	(CheckFormalParameterSection): Reimplement using ParameterError.
	* gm2-compiler/P3Build.bnf (ProcedureDeclaration): Reimplement rule.
	(PostProcedureHeading): New rule.
	(ForwardDeclaration): Ditto.
	(ProperProcedure): Ditto.
	* gm2-compiler/P3SymBuild.def (Export): Remove unnecessary export.
	(EndBuildForward): New procedure.
	* gm2-compiler/P3SymBuild.mod (EndBuildForward): New procedure.
	* gm2-compiler/PCBuild.bnf (ProcedureDeclaration): Reimplement rule.
	(PostProcedureHeading): New rule.
	(ForwardDeclaration): Ditto.
	(ProperProcedure): Ditto.
	* gm2-compiler/PCSymBuild.def (EndBuildForward): New procedure.
	* gm2-compiler/PCSymBuild.mod (EndBuildForward): Ditto.
	* gm2-compiler/PHBuild.bnf (ProcedureDeclaration): Reimplement rule.
	(PostProcedureHeading): New rule.
	(ForwardDeclaration): Ditto.
	(ProperProcedure): Ditto.
	* gm2-compiler/SymbolTable.def (PutVarTok): New procedure.
	(PutParam): Add typetok parameter.
	(PutVarParam): Ditto.
	(PutParamName): Ditto.
	(GetDeclaredFor): New procedure function.
	(AreParametersDefinedInDefinition): Ditto.
	(PutParametersDefinedByForward): New procedure.
	(GetParametersDefinedByForward): New procedure function.
	(PutParametersDefinedByProper): New procedure.
	(GetParametersDefinedByProper): New procedure function.
	(GetProcedureDeclaredForward): Ditto.
	(PutProcedureDeclaredForward): New procedure.
	(GetProcedureDeclaredProper): New procedure function.
	(PutProcedureDeclaredProper): New procedure.
	(GetProcedureDeclaredDefinition): New procedure function.
	(PutProcedureDeclaredDefinition): New procedure.
	(GetVarDeclTypeTok): Ditto.
	(PutVarDeclTypeTok): New procedure.
	(GetVarDeclTok): Ditto.
	(PutVarDeclTok): New procedure.
	(GetVarDeclFullTok): Ditto.
	* gm2-compiler/SymbolTable.mod (ProcedureDecl): New record type.
	(VarDecl): Ditto.
	(SymProcedure): Add new field Declared.
	(SymVar): Add new field Declared.
	(PutVarTok): New procedure.
	(PutParam): Add typetok parameter.
	(PutVarParam): Ditto.
	(PutParamName): Ditto.
	(GetDeclaredFor): New procedure function.
	(AreParametersDefinedInDefinition): Ditto.
	(PutParametersDefinedByForward): New procedure.
	(GetParametersDefinedByForward): New procedure function.
	(PutParametersDefinedByProper): New procedure.
	(GetParametersDefinedByProper): New procedure function.
	(GetProcedureDeclaredForward): Ditto.
	(PutProcedureDeclaredForward): New procedure.
	(GetProcedureDeclaredProper): New procedure function.
	(PutProcedureDeclaredProper): New procedure.
	(GetProcedureDeclaredDefinition): New procedure function.
	(PutProcedureDeclaredDefinition): New procedure.
	(GetVarDeclTypeTok): Ditto.
	(PutVarDeclTypeTok): New procedure.
	(GetVarDeclTok): Ditto.
	(PutVarDeclTok): New procedure.
	(GetVarDeclFullTok): Ditto.
	(MakeProcedure): Initialize Declared field.
	(MakeVar): Initialize Declared field.
	* gm2-libs-log/FileSystem.def (FileNameChar): Add
	missing return type.
	* m2.flex: Add FORWARD keyword.

gcc/testsuite/ChangeLog:

	PR modula2/115328
	* gm2/iso/fail/badparam.def: New test.
	* gm2/iso/fail/badparam.mod: New test.
	* gm2/iso/fail/badparam2.def: New test.
	* gm2/iso/fail/badparam2.mod: New test.
	* gm2/iso/fail/badparam3.def: New test.
	* gm2/iso/fail/badparam3.mod: New test.
	* gm2/iso/fail/badparamarray.def: New test.
	* gm2/iso/fail/badparamarray.mod: New test.
	* gm2/iso/fail/simpledef1.def: New test.
	* gm2/iso/fail/simpledef1.mod: New test.
	* gm2/iso/fail/simpleforward.mod: New test.
	* gm2/iso/fail/simpleforward2.mod: New test.
	* gm2/iso/fail/simpleforward3.mod: New test.
	* gm2/iso/fail/simpleforward4.mod: New test.
	* gm2/iso/fail/simpleforward5.mod: New test.
	* gm2/iso/fail/simpleforward7.mod: New test.
	* gm2/iso/pass/simpleforward.mod: New test.
	* gm2/iso/pass/simpleforward6.mod: New test.

Signed-off-by: Gaius Mulley <[email protected]>
…ck_move

Unlike the other vector string ops, expand_block_move was using max LMUL
m8 regardless of TARGET_MAX_LMUL.

The check for whether to generate inline vector code for movmem has been
moved from movmem<mode> to riscv_vector::expand_block_move to avoid
maintaining multiple versions of similar logic.  They already differed
on the minimum length for which they would generate vector code.  Now
that the expand_block_move value is used, movmem will be generated for
smaller lengths.

Limiting memcpy to m1 caused some memcpy loops to be generated in
the calling convention tests which makes it awkward to add suitable scan
assembler tests checking the return value being set, so
-mrvv-max-lmul=m8 has been added to these tests.  Other tests have been
adjusted to expect the new memcpy m1 generation where reasonably
straight-forward, otherwise -mrvv-max-lmul=m8 has been added.

pr111720-[0-9].c regressed because a memcpy loop is generated instead
of straight-line.  This reveals an existing issue where a redundant
straight-line memcpy gets eliminated but a memcpy loop does not
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117205).

For example, on pr111720-0.c after this patch:

-mrvv-max-lmul=m8:

test:
	lui	a5,%hi(.LANCHOR0)
	li	a4,32
	addi	sp,sp,-32
	addi	a5,a5,%lo(.LANCHOR0)
	vsetvli	zero,a4,e8,m1,ta,ma
	vle8.v	v8,0(a5)
	addi	sp,sp,32
	jr	ra

-mrvv-max-lmul=m1:

test:
	addi	sp,sp,-32
	lui	a5,%hi(.LANCHOR0)
	addi	a5,a5,%lo(.LANCHOR0)
	mv	a2,sp
	li	a3,32
.L2:
	vsetvli	a4,a3,e8,m1,ta,ma
	vle8.v	v8,0(a5)
	sub	a3,a3,a4
	add	a5,a5,a4
	vse8.v	v8,0(a2)
	add	a2,a2,a4
	bne	a3,zero,.L2
	li	a5,32
	vsetvli	zero,a5,e8,m1,ta,ma
	vle8.v	v8,0(sp)
	addi	sp,sp,32
	jr	ra

I have added -mrvv-max-lmul=m8 to pr111720-[0-9].c so that we continue
to test the elimination of straight-line memcpy.

gcc/ChangeLog:

	* config/riscv/riscv-protos.h (get_lmul_mode): New prototype.
	(expand_block_move): Add bool parameter for movmem_p.
	* config/riscv/riscv-string.cc (riscv_expand_block_move_scalar):
	Pass movmem_p as false to riscv_vector::expand_block_move.
	(expand_block_move): Add movmem_p parameter.  Return false if
	loop needed and movmem_p is true.  Respect TARGET_MAX_LMUL.
	* config/riscv/riscv-v.cc (get_lmul_mode): New function.
	* config/riscv/riscv.md (movmem<mode>): Move checking for
	whether to generate inline vector code to
	riscv_vector::expand_block_move by passing movmem_p as true.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr113206-1.c: Add
	-mrvv-max-lmul=m8.
	* gcc.target/riscv/rvv/autovec/pr113206-2.c: Likewise.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c: Add
	-mrvv-max-lmul=m8 and adjust assembly scans.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-2.c:
	Likewise.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-3.c:
	Likewise.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-4.c:
	Likewise.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-5.c:
	Likewise.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-6.c:
	Likewise.
	* gcc.target/riscv/rvv/autovec/vls/calling-convention-7.c:
	Likewise.
	* gcc.target/riscv/rvv/autovec/vls/spill-4.c: Add
	-mrvv-max-lmul=m8.
	* gcc.target/riscv/rvv/autovec/vls/spill-7.c: Likewise.
	* gcc.target/riscv/rvv/base/cpymem-1.c: Expect m1 in f1 and f2.
	* gcc.target/riscv/rvv/base/cpymem-2.c: Add -mrvv-max-lmul=m8.
	* gcc.target/riscv/rvv/base/movmem-1.c: Adjust f1 to a length
	that will not get vectorized.
	* gcc.target/riscv/rvv/base/pr111720-0.c: Add -mrvv-max-lmul=m8.
	* gcc.target/riscv/rvv/base/pr111720-1.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-2.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-3.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-4.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-5.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-6.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-7.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-8.c: Likewise.
	* gcc.target/riscv/rvv/base/pr111720-9.c: Likewise.
	* gcc.target/riscv/rvv/vsetvl/pr112929-1.c: Expect memcpy m1
	loops.
	* gcc.target/riscv/rvv/vsetvl/pr112988-1.c: Likewise.
…nction [NFC]

This moves the code for deciding whether to generate a vectorized
memcpy, what vector mode to use and whether a loop is needed out of
riscv_vector::expand_block_move and into a new function
riscv_vector::use_stringop_p so that it can be reused for other string
operations.

gcc/ChangeLog:

	* config/riscv/riscv-string.cc (struct stringop_info): New.
	(expand_block_move): Move decision making code to...
	(use_vector_stringop_p): ...here.
…S_PER_WORD

For fast unaligned access targets, by pieces uses up to UNITS_PER_WORD
size pieces resulting in more store instructions than needed.  For
example gcc.target/riscv/rvv/base/setmem-1.c:f1 built with
`-O3 -march=rv64gcv -mtune=thead-c906`:
```
f1:
        vsetivli        zero,8,e8,mf2,ta,ma
        vmv.v.x v1,a1
        vsetivli        zero,0,e32,mf2,ta,ma
        sb      a1,14(a0)
        vmv.x.s a4,v1
        vsetivli        zero,8,e16,m1,ta,ma
        vmv.x.s a5,v1
        vse8.v  v1,0(a0)
        sw      a4,8(a0)
        sh      a5,12(a0)
        ret
```

The slow unaligned access version built with `-O3 -march=rv64gcv` used
15 sb instructions:
```
f1:
        sb      a1,0(a0)
        sb      a1,1(a0)
        sb      a1,2(a0)
        sb      a1,3(a0)
        sb      a1,4(a0)
        sb      a1,5(a0)
        sb      a1,6(a0)
        sb      a1,7(a0)
        sb      a1,8(a0)
        sb      a1,9(a0)
        sb      a1,10(a0)
        sb      a1,11(a0)
        sb      a1,12(a0)
        sb      a1,13(a0)
        sb      a1,14(a0)
        ret
```

After this patch, the following is generated in both cases:
```
f1:
        vsetivli        zero,15,e8,m1,ta,ma
        vmv.v.x v1,a1
        vse8.v  v1,0(a0)
        ret
```

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_use_by_pieces_infrastructure_p):
	New function.
	(TARGET_USE_BY_PIECES_INFRASTRUCTURE_P): Define.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr113469.c: Expect mf2 setmem.
	* gcc.target/riscv/rvv/base/setmem-2.c: Update f1 to expect
	straight-line vector memset.
	* gcc.target/riscv/rvv/base/setmem-3.c: Likewise.
gcc/testsuite/ChangeLog:

	PR fortran/117225
	* gfortran.dg/unsigned_38.f90: Add missing dg-error directive.
Add option -m(no-)autovec-segment to enable/disable autovectorizer
from emitting vector segment load/store instructions. This is useful for
performance experiments.

gcc/ChangeLog:
	* config/riscv/autovec.md (vec_mask_len_load_lanes, vec_mask_len_store_lanes):
	Predicate with TARGET_VECTOR_AUTOVEC_SEGMENT
	* config/riscv/riscv-opts.h (TARGET_VECTOR_AUTOVEC_SEGMENT): New macro.
	* config/riscv/riscv.opt (-m(no-)autovec-segment): New option.

gcc/testsuite/ChangeLog:
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-1.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-2.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-3.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-4.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-5.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-6.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg-7.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-1.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-2.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-3.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-4.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-5.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-6.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_noseg_run-7.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-1.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-2.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-3.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-4.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-5.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-6.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg-7.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-1.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-2.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-3.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-4.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-5.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-6.c:
	New test.
	* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_noseg_run-7.c:
	New test.
	* gcc.target/riscv/rvv/autovec/no-segment.c: New test.
Sometimes factor_out_conditional_operation can factor out
an operation that causes a phi node to become the same element.
Other times, we want to factor out a binary operator because
it can improve code generation, an example is PR 110015 (openjpeg).

Note this includes a heuristic to decide if factoring out the operation
is profitable or not. It can be expanded to include a better live range
extend detector. Right now it has a simple one where if it is live on a
dominating path, it is considered a live or if there are a small # of
assign statements (defaults to 5), then it does not extend the live range
too much.

Bootstrapped and tested on x86_64-linux-gnu.

	PR tree-optimization/112418

gcc/ChangeLog:

	* tree-ssa-phiopt.cc (is_factor_profitable): New function.
	(factor_out_conditional_operation): Add merge argument. Remove
	arg0/arg1 arguments. Return bool instead of the new phi.
	Early return for virtual ops. Call is_factor_profitable to
	check if the factoring would be profitable.
	(pass_phiopt::execute): Call factor_out_conditional_operation
	on all phis instead of just singleton phi.
	* doc/invoke.texi (--param phiopt-factor-max-stmts-live=): Document.
	* params.opt (--param=phiopt-factor-max-stmts-live=): New opt.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/factor_op_phi-1.c: New test.
	* gcc.dg/tree-ssa/factor_op_phi-2.c: New test.
	* gcc.dg/tree-ssa/factor_op_phi-3.c: New test.
	* gcc.dg/tree-ssa/factor_op_phi-4.c: New test.

Signed-off-by: Andrew Pinski <[email protected]>
This patch is a tidyup for gm2-compiler/M2MetaError.mod.

gcc/m2/ChangeLog:

	* gm2-compiler/M2MetaError.mod (op): Alphabetically order
	each case label and comment.

Signed-off-by: Gaius Mulley <[email protected]>
… [PR114423]

libcpp is not currently set up to be able to generate valid
locations for tokens lexed from a _Pragma string. Instead, after obtaining
the tokens, it sets their locations all to the location of the _Pragma
operator itself. This makes things like _Pragma("GCC diagnostic") work well
enough, but if any diagnostics are issued during lexing, prior to resetting
the token locations, those diagnostics get issued at the invalid
locations. Fix that up by adding a new field pfile->diagnostic_override_loc
that instructs libcpp to issue diagnostics at the alternate location.

libcpp/ChangeLog:

	PR preprocessor/114423
	* internal.h (struct cpp_reader): Add DIAGNOSTIC_OVERRIDE_LOC
	field.
	* directives.cc (destringize_and_run): Set the new field to the
	location of the _Pragma operator.
	* errors.cc (cpp_diagnostic_at): Support DIAGNOSTIC_OVERRIDE_LOC to
	temporarily issue diagnostics at a different location.
	(cpp_diagnostic_with_line): Likewise.

gcc/testsuite/ChangeLog:

	PR preprocessor/114423
	* c-c++-common/cpp/pragma-diagnostic-loc.c: New test.
	* c-c++-common/cpp/diagnostic-pragma-1.c: Adjust expected output.
	* g++.dg/pch/operator-1.C: Likewise.
This patch adds Proof-of-Concept LoongArch vector calling convention support, and can be
enabled by __attribute__ ((vecarg)) or -mvecarg option. The details and
discussion can be found at Github loongson/gcc repo's issue list.

gcc/ChangeLog:

	* config/loongarch/genopts/loongarch.opt.in: Add vector calling convention
	support.
	* config/loongarch/loongarch-protos.h (loongarch_init_cumulative_args): Ditto.
	* config/loongarch/loongarch.cc (loongarch_simd_abi): Ditto.
	(loongarch_fntype_abi): Ditto.
	(loongarch_comp_type_attributes): Ditto.
	(loongarch_init_cumulative_args): Ditto.
	(loongarch_insn_callee_abi): Ditto.
	(loongarch_flatten_aggregate_field): Ditto.
	(loongarch_flatten_aggregate_argument): Ditto.
	(loongarch_pass_aggregate_num_fpr): Ditto.
	(loongarch_pass_aggregate_in_fpr_and_gpr_p): Ditto.
	(loongarch_get_arg_info): Ditto.
	(loongarch_function_arg): Ditto.
	(loongarch_function_value_1): Ditto.
	(loongarch_return_in_memory): Ditto.
	(loongarch_call_tls_get_addr): Ditto.
	(loongarch_output_mi_thunk): Ditto.
	(TARGET_FNTYPE_ABI): Ditto.
	(TARGET_COMP_TYPE_ATTRIBUTES): Ditto.
	(TARGET_INSN_CALLEE_ABI): Ditto.
	* config/loongarch/loongarch.h (enum loongarch_pcs): Ditto.
	(INIT_CUMULATIVE_ARGS): Ditto.
	* config/loongarch/loongarch.md: Ditto.
	* config/loongarch/loongarch.opt: Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/vector/lasx/vect-abi-pass-struct-1.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-pass-struct-2.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-pass-struct-3.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-pass-struct-4.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-pass-struct-5.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-pass-struct-6.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-1.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-2.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-3.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-4.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-5.c: New test.
	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-6.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-1.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-2.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-stdarg-1.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-stdarg-2.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-struct-1.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-struct-2.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-struct-3.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-struct-4.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-struct-5.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-pass-struct-6.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-ret-struct-1.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-ret-struct-2.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-ret-struct-3.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-ret-struct-4.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-ret-struct-5.c: New test.
	* gcc.target/loongarch/vector/lsx/vect-abi-ret-struct-6.c: New test.
…ent.

gcc/ChangeLog:

	* config/loongarch/loongarch.cc (loongarch_fntype_abi): Fixing
	up loongarch_fntype_abi () and TARGET_VECARG judgement.
	(loongarch_flatten_aggregate_field): Ditto.
	(loongarch_flatten_aggregate_argument): Ditto.
…ember.

This patch fixes the wrong-placed condition inside loongarch_flatten_aggregate_field ()
function, which causes the ICE.

gcc/ChangeLog:

	* config/loongarch/loongarch.cc (loongarch_flatten_aggregate_field):
	Fixing ICE when returning struct with more than 2 vector member.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/vector/lasx/vect-abi-ret-struct-7.c: New test.
There's a invoking to gen_call_value_internal() that missing pcs
argument. This patch corrects it.

gcc/ChangeLog:

	* config/loongarch/loongarch.cc (loongarch_call_tls_get_addr):
        Add missing pcs argument for gen_call_value_internal().
vect-abi-pass-1.c checks instruction with $vr0 as parameter instead of $vr8,
which is wrong compares to expected checking sequence.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/vector/lsx/vect-abi-pass-1.c: Change vr0
	  to vr8 in checking sequence.
Cancel this commit because problem is disappeared.

This reverts commit 4ad1dfc.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.