Commit graph

206731 commits

Author SHA1 Message Date
Christophe Lyon
05d353b794 Allow overriding EXPECT
While investigating possible race conditions in the GCC testsuites
caused by bufferization issues, I wanted to investigate workarounds
similar to GDB's READ1 [1], and I noticed it was not always possible
to override EXPECT when running 'make check'.

This patch adds the missing support in various Makefiles.

I was not able to test the patch for all the libraries updated here,
but I confirmed it works as intended/needed for libstdc++.

libatomic, libitm, libgomp already work as intended because their
Makefiles do not have:
MAKEOVERRIDES=

Tested on (native) aarch64-linux-gnu, confirmed the patch introduces
the behaviour I want in gcc, g++, gfortran and libstdc++.

I updated (but could not test) libgm2, libphobos, libquadmath and
libssp for consistency since their Makefiles have MAKEOVERRIDES=

libffi, libgo, libsanitizer seem to need a similar update, but they
are imported from their respective upstream repo, so should not be
patched here.

[1] https://github.com/bminor/binutils-gdb/blob/master/gdb/testsuite/README#L269

2023-12-21  Christophe Lyon  <christophe.lyon@linaro.org>

	gcc/
	* Makefile.in: Allow overriding EXEPCT.

	libgm2/
	* Makefile.am: Allow overriding EXEPCT.
	* Makefile.in: Regenerate.

	libphobos/
	* Makefile.am: Allow overriding EXEPCT.
	* Makefile.in: Regenerate.

	libquadmath/
	* Makefile.am: Allow overriding EXEPCT.
	* Makefile.in: Regenerate.

	libssp/
	* Makefile.am: Allow overriding EXEPCT.
	* Makefile.in: Regenerate.

	libstdc++-v3/
	* Makefile.am: Allow overriding EXEPCT.
	* Makefile.in: Regenerate.
2023-12-22 10:24:56 +00:00
Ken Matsui
c4d1d1adf7
c++: testsuite: Remove testsuite_tr1.h includes
This patch removes the testsuite_tr1.h dependency from g++.dg/ext/is_*.C
tests since the header is supposed to be used only by libstdc++, not
front-end.  This also includes test code consistency fixes.

For the record this fixes the test failures reported at
https://gcc.gnu.org/pipermail/gcc-patches/2023-December/641058.html

gcc/testsuite/ChangeLog:

	* g++.dg/ext/is_array.C: Remove testsuite_tr1.h.  Add necessary
	definitions accordingly.  Tweak macros for consistency across
	test codes.
	* g++.dg/ext/is_bounded_array.C: Likewise.
	* g++.dg/ext/is_function.C: Likewise.
	* g++.dg/ext/is_member_function_pointer.C: Likewise.
	* g++.dg/ext/is_member_object_pointer.C: Likewise.
	* g++.dg/ext/is_member_pointer.C: Likewise.
	* g++.dg/ext/is_object.C: Likewise.
	* g++.dg/ext/is_reference.C: Likewise.
	* g++.dg/ext/is_scoped_enum.C: Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Patrick Palka <ppalka@redhat.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
2023-12-22 01:57:30 -08:00
chenxiaolong
5bd5ef9957 LoongArch: Add asm modifiers to the LSX and LASX directives in the doc.
gcc/ChangeLog:

	* doc/extend.texi:Add modifiers to the vector of asm in the doc.
	* doc/md.texi:Refine the description of the modifier 'f' in the doc.
2023-12-22 17:44:26 +08:00
Jason Merrill
2488771b6d c++: computed goto from catch block [PR81438]
As with 37722, we don't clean up the exception object if a computed goto
leaves a catch block, but we can warn about that.

	PR c++/81438

gcc/cp/ChangeLog:

	* decl.cc (poplevel_named_label_1): Handle leaving catch.
	(check_previous_goto_1): Likewise.
	(check_goto_1): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/label15.C: Require indirect_jumps.
	* g++.dg/ext/label16.C: New test.
2023-12-21 22:18:00 -05:00
Sandra Loosemore
5cb79aa2bd Testsuite: Fix failures in g++.dg/analyzer/placement-new-size.C
This testcase was failing on uses of int8_t, int64_t, etc without
including <stdint.h>.

gcc/testsuite/ChangeLog
	* g++.dg/analyzer/placement-new-size.C: Include <stdint.h>.  Also
	add missing newline to end of file.
2023-12-22 02:27:05 +00:00
Jason Merrill
d26f589e61 c++: sizeof... mangling with alias template [PR95298]
We were getting sizeof... mangling wrong when the argument after
substitution was a pack expansion that is not a simple T..., such as
list<T>... in variadic-mangle4.C or (A+1)... in variadic-mangle5.C.  In the
former case we ICEd; in the latter case we wrongly mangled it as sZ
<expression>.

	PR c++/95298

gcc/cp/ChangeLog:

	* mangle.cc (write_expression): Handle v18 sizeof... bug.
	* pt.cc (tsubst_pack_expansion): Keep TREE_VEC for sizeof...
	(tsubst_expr): Don't strip TREE_VEC here.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/variadic-mangle2.C: Add non-member.
	* g++.dg/cpp0x/variadic-mangle4.C: New test.
	* g++.dg/cpp0x/variadic-mangle5.C: New test.
	* g++.dg/cpp0x/variadic-mangle5a.C: New test.
2023-12-21 19:19:50 -05:00
Jason Merrill
2fa122cae5 testsuite: suppress mangling compatibility aliases
Recently a mangling test failed on a target with no mangling alias support
because I hadn't updated the expected mangling, but it was still passing on
x86_64-pc-linux-gnu because of the alias for the old mangling.  So let's
avoid these aliases in mangling tests.

gcc/testsuite/ChangeLog:

	* g++.dg/abi/mangle-arm-crypto.C: Specify -fabi-compat-version.
	* g++.dg/abi/mangle-concepts1.C
	* g++.dg/abi/mangle-neon-aarch64.C
	* g++.dg/abi/mangle-neon.C
	* g++.dg/abi/mangle-regparm.C
	* g++.dg/abi/mangle-regparm1a.C
	* g++.dg/abi/mangle-ttp1.C
	* g++.dg/abi/mangle-union1.C
	* g++.dg/abi/mangle1.C
	* g++.dg/abi/mangle13.C
	* g++.dg/abi/mangle15.C
	* g++.dg/abi/mangle16.C
	* g++.dg/abi/mangle18-1.C
	* g++.dg/abi/mangle19-1.C
	* g++.dg/abi/mangle20-1.C
	* g++.dg/abi/mangle22.C
	* g++.dg/abi/mangle23.C
	* g++.dg/abi/mangle24.C
	* g++.dg/abi/mangle25.C
	* g++.dg/abi/mangle26.C
	* g++.dg/abi/mangle27.C
	* g++.dg/abi/mangle28.C
	* g++.dg/abi/mangle29.C
	* g++.dg/abi/mangle3-2.C
	* g++.dg/abi/mangle3.C
	* g++.dg/abi/mangle30.C
	* g++.dg/abi/mangle31.C
	* g++.dg/abi/mangle32.C
	* g++.dg/abi/mangle33.C
	* g++.dg/abi/mangle34.C
	* g++.dg/abi/mangle35.C
	* g++.dg/abi/mangle36.C
	* g++.dg/abi/mangle37.C
	* g++.dg/abi/mangle39.C
	* g++.dg/abi/mangle40.C
	* g++.dg/abi/mangle43.C
	* g++.dg/abi/mangle44.C
	* g++.dg/abi/mangle45.C
	* g++.dg/abi/mangle46.C
	* g++.dg/abi/mangle47.C
	* g++.dg/abi/mangle48.C
	* g++.dg/abi/mangle49.C
	* g++.dg/abi/mangle5.C
	* g++.dg/abi/mangle50.C
	* g++.dg/abi/mangle51.C
	* g++.dg/abi/mangle52.C
	* g++.dg/abi/mangle53.C
	* g++.dg/abi/mangle54.C
	* g++.dg/abi/mangle55.C
	* g++.dg/abi/mangle56.C
	* g++.dg/abi/mangle57.C
	* g++.dg/abi/mangle58.C
	* g++.dg/abi/mangle59.C
	* g++.dg/abi/mangle6.C
	* g++.dg/abi/mangle60.C
	* g++.dg/abi/mangle61.C
	* g++.dg/abi/mangle62.C
	* g++.dg/abi/mangle62a.C
	* g++.dg/abi/mangle63.C
	* g++.dg/abi/mangle64.C
	* g++.dg/abi/mangle65.C
	* g++.dg/abi/mangle66.C
	* g++.dg/abi/mangle68.C
	* g++.dg/abi/mangle69.C
	* g++.dg/abi/mangle7.C
	* g++.dg/abi/mangle70.C
	* g++.dg/abi/mangle71.C
	* g++.dg/abi/mangle72.C
	* g++.dg/abi/mangle73.C
	* g++.dg/abi/mangle74.C
	* g++.dg/abi/mangle75.C
	* g++.dg/abi/mangle76.C
	* g++.dg/abi/mangle77.C
	* g++.dg/abi/mangle78.C
	* g++.dg/abi/mangle8.C
	* g++.dg/abi/mangle9.C: Likewise.
2023-12-21 19:19:34 -05:00
GCC Administrator
cdfaa4aa52 Daily bump. 2023-12-22 00:18:02 +00:00
Arsen Arsenović
ec2ec24a4d
libstdc++: implement std::generator
libstdc++-v3/ChangeLog:

	* include/Makefile.am: Install std/generator, bits/elements_of.h
	as freestanding.
	* include/Makefile.in: Regenerate.
	* include/bits/version.def: Add __cpp_lib_generator.
	* include/bits/version.h: Regenerate.
	* include/precompiled/stdc++.h: Include <generator>.
	* include/std/ranges: Include bits/elements_of.h
	* include/bits/elements_of.h: New file.
	* include/std/generator: New file.
	* testsuite/24_iterators/range_generators/01.cc: New test.
	* testsuite/24_iterators/range_generators/02.cc: New test.
	* testsuite/24_iterators/range_generators/copy.cc: New test.
	* testsuite/24_iterators/range_generators/except.cc: New test.
	* testsuite/24_iterators/range_generators/synopsis.cc: New test.
	* testsuite/24_iterators/range_generators/subrange.cc: New test.
2023-12-21 22:59:22 +01:00
Arsen Arsenović
a6bbaab273
libstdc++: add missing include in ranges_util.h
libstdc++-v3/ChangeLog:

	* include/bits/ranges_util.h: Add missing <bits/invoke.h>
	include.
2023-12-21 22:54:28 +01:00
Andrew Pinski
df5df10355 Document cond_copysign and cond_len_copysign optabs [PR112951]
This adds the documentation for cond_copysign and cond_len_copysign optabs.
Also reorders the optabs.def to be in the similar order as how the internal
function was done.

gcc/ChangeLog:

	PR middle-end/112951
	* doc/md.texi (cond_copysign): Document.
	(cond_len_copysign): Likewise.
	* optabs.def: Reorder cond_copysign to be before
	cond_fmin. Likewise for cond_len_copysign.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2023-12-21 12:23:17 -08:00
Patrick Palka
619a9539ee c++: fix -Wparentheses for bool-like class types
Since r14-4977-g0f2e2080685e75 we now issue a -Wparentheses warning for

  extern std::vector<bool> v;
  bool b = v[0] = true; // warning: suggest parentheses around assignment used as truth value [-Wparentheses]

I intended for that commit to just allow the existing diagnostics to
happen in a template context as well, but the refactoring of
is_assignment_op_expr_p caused us for this -Wparentheses warning from
convert_for_assignment to now consider user-defined operator= expressions
instead of just built-in operator=.  And since std::vector<bool> is really
a bitset, whose operator[] returns a class type with such a user-defined
operator= (taking bool), we now warn here when we didn't use to.

That we now accept user-defined operator= expressions is generally good,
but arguably "boolish" class types should be treated like ordinary bool
as far as the warning is concerned.  To that end this patch suppresses
the warning for such types, specifically when the class type can be
implicitly converted to and assigned from bool.  This criterion captures
the std::vector<bool>::reference of libstdc++ at least.

gcc/cp/ChangeLog:

	* cp-tree.h (maybe_warn_unparenthesized_assignment): Add
	'nested_p' bool parameter.
	* semantics.cc (boolish_class_type_p_cache): Define.
	(boolish_class_type_p): Define.
	(maybe_warn_unparenthesized_assignment): Add 'nested_p'
	bool parameter.  Suppress the warning for nested assignments
	to bool and bool-like class types.
	(maybe_convert_cond): Pass nested_p=false to
	maybe_warn_unparenthesized_assignment.
	* typeck.cc (convert_for_assignment): Pass nested_p=true to
	maybe_warn_unparenthesized_assignment.  Remove now redundant
	check for 'rhs' having bool type.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wparentheses-34.C: New test.
2023-12-21 15:00:55 -05:00
Patrick Palka
9a65c8ee65 c++: [[deprecated]] on template redecl [PR84542]
The deprecated and unavailable attributes weren't working when used on
a template redeclaration ultimately because we weren't merging the
corresponding tree flags in duplicate_decls.

	PR c++/84542

gcc/cp/ChangeLog:

	* decl.cc (merge_attribute_bits): Merge TREE_DEPRECATED
	and TREE_UNAVAILABLE.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/attr-deprecated-2.C: No longer XFAIL.
	* g++.dg/ext/attr-unavailable-12.C: New test.
2023-12-21 14:33:56 -05:00
Patrick Palka
7226f825db c++: visibility wrt template and ptrmem targs [PR70413]
When constraining the visibility of an instantiation, we weren't
properly considering the visibility of PTRMEM_CST and TEMPLATE_DECL
template arguments.

This patch fixes this.  It turns out we don't maintain the relevant
visibility flags for alias templates (e.g. TREE_PUBLIC is never set),
so continue to ignore alias template template arguments for now.

	PR c++/70413
	PR c++/107906

gcc/cp/ChangeLog:

	* decl2.cc (min_vis_expr_r): Handle PTRMEM_CST and TEMPLATE_DECL
	other than those for alias templates.

gcc/testsuite/ChangeLog:

	* g++.dg/template/linkage2.C: New test.
	* g++.dg/template/linkage3.C: New test.
	* g++.dg/template/linkage4.C: New test.
	* g++.dg/template/linkage4a.C: New test.
2023-12-21 13:53:43 -05:00
Andre Vieira (lists)
135bb9e371 omp: Fix simdclone arguments with veclen lower than simdlen [PR113040]
This patch fixes an issue introduced by:
commit ea4a3d08f1
Author: Andre Vieira <andre.simoesdiasvieira@arm.com>
Date:   Wed Nov 1 17:02:41 2023 +0000

     omp: Reorder call for TARGET_SIMD_CLONE_ADJUST

The problem was that after this patch we no longer added multiple
arguments for vector arguments where the veclen was lower than the simdlen.

Bootstrapped and regression tested on x86_64-pc-linux-gnu and
aarch64-unknown-linux-gnu.

gcc/ChangeLog:

	PR middle-end/113040
	* omp-simd-clone.cc (simd_clone_adjust_argument_types): Add multiple
	vector arguments where simdlen is larger than veclen.
2023-12-21 10:36:29 -08:00
Uros Bizjak
2766b83759 i386: Fix shifts with high register input operand [PR113044]
The move to the output operand should use high register input operand.

	PR target/113044

gcc/ChangeLog:

	* config/i386/i386.md (*ashlqi_ext<mode>_1): Move from the
	high register of the input operand.
	(*<insn>qi_ext<mode>_1): Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr113044.c: New test.
2023-12-21 15:58:03 +01:00
Vladimir N. Makarov
be977db17c Revert "[PR112918][LRA]: Fixing IRA ICE on m68k"
This reverts commit 989e67f827.
2023-12-21 09:38:43 -05:00
Julian Brown
144c531fe2 OpenMP/OpenACC: Reorganise OMP map clause handling in gimplify.cc
This patch has been separated out from the C++ "declare mapper"
support patch.  It contains just the gimplify.cc rearrangement
work, mostly moving gimplification from gimplify_scan_omp_clauses
to gimplify_adjust_omp_clauses for map clauses.

The motivation for doing this was that we don't know if we need to
instantiate mappers implicitly until the body of an offload region has
been scanned, i.e. in gimplify_adjust_omp_clauses, but we also need the
un-gimplified form of clauses to sort by base-pointer dependencies after
mapper instantiation has taken place.

The patch also reimplements the "present" clause sorting code to avoid
another sorting pass on mapping nodes.

This version of the patch is based on the version posted for og13, and
additionally incorporates a follow-on fix for DECL_VALUE_EXPR handling
in gimplify_adjust_omp_clauses:

"OpenMP/OpenACC: Reorganise OMP map clause handling in gimplify.cc"
https://gcc.gnu.org/pipermail/gcc-patches/2023-June/622223.html

Parts of:
"OpenMP: OpenMP 5.2 semantics for pointers with unmapped target"
https://gcc.gnu.org/pipermail/gcc-patches/2023-June/623351.html

2023-12-16  Julian Brown  <julian@codesourcery.com>

gcc/
	* gimplify.cc (omp_segregate_mapping_groups): Handle "present" groups.
	(gimplify_scan_omp_clauses): Use mapping group functionality to
	iterate through mapping nodes.  Remove most gimplification of
	OMP_CLAUSE_MAP nodes from here, but still populate ctx->variables
	splay tree.
	(gimplify_adjust_omp_clauses): Move most gimplification of
	OMP_CLAUSE_MAP nodes here.

libgomp/
	* testsuite/libgomp.fortran/target-enter-data-6.f90: Remove XFAIL.
2023-12-21 13:12:12 +00:00
Alex Coplan
aca1f9d7ca aarch64: Prevent moving throwing accesses in ldp/stp pass [PR113093]
As the PR shows, there was nothing to prevent the ldp/stp pass from
trying to move throwing insns, which lead to an RTL verification
failure.

This patch fixes that.

gcc/ChangeLog:

	PR target/113093
	* config/aarch64/aarch64-ldp-fusion.cc (latest_hazard_before):
	If the insn is throwing, record the previous insn as a hazard to
	prevent moving it from the end of the BB.

gcc/testsuite/ChangeLog:

	PR target/113093
	* gcc.dg/pr113093.c: New test.
2023-12-21 10:52:44 +00:00
Juzhe-Zhong
41a5f67db3 RISC-V: Add dynamic LMUL test for x264
When working on evaluating x264 performance, I notice the best LMUL for such case with -march=rv64gcv is LMUL = 2

LMUL = 1:

x264_pixel_8x8:
	add	a4,a1,a2
	addi	a6,a0,16
	vsetivli	zero,4,e8,mf4,ta,ma
	add	a5,a4,a2
	vle8.v	v12,0(a6)
	vle8.v	v2,0(a4)
	addi	a6,a0,4
	addi	a4,a4,4
	vle8.v	v11,0(a6)
	vle8.v	v9,0(a4)
	addi	a6,a1,4
	addi	a4,a0,32
	vle8.v	v13,0(a0)
	vle8.v	v1,0(a1)
	vle8.v	v4,0(a6)
	vle8.v	v8,0(a4)
	vle8.v	v7,0(a5)
	vwsubu.vv	v3,v13,v1
	add	a3,a5,a2
	addi	a6,a0,20
	addi	a4,a0,36
	vle8.v	v10,0(a6)
	vle8.v	v6,0(a4)
	addi	a5,a5,4
	vle8.v	v5,0(a5)
	vsetvli	zero,zero,e16,mf2,ta,mu
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v1,v12,v2
	vsetvli	zero,zero,e16,mf2,ta,mu
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vmv1r.v	v2,v1
	vwadd.vv	v1,v3,v2
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v2,v11,v4
	vsetvli	zero,zero,e16,mf2,ta,mu
	vmslt.vi	v0,v2,0
	vneg.v	v2,v2,v0.t
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v3,v10,v9
	vsetvli	zero,zero,e16,mf2,ta,mu
	vmv1r.v	v4,v2
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.vv	v2,v4,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v3,v8,v7
	vsetvli	zero,zero,e16,mf2,ta,mu
	add	a4,a3,a2
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.wv	v1,v1,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	add	a5,a4,a2
	vwsubu.vv	v3,v6,v5
	addi	a6,a0,48
	vsetvli	zero,zero,e16,mf2,ta,mu
	vle8.v	v16,0(a3)
	vle8.v	v12,0(a4)
	addi	a3,a3,4
	addi	a4,a4,4
	vle8.v	v17,0(a6)
	vle8.v	v14,0(a3)
	vle8.v	v10,0(a4)
	vle8.v	v8,0(a5)
	add	a6,a5,a2
	addi	a3,a0,64
	addi	a4,a0,80
	addi	a5,a5,4
	vle8.v	v13,0(a3)
	vle8.v	v4,0(a5)
	vle8.v	v9,0(a4)
	vle8.v	v6,0(a6)
	vmslt.vi	v0,v3,0
	addi	a7,a0,52
	vneg.v	v3,v3,v0.t
	vle8.v	v15,0(a7)
	vwadd.wv	v2,v2,v3
	addi	a3,a0,68
	addi	a4,a0,84
	vle8.v	v11,0(a3)
	vle8.v	v5,0(a4)
	addi	a5,a0,96
	vle8.v	v7,0(a5)
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v3,v17,v16
	vsetvli	zero,zero,e16,mf2,ta,mu
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.wv	v1,v1,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v3,v15,v14
	vsetvli	zero,zero,e16,mf2,ta,mu
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.wv	v2,v2,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	vwsubu.vv	v3,v13,v12
	vsetvli	zero,zero,e16,mf2,ta,mu
	slli	a4,a2,3
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.wv	v1,v1,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	sub	a4,a4,a2
	vwsubu.vv	v3,v11,v10
	vsetvli	zero,zero,e16,mf2,ta,mu
	add	a1,a1,a4
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.wv	v2,v2,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	lbu	a7,0(a1)
	vwsubu.vv	v3,v9,v8
	lbu	a5,112(a0)
	vsetvli	zero,zero,e16,mf2,ta,mu
	subw	a5,a5,a7
	vmslt.vi	v0,v3,0
	lbu	a3,113(a0)
	vneg.v	v3,v3,v0.t
	lbu	a4,1(a1)
	vwadd.wv	v1,v1,v3
	addi	a6,a6,4
	vsetvli	zero,zero,e8,mf4,ta,ma
	subw	a3,a3,a4
	vwsubu.vv	v3,v5,v4
	addi	a2,a0,100
	vsetvli	zero,zero,e16,mf2,ta,mu
	vle8.v	v4,0(a6)
	sraiw	a6,a5,31
	vle8.v	v5,0(a2)
	sraiw	a7,a3,31
	vmslt.vi	v0,v3,0
	xor	a2,a5,a6
	vneg.v	v3,v3,v0.t
	vwadd.wv	v2,v2,v3
	vsetvli	zero,zero,e8,mf4,ta,ma
	lbu	a4,114(a0)
	vwsubu.vv	v3,v7,v6
	lbu	t1,2(a1)
	vsetvli	zero,zero,e16,mf2,ta,mu
	subw	a2,a2,a6
	xor	a6,a3,a7
	vmslt.vi	v0,v3,0
	subw	a4,a4,t1
	vneg.v	v3,v3,v0.t
	lbu	t1,3(a1)
	vwadd.wv	v1,v1,v3
	lbu	a5,115(a0)
	subw	a6,a6,a7
	vsetvli	zero,zero,e8,mf4,ta,ma
	li	a7,0
	vwsubu.vv	v3,v5,v4
	sraiw	t3,a4,31
	vsetvli	zero,zero,e16,mf2,ta,mu
	subw	a5,a5,t1
	vmslt.vi	v0,v3,0
	vneg.v	v3,v3,v0.t
	vwadd.wv	v2,v2,v3
	sraiw	t1,a5,31
	vsetvli	zero,zero,e32,m1,ta,ma
	xor	a4,a4,t3
	vadd.vv	v1,v1,v2
	vmv.s.x	v2,a7
	vredsum.vs	v1,v1,v2
	vmv.x.s	a7,v1
	addw	a2,a7,a2
	subw	a4,a4,t3
	addw	a6,a6,a2
	xor	a2,a5,t1
	lbu	a3,116(a0)
	lbu	t4,4(a1)
	addw	a4,a4,a6
	subw	a2,a2,t1
	lbu	a5,5(a1)
	subw	a3,a3,t4
	addw	a2,a2,a4
	lbu	a4,117(a0)
	lbu	t1,6(a1)
	sraiw	a7,a3,31
	subw	a4,a4,a5
	lbu	a5,118(a0)
	sraiw	a6,a4,31
	subw	a5,a5,t1
	xor	a3,a3,a7
	lbu	t1,7(a1)
	lbu	a0,119(a0)
	sraiw	a1,a5,31
	subw	a0,a0,t1
	subw	a3,a3,a7
	xor	a4,a4,a6
	addw	a3,a3,a2
	subw	a4,a4,a6
	sraiw	a2,a0,31
	xor	a5,a5,a1
	addw	a4,a4,a3
	subw	a5,a5,a1
	xor	a0,a0,a2
	addw	a5,a5,a4
	subw	a0,a0,a2
	addw	a0,a0,a5
	ret

LMUL = dynamic

x264_pixel_8x8:
	add	a7,a1,a2
	vsetivli	zero,8,e8,mf2,ta,ma
	add	a6,a7,a2
	vle8.v	v1,0(a1)
	add	a3,a6,a2
	vle8.v	v2,0(a7)
	add	a4,a3,a2
	vle8.v	v13,0(a0)
	vle8.v	v7,0(a4)
	vwsubu.vv	v4,v13,v1
	vle8.v	v11,0(a6)
	vle8.v	v9,0(a3)
	add	a5,a4,a2
	addi	t1,a0,16
	vle8.v	v5,0(a5)
	vle8.v	v3,0(t1)
	addi	a7,a0,32
	addi	a6,a0,48
	vle8.v	v12,0(a7)
	vle8.v	v10,0(a6)
	addi	a3,a0,64
	addi	a4,a0,80
	vle8.v	v8,0(a3)
	vle8.v	v6,0(a4)
	vsetvli	zero,zero,e16,m1,ta,mu
	vmslt.vi	v0,v4,0
	vneg.v	v4,v4,v0.t
	vsetvli	zero,zero,e8,mf2,ta,ma
	vwsubu.vv	v1,v3,v2
	vsetvli	zero,zero,e16,m1,ta,mu
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vwadd.vv	v2,v4,v1
	vsetvli	zero,zero,e8,mf2,ta,ma
	vwsubu.vv	v1,v12,v11
	vsetvli	zero,zero,e16,m1,ta,mu
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vwadd.wv	v2,v2,v1
	vsetvli	zero,zero,e8,mf2,ta,ma
	vwsubu.vv	v1,v10,v9
	vsetvli	zero,zero,e16,m1,ta,mu
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vwadd.wv	v2,v2,v1
	vsetvli	zero,zero,e8,mf2,ta,ma
	vwsubu.vv	v1,v8,v7
	vsetvli	zero,zero,e16,m1,ta,mu
	slli	a4,a2,3
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vwadd.wv	v2,v2,v1
	vsetvli	zero,zero,e8,mf2,ta,ma
	sub	a4,a4,a2
	vwsubu.vv	v1,v6,v5
	vsetvli	zero,zero,e16,m1,ta,mu
	addi	a3,a0,96
	vmslt.vi	v0,v1,0
	vle8.v	v7,0(a3)
	vneg.v	v1,v1,v0.t
	add	a5,a5,a2
	vwadd.wv	v2,v2,v1
	vle8.v	v6,0(a5)
	addi	a0,a0,112
	add	a1,a1,a4
	vle8.v	v5,0(a0)
	vle8.v	v4,0(a1)
	vsetvli	zero,zero,e8,mf2,ta,ma
	vwsubu.vv	v1,v7,v6
	vsetvli	zero,zero,e16,m1,ta,mu
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vwadd.wv	v2,v2,v1
	vsetvli	zero,zero,e32,m2,ta,ma
	li	a5,0
	vmv.s.x	v1,a5
	vredsum.vs	v1,v2,v1
	vmv.x.s	a0,v1
	vsetvli	zero,zero,e8,mf2,ta,ma
	vwsubu.vv	v1,v5,v4
	vsetvli	zero,zero,e16,m1,ta,mu
	vmslt.vi	v0,v1,0
	vneg.v	v1,v1,v0.t
	vsetivli	zero,1,e32,m1,ta,ma
	vmv.s.x	v2,a5
	vsetivli	zero,8,e16,m1,ta,ma
	vwredsumu.vs	v1,v1,v2
	vsetivli	zero,0,e32,m1,ta,ma
	vmv.x.s	a5,v1
	addw	a0,a0,a5
	ret

I notice we have much better codegen and performance improvement gain with --param=riscv-autovec-lmul=dynamic
which is able to pick the best LMUL (M2).

Add test avoid future somebody potential destroy performance on X264.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-7.c: New test.
2023-12-21 18:43:41 +08:00
Jakub Jelinek
b99353c33f Fix -Wcalloc-transposed-args warning in collect2.cc and work around -Walloc-size warning
This fixes one warning and works around another one where we allocate less than
what we cast to.

2023-12-21  Jakub Jelinek  <jakub@redhat.com>

	* gimple-fold.cc (maybe_fold_comparisons_from_match_pd):
	Use unsigned char buffers for lhs1 and lhs2 instead of allocating
	them through XALLOCA.
	* collect2.cc (maybe_run_lto_and_relink): Swap xcalloc arguments.
2023-12-21 11:21:40 +01:00
Richard Sandiford
803d222e53 aarch64: Fix early RA handling of deleted insns [PR113094]
The testcase constructs a sequence of insns that are fully dead
and yet (due to forced options) are not removed as such.  This
triggered a case where we would emit a meaningless reload for a
to-be-deleted insn.

We can't delete the insns first because that might disrupt the
iteration ranges.  So this patch turns them into notes before
the walk and then continues to delete them properly afterwards.

gcc/
	PR target/113094
	* config/aarch64/aarch64-early-ra.cc (apply_allocation): Stub
	out instructions that are going to be deleted before iterating
	over the rest.

gcc/testsuite/
	PR target/113094
	* gcc.target/aarch64/pr113094.c: New test.
2023-12-21 10:20:19 +00:00
Richard Sandiford
81dfa84e35 aarch64: Fix cut-&-pasto in early RA pass [PR112948]
As the PR notes, there was a cut-&-pasto in find_strided_accesses.
I've not been able to find a testcase that shows the problem.

gcc/
	PR target/112948
	* config/aarch64/aarch64-early-ra.cc (find_strided_accesses): Fix
	cut-&-pasto.
2023-12-21 10:20:19 +00:00
Jakub Jelinek
b9dc16cbe2 c++: Enable -Walloc-size and -Wcalloc-transposed-args warnings for C++
The following patch enables the -Walloc-size and -Wcalloc-transposed-args
warnings for C++ as well.

Tracking just 6 arguments for SIZEOF_EXPR for the calloc purposes
is because I see alloc_size 1,2, 2,3 and 3,4 pairs used in the wild,
so we need at least 5 to cover that rather than 3, and don't want to waste
too much compile time/memory for that.

2023-12-21  Jakub Jelinek  <jakub@redhat.com>

gcc/c-family/
	* c.opt (Walloc-size): Enable also for C++ and ObjC++.
gcc/cp/
	* cp-gimplify.cc (cp_genericize_r): If warn_alloc_size, call
	warn_for_alloc_size for -Walloc-size diagnostics.
	* semantics.cc (finish_call_expr): If warn_calloc_transposed_args,
	call warn_for_calloc for -Wcalloc-transposed-args diagnostics.
gcc/testsuite/
	* g++.dg/warn/Walloc-size-1.C: New test.
	* g++.dg/warn/Wcalloc-transposed-args-1.C: New test.
2023-12-21 11:17:08 +01:00
Jakub Jelinek
0e7f5039c5 ubsan: Add workaround for missing bitint libubsan support for shifts [PR113092]
libubsan still doesn't support bitints, so ubsan contains a workaround and
emits value 0 and TK_Unknown kind for those.  If shift second operand has
the large/huge _BitInt type, this results in internal errors in libubsan
though, so the following patch provides a temporary workaround for that
- in the rare case where the last operand has _BitInt type wider than
__int128 (or long long on 32-bit arches), it will pretend the shift count
has that type saturated to its range.  IMHO better than crashing in
the library.  If the value fits into the __int128 (or long long) range,
it will be printed correctly (just print that it has __int128/long long
type rather than say _BitInt(255)), if it doesn't, user will at least
know that it is a very large negative or very large positive value.

2023-12-21  Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/113092
	* c-ubsan.cc (ubsan_instrument_shift): Workaround for missing
	ubsan _BitInt support for the shift count.

	* gcc.dg/ubsan/bitint-4.c: New test.
2023-12-21 11:16:02 +01:00
Jakub Jelinek
3d1bdbf64c lower-bitint: Avoid nested casts in muldiv/float operands [PR112941]
Multiplication/division/modulo/float operands are handled by libgcc calls
and so need to be passed as array of limbs with precision argument,
using handle_operand_addr.  That code can't deal with more than one cast,
so the following patch avoids merging those cases.
.MUL_OVERFLOW calls use the same code, but we don't actually try to merge
the operands in that case already.

2023-12-21  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/112941
	* gimple-lower-bitint.cc (gimple_lower_bitint): Disallow merging
	a cast with multiplication, division or conversion to floating point
	if rhs1 of the cast is result of another single use cast in the same
	bb.

	* gcc.dg/bitint-56.c: New test.
	* gcc.dg/bitint-57.c: New test.
2023-12-21 11:13:42 +01:00
chenxiaolong
297ed1ac52 LoongArch: Fix builtin function prototypes for LASX in doc.
gcc/ChangeLog:

	* doc/extend.texi:According to the documents submitted earlier,
	Two problems with function return types and using the actual types
	of parameters instead of variable names were found and fixed.
2023-12-21 17:42:23 +08:00
Jiajie Chen
84ad1b5303 LoongArch: extend.texi: Fix typos in LSX intrinsics
Several typos have been found and fixed: missing semicolons, using
variable name instead of type, duplicate functions and wrong types.

gcc/ChangeLog:

	* doc/extend.texi(__lsx_vabsd_di): remove extra `i' in name.
	(__lsx_vfrintrm_d, __lsx_vfrintrm_s, __lsx_vfrintrne_d,
	__lsx_vfrintrne_s, __lsx_vfrintrp_d, __lsx_vfrintrp_s, __lsx_vfrintrz_d,
	__lsx_vfrintrz_s): fix return types.
	(__lsx_vld, __lsx_vldi, __lsx_vldrepl_b, __lsx_vldrepl_d,
	__lsx_vldrepl_h, __lsx_vldrepl_w, __lsx_vmaxi_b, __lsx_vmaxi_d,
	__lsx_vmaxi_h, __lsx_vmaxi_w, __lsx_vmini_b, __lsx_vmini_d,
	__lsx_vmini_h, __lsx_vmini_w, __lsx_vsrani_d_q, __lsx_vsrarni_d_q,
	__lsx_vsrlni_d_q, __lsx_vsrlrni_d_q, __lsx_vssrani_d_q,
	__lsx_vssrarni_d_q, __lsx_vssrarni_du_q, __lsx_vssrlni_d_q,
	__lsx_vssrlrni_du_q, __lsx_vst, __lsx_vstx, __lsx_vssrani_du_q,
	__lsx_vssrlni_du_q, __lsx_vssrlrni_d_q): add missing semicolon.
	(__lsx_vpickve2gr_bu, __lsx_vpickve2gr_hu): fix typo in return
	type.
	(__lsx_vstelm_b, __lsx_vstelm_d, __lsx_vstelm_h,
	__lsx_vstelm_w): use imm type for the last argument.
	(__lsx_vsigncov_b, __lsx_vsigncov_h, __lsx_vsigncov_w,
	__lsx_vsigncov_d): remove duplicate definitions.
2023-12-21 17:42:07 +08:00
chenxiaolong
555ecd30c1 LoongArch: Modify the check type of the vector builtin function.
On LoongArch architecture, using the latest gcc14 in regression test,
it is found that the vector test cases in vector directory appear FAIL
entries with unmatched pointer types. In order to solve this kind of
problem, the type of the variable in the check result is modified with
the parameter type defined in the vector builtin function.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/vector/simd_correctness_check.h:The variable
	types in the check results are modified in conjunction with the
	parameter types defined in the vector builtin function.
2023-12-21 17:21:21 +08:00
Jiahao Xu
92045913b2 LoongArch: Fix incorrect code generation for sad pattern
When I attempt to enable vect_usad_char effective target for LoongArch, slp-reduc-sad.c
and vect-reduc-sad*.c tests fail. These tests fail because the sad pattern generates bad
code. This patch to fixed them, for sad patterns, use zero expansion instead of sign
expansion for reduction.

Currently, we are fixing failed vectorized tests, and in the future, we will
enable more tests of "vect" for LoongArch.

gcc/ChangeLog:

	* config/loongarch/lasx.md: Use zero expansion instruction.
	* config/loongarch/lsx.md: Ditto.
2023-12-21 17:21:11 +08:00
Martin Uecker
140aa2cdf9 c23: aliasing of compatible tagged types
Tell the backend which types are equivalent by setting
TYPE_CANONICAL to one struct in the set of equivalent
structs.  Structs are considered equivalent by ignoring
all sizes of arrays nested in types below field level.

The following two structs are incompatible and lvalues
with these types can be assumed not to alias:

 struct foo { int a[3]; };
 struct foo { int a[4]; };

The following two structs are also incompatible, but
will get the same TYPE_CANONICAL and it is then not
exploited that lvalues with those types can not alias:

 struct bar { int (*p)[3]; };
 struct bar { int (*p)[4]; };

The reason is that both are compatible to

 struct bar { int (*p)[]; };

and therefore are in the same equivalence class.  For
the same reason all enums with the same underyling type
are in the same equivalence class.  Tests are added
for the expected aliasing behavior with optimization.

gcc/c:
	* c-decl.cc (c_struct_hasher): Hash stable for struct
	types.
	(c_struct_hasher::hash, c_struct_hasher::equal): New
	functions.
	(finish_struct): Set TYPE_CANONICAL to first struct in
	equivalence class.
	* c-objc-common.cc (c_get_alias_set): Let structs or
	unions with variable size alias anything.
	* c-tree.h (comptypes_equiv): New prototype.
	* c-typeck.cc (comptypes_equiv): New function.
	(comptypes_internal): Implement equivalence mode.
	(tagged_types_tu_compatible): Implement equivalence mode.

gcc/testsuite:
	* gcc.dg/c23-tag-2.c: Activate.
	* gcc.dg/c23-tag-5.c: Activate.
	* gcc.dg/c23-tag-alias-1.c: New test.
	* gcc.dg/c23-tag-alias-2.c: New test.
	* gcc.dg/c23-tag-alias-3.c: New test.
	* gcc.dg/c23-tag-alias-4.c: New test.
	* gcc.dg/c23-tag-alias-5.c: New test.
	* gcc.dg/gnu23-tag-alias-1.c: New test.
	* gcc.dg/gnu23-tag-alias-2.c: New test.
	* gcc.dg/gnu23-tag-alias-3.c: New test.
	* gcc.dg/gnu23-tag-alias-4.c: New test.
	* gcc.dg/gnu23-tag-alias-5.c: New test.
	* gcc.dg/gnu23-tag-alias-6.c: New test.
	* gcc.dg/gnu23-tag-alias-7.c: New test.
2023-12-21 08:43:16 +01:00
Martin Uecker
ced651b775 c23: tag compatibility rules for enums
Allow redefinition of enum types and enumerators.  Diagnose
nested redefinitions including redefinitions in the enum
specifier for enum types with fixed underlying type.

gcc/c:
	* c-tree.h (c_parser_enum_specifier): Add parameter.
	* c-decl.cc (start_enum): Allow redefinition.
	(finish_enum): Diagnose conflicts.
	(build_enumerator): Set context.
	(diagnose_mismatched_decls): Diagnose conflicting enumerators.
	(push_decl): Preserve context for enumerators.
	* c-typeck.cc (tagged_types_tu_compatible_p): Adapt.
	* c-parser.cc (c_parser_enum_specifier): Remember when
	seen is from an enum type which is not yet defined.

gcc/testsuite:
	* gcc.dg/c23-tag-enum-1.c: New test.
	* gcc.dg/c23-tag-enum-2.c: New test.
	* gcc.dg/c23-tag-enum-3.c: New test.
	* gcc.dg/c23-tag-enum-4.c: New test.
	* gcc.dg/c23-tag-enum-5.c: New test.
	* gcc.dg/gnu23-tag-enum-1.c: Mew test.
2023-12-21 08:43:16 +01:00
Martin Uecker
23fee88f84 c23: tag compatibility rules for struct and unions
Implement redeclaration and compatibility rules for
structures and unions in C23.

gcc/c/:
	* c-decl.cc (previous_tag): New function.
	(parser_xref_tag): Find earlier definition.
	(get_parm_info): Turn off warning for C23.
	(start_struct): Allow redefinitons.
	(finish_struct): Diagnose conflicts.
	* c-tree.h (comptypes_same_p): Add prototype.
	* c-typeck.cc (comptypes_same_p): New function.
	(comptypes_internal): Activate comparison of tagged types.
	(convert_for_assignment): Ignore qualifiers.
	(digest_init): Add error.
	(initialized_elementwise_p): Allow compatible types.

gcc/testsuite/:
	* gcc.dg/c23-enum-7.c: Remove warning.
	* gcc.dg/c23-tag-1.c: New test.
	* gcc.dg/c23-tag-2.c: New deactivated test.
	* gcc.dg/c23-tag-3.c: New test.
	* gcc.dg/c23-tag-4.c: New test.
	* gcc.dg/c23-tag-5.c: New deactivated test.
	* gcc.dg/c23-tag-6.c: New test.
	* gcc.dg/c23-tag-7.c: New test.
	* gcc.dg/c23-tag-8.c: New test.
	* gcc.dg/gnu23-tag-1.c: New test.
	* gcc.dg/gnu23-tag-2.c: New test.
	* gcc.dg/gnu23-tag-3.c: New test.
	* gcc.dg/gnu23-tag-4.c: New test.
	* gcc.dg/pr112488-2.c: Remove warning.
2023-12-21 08:43:10 +01:00
Alexandre Oliva
514ea1df44 -finline-stringops: drop obsolete comment [PR112778]
When fixing the PR, I failed to remove the comment that raised the
very concern that the PR confirmed, and that the earlier patch for the
PR fixed.


for  gcc/ChangeLog

	PR target/112778
	* builtins.cc (try_store_by_multiple_pieces): Drop obsolete
	comment.
2023-12-21 03:21:23 -03:00
Kewen Lin
5fbc77726f sel-sched: Verify change before replacing dest in EXPR_INSN_RTX [PR112995]
PR112995 exposed one issue in current try_replace_dest_reg
that the result rtx insn after replace_dest_with_reg_in_expr
is probably unable to match any constraints.  Although there
are some checks on the changes onto dest or src of orig_insn,
none is performed on the EXPR_INSN_RTX.

Initially we have:

(insn 31 6 10 2 (set (reg/v:SI 9 9 [orig:119 c ] [119])
                     (reg/v:SI 64 0 [orig:119 c ] [119]))
                "test.i":5:5 555 {*movsi_internal1} ... )
...
(insn 25 10 27 2 (set (reg:DI 64 0 [135])
                      (sign_extend:DI
                         (reg/v:SI 9 9 [orig:119 c ] [119])))
                 "test.i":6:5 31 {extendsidi2} ...)

with moving up, we have:

(insn 46 0 0 (set (reg:DI 64 0 [135])
                  (sign_extend:DI
                      (reg/v:SI 64 0 [orig:119 c ] [119])))
                   31 {extendsidi2} ...)

in try_replace_dest_reg, we updated the above EXPR_INSN_RTX to:

(insn 48 0 0 (set (reg:DI 32 0)
                  (sign_extend:DI
                      (reg/v:SI 64 0 [orig:119 c ] [119])))
                   31 {extendsidi2} ...)

The dest (reg 64) is a VR (also VSX REG), the updating makes
it become to (reg 32) which is a FPR (also VSX REG), we have
an alternative to match "VR,VR" but no one to match "FPR/VSX,
VR/VSX", so it fails with ICE.

This patch is to add the check before actually replacing dest
in expr with reg.

	PR rtl-optimization/112995

gcc/ChangeLog:

	* sel-sched.cc (try_replace_dest_reg): Check the validity of the
	replaced insn before actually replacing dest in expr.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pr112995.c: New test.
2023-12-20 23:32:05 -06:00
Alexandre Oliva
586e32583a compare_tests: distinguish c-c++-common results by tool
When compare_tests compares both C and C++ tests in c-c++-common, they
get the same identifier, so expected differences in results across
languages become undesirably noisy.

This patch adds tool identifiers to tests, so that runs by different
tools are not confused by the compare logic.

It also fixes a bug in reporting differences, that would attempt to
print an undefined fname (the definitions are in subshell loops), and
adjusts the target insertion to match tabs in addition to blanks after
colons.


for  contrib/ChangeLog

	* compare_tests: Add tool to test lines.  Match tabs besides
	blanks to insert tool and target.  Don't print undefined fname.
2023-12-21 01:02:41 -03:00
Kewen Lin
ef259ebeb3 sched: Remove debug counter sched_block
Currently the debug counter sched_block doesn't work well
since we create dependencies for some insns and those
dependencies are expected to be resolved during scheduling
insns but they can get skipped once we are skipping some
block while respecting sched_block debug counter.

For example, for the below test case:
--
int a, b, c, e, f;
float d;

void
g ()
{
  float h, i[1];
  for (; f;)
    if (c)
      {
	d *e;
	if (b)
	  {
	    float *j = i;
	    j[0] = 0;
	  }
	h = d;
      }
  if (h)
    a = i[0];
}
--
ICE occurs with option "-O2 -fdbg-cnt=sched_block:1".

As the discussion in [1], it seems that we think this debug
counter is useless and can be removed.  It's also implied
that if it's useful and used often, the above issue should
have been cared about and resolved earlier.  So this patch
is to remove this debug counter.

[1] https://gcc.gnu.org/pipermail/gcc-patches/2023-November/635852.html

gcc/ChangeLog:

	* dbgcnt.def (sched_block): Remove.
	* sched-rgn.cc (schedule_region): Remove the support of debug count
	sched_block.
2023-12-20 21:21:54 -06:00
Jason Merrill
4d9e0f3f21 c++: computed goto warning [PR37722]
PR37722 complains that a computed goto doesn't destroy objects that go out
of scope.  In the PR we agreed that it never will, but we can warn about
it.

	PR c++/37722

gcc/ChangeLog:

	* doc/extend.texi: Document that computed goto does not
	call destructors.

gcc/cp/ChangeLog:

	* decl.cc (identify_goto): Adjust for computed goto.
	(struct named_label_use_entry): Add computed_goto field.
	(poplevel_named_label_1): Add to computed_goto vec.
	(check_previous_goto_1): Dump computed_goto vec.
	(check_goto_1): Split out from check_goto.
	(check_goto): Check all addressable labels for computed goto.
	(struct named_label_entry): Add addressed field.
	(mark_label_addressed): New.
	* parser.cc (cp_parser_unary_expression): Call it.
	* cp-tree.h (mark_label_addressed): Declare it.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/label15.C: New test.
	* g++.dg/torture/pr42739.C: Expect warning.
2023-12-20 21:06:35 -05:00
Jason Merrill
32bab8b57d opts: -Werror=foo always implies -Wfoo [PR106213]
-Werror=foo implying -Wfoo wasn't working for -Wdeprecated-copy-dtor,
because it is specified as the value 2 of warn_deprecated_copy, which shows
up as CLVC_EQUAL, which is not one of the three var_types handled by
control_warning_option.  It seems to me that we can just unconditionally
handle_generated_option, and only have special argument handling for those
types.

	PR c++/106213

gcc/ChangeLog:

	* opts-common.cc (control_warning_option): Call
	handle_generated_option for all cl_var_types.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/depr-copy5.C: New test.
2023-12-20 21:06:35 -05:00
GCC Administrator
7ad9058c04 Daily bump. 2023-12-21 00:18:03 +00:00
Jason Merrill
af3fc03069 contrib: add git gcc-style alias
I thought it could be easier to use check_GNU_style.py.  With this alias,
'git gcc-style' will take a git revision as argument instead of a file, or
check HEAD if no argument is given.

contrib/ChangeLog:

	* gcc-git-customization.sh: Add git gcc-style alias.
2023-12-20 18:08:16 -05:00
Juzhe-Zhong
008b80e42e RISC-V: Optimize SELECT_VL codegen when length is known as smaller than VF
While trying to fix bugs of PR113097, notice this following situation we
generate redundant vsetvli

_255 = SELECT_VL (3, POLY_INT_CST [4, 4]);
COND_LEN (..., _255)

Before this patch:

vsetivli a5, 3...
...
vadd.vv (use a5)

After this patch:

...
vadd.vv (use AVL = 3)

The reason we can do this is because known_ge (3, [4,4]) is true.
It's safe to apply such optimization

Tested on both RV32 and RV64 full coverage testing, no regression.

	PR target/113087

gcc/ChangeLog:

	* config/riscv/riscv-v.cc (expand_select_vl): Optimize SELECT_VL.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr113087-2.c: New test.
2023-12-21 07:06:12 +08:00
Juzhe-Zhong
d82bb518fa RISC-V: Fix bug of VSETVL fusion
This patch fixes bugs in the fusion of this following case:

li a5,-1
vmv.s.x v0,a5 -> demand any non-zero AVL
vsetvli a5, ...

Incorrect fusion after VSETVL PASS:

li a5,-1
vsetvli a5...
vmv.s.x v0, a5 --> a5 is modified as incorrect value.

We disallow this incorrect fusion above.

Full coverage testing of RV64 and RV32 no regression.

	PR target/113087

gcc/ChangeLog:

	* config/riscv/riscv-vsetvl.cc: Disallow fusion when VL modification pollutes non AVL use.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr113087-1.c: New test.
2023-12-21 07:05:57 +08:00
Julian Brown
d7e9ae4fa9 OpenMP, NVPTX: memcpy[23]D bias correction
This patch works around behaviour of the 2D and 3D memcpy operations in
the CUDA driver runtime.  Particularly in Fortran, the "base pointer"
of an array (used for either source or destination of a host/device copy)
may lie outside of data that is actually stored on the device.  The fix
is to make sure that we use the first element of data to be transferred
instead, and adjust parameters accordingly.

2023-10-02  Julian Brown  <julian@codesourcery.com>

libgomp/
	* plugin/plugin-nvptx.c (GOMP_OFFLOAD_memcpy2d): Adjust parameters to
	avoid out-of-bounds array checks in CUDA runtime.
	(GOMP_OFFLOAD_memcpy3d): Likewise.
	* testsuite/libgomp.c-c++-common/memcpyxd-bias-1.c: New test.
2023-12-20 21:35:36 +00:00
Rimvydas Jasinskas
ba615557a4 Fortran: Use non conflicting file extensions for intermediates [PR81615]
gcc/ChangeLog:

	* doc/invoke.texi: Document the new file extensions

gcc/fortran/ChangeLog:

	PR fortran/81615
	* lang-specs.h (F951_CPP_OPTIONS): Do not hardcode ".f90" extension
	(F951_CPP_EXTENSION): Use .fi/.fii for fixed/free form sources
	* options.cc (form_from_filename): Handle the new extensions

Signed-off-by: Rimvydas Jasinskas <rimvydas.jas@gmail.com>
2023-12-20 20:22:54 +01:00
Richard Sandiford
08ab2293dc cse: Fix handling of fake vec_select sets [PR111702]
If cse sees:

  (set (reg R) (const_vector [A B ...]))

it creates fake sets of the form:

  (set R[0] A)
  (set R[1] B)
  ...

(with R[n] replaced by appropriate rtl) and then adds them to the tables
in the same way as for normal sets.  This allows a sequence like:

  (set (reg R2) A)
  ...(reg R2)...

to try to use R[0] instead of (reg R2).

But the pass was taking the analogy too far, and was trying to simplify
these fake sets based on costs.  That is, if there was an earlier:

  (set (reg T) A)

the pass would go to considerable effort trying to work out whether:

  (set R[0] A)

or:

  (set R[0] (reg T))

was more profitable.  This included running validate*_change on the sets,
which has no meaning given that the sets are not part of the insn.

In this example, the equivalence A == T is already known, and the
purpose of the fake sets is to add A == T == R[0].  We can do that
just as easily (or, as the PR shows, more easily) if we keep the
original form of the fake set, with A instead of T.

The problem in the PR occurred if we had:

(1) something that establishes an equivalence between a vector V1 of
    M-bit scalar integers and a hard register H

(2) something that establishes an equivalence between a vector V2 of
    N-bit scalar integers, where N<M and where V2 contains at least 2
    instances of V1[0]

(1) established an equivalence between V1[0] and H in M bits.
(2) then triggered a search for an equivalence of V1[0] in N bits.
This included:

      /* See if we have a CONST_INT that is already in a register in a
	 wider mode.  */

which (correctly) found that the low N bits of H contain the right value.
But because it came from a wider mode, this equivalence between N-bit H
and N-bit V1[0] was not yet in the hash table.  It therefore survived
the purge in:

      /* At this point, ELT, if nonzero, points to a class of expressions
         equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
	 and SRC_RELATED, if nonzero, each contain additional equivalent
	 expressions.  Prune these latter expressions by deleting expressions
	 already in the equivalence class.

And since more than 1 set found the same N-bit equivalence between
H and V1[0], the pass tried to add it more than once.

Things were already wrong at this stage, but an ICE was only triggered
later when trying to merge this N-bit equivalence with another one.

We could avoid the double registration by adding:

  for (elt = classp; elt; elt = elt->next_same_value)
    if (rtx_equal_p (elt->exp, x))
      return elt;

to insert_with_costs, or by making cse_insn check whether previous
sets have recorded the same equivalence.  The latter seems more
appealing from a compile-time perspective.  But in this case,
doing that would be adding yet more spurious work to the handling
of fake sets.

The handling of fake sets therefore seems like the more fundamental bug.

While there, the patch also makes sure that we don't apply REG_EQUAL
notes to these fake sets.  They only describe the "real" (first) set.

gcc/
	PR rtl-optimization/111702
	* cse.cc (set::mode): Move earlier.
	(set::src_in_memory, set::src_volatile): Convert to bitfields.
	(set::is_fake_set): New member variable.
	(add_to_set): Add an is_fake_set parameter.
	(find_sets_in_insn): Update calls accordingly.
	(cse_insn): Do not apply REG_EQUAL notes to fake sets.  Do not
	try to optimize them either, or validate changes to them.

gcc/testsuite/
	PR rtl-optimization/111702
	* gcc.dg/rtl/aarch64/pr111702.c: New test.
2023-12-20 19:07:35 +00:00
Kuan-Lin Chen
d07d0e9922 RISC-V: Support -mcmodel=large.
gcc/ChangeLog:
	* config/riscv/predicates.md (move_operand): Reject symbolic operands
	with a type SYMBOL_FORCE_TO_MEM.
	(call_insn_operand): Support for CM_Large.
	(pcrel_symbol_operand): New.
	* config/riscv/riscv-c.cc (riscv_cpu_cpp_builtins): Add builtin_define
	"__riscv_cmodel_large".
	* config/riscv/riscv-opts.h (riscv_code_model): Add CM_LARGE.
	* config/riscv/riscv-protos.h (riscv_symbol_type): Add
	SYMBOL_FORCE_TO_MEM.
	* config/riscv/riscv.cc (riscv_classify_symbol) Support CM_LARGE model.
	(riscv_symbol_insns) Add SYMBOL_FORCE_TO_MEM.
	(riscv_cannot_force_const_mem): Ditto.
	(riscv_split_symbol): Ditto.
	(riscv_force_address): Check pseudo reg available before force_reg.
	(riscv_size_ok_for_small_data_p): Disable in CM_LARGE model.
	(riscv_can_use_per_function_literal_pools_p): New.
	(riscv_elf_select_rtx_section): Handle per-function literal pools.
	(riscv_output_mi_thunk): Add riscv_in_thunk_func.
	(riscv_option_override): Support CM_LARGE model.
	(riscv_function_ok_for_sibcall): Disable sibcalls in CM_LARGE model.
	(riscv_in_thunk_func): New static.
	* config/riscv/riscv.md (unspec): Define UNSPEC_FORCE_FOR_MEM.
	(*large_load_address): New.
	* config/riscv/riscv.opt (code_model): New.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/large-model.c: New test.
2023-12-20 10:53:15 -07:00
Wang Pengcheng
eef65d60a8 [PATCH] RISC-V: Fix RISCV_FUSE_ZEXTWS fusion condition
The condition is RISCV_FUSE_ZEXTH, which is a mistake.

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_macro_fusion_pair_p): Fix condition.
2023-12-20 10:34:13 -07:00
Jason Merrill
02c0b49798 c++: throwing dtor and empty try [PR113088]
maybe_splice_retval_cleanup assumed that the function body can't be empty if
there's a throwing cleanup, but when I added cleanups to try blocks in
r12-6333-gb10e031458d541 I didn't adjust that assumption.

	PR c++/113088
	PR c++/33799

gcc/cp/ChangeLog:

	* except.cc (maybe_splice_retval_cleanup): Handle an empty block.

gcc/testsuite/ChangeLog:

	* g++.dg/eh/return2.C: New test.
2023-12-20 12:31:07 -05:00
Jason Merrill
8dfc52a75d c++: xvalue array subscript [PR103185]
Normally we handle xvalue array subscripting with ARRAY_REF, but in this
case we weren't doing that because the operands were reversed.  Handle that
case better.

	PR c++/103185

gcc/cp/ChangeLog:

	* typeck.cc (cp_build_array_ref): Handle swapped operands.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1z/array-prvalue2.C: New test.
	* g++.dg/cpp1z/eval-order3.C: Test swapped operands.
2023-12-20 12:30:13 -05:00