Commit graph

194955 commits

Author SHA1 Message Date
GCC Administrator
16f542d6b8 Daily bump. 2022-08-27 00:17:09 +00:00
Patrick Palka
d0fd62d0ff libstdc++: Implement LWG 3692/3702 changes to zip_/zip_transform_view
libstdc++-v3/ChangeLog:

	* include/std/ranges (zip_view::_Iterator::operator<): Remove
	as per LWG 3692.
	(zip_view::_Iterator::operator>): Likewise.
	(zip_view::_Iterator::operator<=): Likewise.
	(zip_view::_Iterator::operator>=): Likewise.
	(zip_view::_Iterator::operator<=>): Remove three_way_comparable
	constraint as per LWG 3692.
	(zip_transform_view::_Iterator): Ditto as per LWG 3702.
2022-08-26 18:59:36 -04:00
Patrick Palka
1a93a84b9e libstdc++: Implement ranges::zip_transform_view from P2321R2
libstdc++-v3/ChangeLog:

	* include/std/ranges (zip_view::_Iterator): Befriend
	zip_transform_view.
	(__detail::__range_iter_cat): Define.
	(zip_transform_view): Define.
	(zip_transform_view::_Iterator): Define.
	(zip_transform_view::_Sentinel): Define.
	(views::__detail::__can_zip_transform_view): Define.
	(views::_ZipTransform): Define.
	(views::zip_transform): Define.
	* testsuite/std/ranges/zip_transform/1.cc: New test.
2022-08-26 18:59:20 -04:00
Patrick Palka
390f94eee1 libstdc++: Optimize std::con/disjunction, __and_/__or_, etc
The internal type-level logical operator traits __and_ and __or_ seem to
have high overhead for a couple of reasons:

  1. They are drop-in replacements for std::con/disjunction, which
     are rigidly specified to form a type that derives from the first
     type argument that caused the overall computation to short-circuit.
     In practice this inheritance property seems to be rarely needed;
     usually all we care about is the value of the overall result.
  2. Their recursive implementations instantiate O(N) class templates
     and form an inheritance chain of depth O(N).

This patch gets rid of this inheritance property of __and_ and __or_
(which seems to be unneeded in the library except indirectly by
std::con/disjunction) which allows us to redefine them non-recursively
as alias templates that yield either false_type or true_type via
enable_if_t and partial ordering of a pair of function templates
(alternatively we could use an equivalent partially specialized class
template, but using function templates appears to be slightly more
efficient).

As for std::con/disjunction, it seems we need to keep implementing them
via a recursive class template for sake of the inheritance property.
But instead of using inheritance recursion, use a recursive member
typedef that gets immediately flattened, so that specializations thereof
now have O(1) instead of O(N) inheritance depth.

In passing, redefine __not_ as an alias template for consistency with
__and_ and __or_, and to remove a layer of indirection.

Together these changes have a substantial effect on compile time and
memory usage for code that heavily uses these internal type traits.
For the following example (which tests constructibility between two
compatible 257-element tuple types):

  #include <tuple>

  #define M(x) x, x

  using ty1 = std::tuple<M(M(M(M(M(M(M(M(int)))))))), int>;
  using ty2 = std::tuple<M(M(M(M(M(M(M(M(int)))))))), long>;

  static_assert(std::is_constructible_v<ty2, ty1>);

memory usage improves ~27% from 440MB to 320MB and compile time improves
~20% from ~2s to ~1.6s (with -std=c++23).

libstdc++-v3/ChangeLog:

	* include/std/type_traits (enable_if, __enable_if_t): Define them
	earlier.
	(__detail::__first_t): Define.
	(__detail::__or_fn, __detail::__and_fn): Declare.
	(__or_, __and_): Redefine as alias templates in terms of __or_fn
	and __and_fn.
	(__not_): Redefine as an alias template.
	(__detail::__disjunction_impl, __detail::__conjunction_impl):
	Define.
	(conjuction, disjunction): Redefine in terms of __disjunction_impl
	and __conjunction_impl.
2022-08-26 15:10:57 -04:00
Aldy Hernandez
1d3145360f Add real_iszero to real.*
We have real_isnegzero but no real_iszero.  We could memcmp with 0,
but that's just ugly.

gcc/ChangeLog:

	* real.cc (real_iszero): New.
	* real.h (real_iszero): New.
2022-08-26 20:45:30 +02:00
Aldy Hernandez
33cae27763 Add set/get functions for negative infinity in real.*
For the frange implementation with endpoints I'm about to contribute,
we need to set REAL_VALUE_TYPEs with negative infinity.  The support
is already there in real.cc, but it is awkward to get at.  One could
call real_inf() and then negate the value, but I've added the ability
to pass the sign argument like many of the existing real.* functions.

I've declared the functions in such a way to avoid changes to the
existing code base:

// Unchanged function returning true for either +-INF.
bool real_isinf (const REAL_VALUE_TYPE *r);
// New overload to be able to specify the sign.
bool real_isinf (const REAL_VALUE_TYPE *r, int sign);
// Replacement function for setting INF, defaults to +INF.
void real_inf (REAL_VALUE_TYPE *, int sign = 0);

gcc/ChangeLog:

	* real.cc (real_isinf): New overload.
	(real_inf): Add sign argument.
	* real.h (real_isinf): New overload.
	(real_inf): Add sign argument.
2022-08-26 20:45:30 +02:00
Marek Polacek
0abb78dda0 c++: Implement -Wself-move warning [PR81159]
About 5 years ago we got a request to implement -Wself-move, which
warns about useless moves like this:

  int x;
  x = std::move (x);

This patch implements that warning.

	PR c++/81159

gcc/c-family/ChangeLog:

	* c.opt (Wself-move): New option.

gcc/cp/ChangeLog:

	* typeck.cc (maybe_warn_self_move): New.
	(cp_build_modify_expr): Call maybe_warn_self_move.

gcc/ChangeLog:

	* doc/invoke.texi: Document -Wself-move.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wself-move1.C: New test.
2022-08-26 12:56:34 -04:00
Aldy Hernandez
1e2462890a Make all default vrange setters set VARYING.
frange is using some of the default vrange setters, some of which are
leaving the range in an undefined state.  We hadn't noticed this
because neither frange nor unsupported_range, both which use some of
the default implementation, weren't being used much.

We can never go wrong with setting VARYING ;-).

gcc/ChangeLog:

	* value-range.cc (vrange::set): Set varying.
	(vrange::set_nonzero): Same.
	(vrange::set_zero): Same.
	(vrange::set_nonnegative): Same.
2022-08-26 18:12:37 +02:00
Aldy Hernandez
d085901e0e [ranger] x == -0.0 does not mean we can replace x with -0.0
On the true side of x == -0.0, we can't just blindly value propagate
the -0.0 into every use of x because x could be +0.0.

With this change, we only allow the transformation if
!HONOR_SIGNED_ZEROS or if the range is known not to contain 0.

gcc/ChangeLog:

	* range-op-float.cc (foperator_equal::op1_range): Do not blindly
	copy op2 range when honoring signed zeros.
2022-08-26 18:12:37 +02:00
Aldy Hernandez
79db991ece Add newline when checking path profitability.
It looks like we're missing a newline for cases where we don't print
anything.

gcc/ChangeLog:

	* tree-ssa-threadbackward.cc (possibly_profitable_path_p): Always
	add newline.
	(profitable_path_p): Same.
2022-08-26 18:12:37 +02:00
Jonathan Wakely
1c0288065b libstdc++: Simplify std::error_code and std::error_condition
This removes the redundant operator=(E) from std::error_code and
std::error_condition. Without that overload, assignment from a custom
type will use the templated constructor to create a temporary and then
use the trivial copy assignment operator. With the overloaded
assignment, we have to check the constraints twice as often, because
that overload and its constraints are checked for simple copy
assignments (including the one in the overloaded assignment operator
itself!)

Also add tests that ADL is used as per LWG 3629.

libstdc++-v3/ChangeLog:

	* include/std/system_error (error_code::_Check): New alias
	template for constructor SFINAE constraint.
	(error_code::error_code(ErrorCodeEnum)): Use it.
	(error_code::operator=(ErrorCodeEnum)): Remove.
	(error_condition::_Check): New alias template for constraint.
	(error_condition::error_condition(ErrorConditionEnum)): Use it.
	(error_condition::operator=(ErrorConditionEnum)): Remove.
	* testsuite/19_diagnostics/error_code/cons/1.cc: Check
	constructor taking user-defined error enum.
	* testsuite/19_diagnostics/error_condition/cons/1.cc: Likewise.
2022-08-26 15:29:03 +01:00
Jonathan Wakely
1b0b969df7 libstdc++: Add nonnull to starts_with/ends_with/contains string members
Ideally this wouldn't be needed, because eventually these pointers all
get passed to either the basic_string_view(const CharT*) constructor, or
to basic_string_view::find(const CharT*), both of which already have the
attribute. But for that to work requires optimization, so that the null
value gets propagated through the call chain.

Adding it explicitly to each member that requires a non-null pointer
makes the diagnostics more reliable even without optimization. It's
better to give a diagnostic earlier anyway, at the actual problematic
call in the user's code.

libstdc++-v3/ChangeLog:

	* include/bits/basic_string.h (starts_with, ends_with, contains):
	Add nonnull attribute.
	* include/bits/cow_string.h (starts_with, ends_with, contains):
	Likewise.
	* include/std/string_view (starts_with, ends_with, contains):
	Likewise.
	* testsuite/21_strings/basic_string/operations/contains/nonnull.cc
	* testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc
	* testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc
	* testsuite/21_strings/basic_string_view/operations/contains/nonnull.cc
	* testsuite/21_strings/basic_string_view/operations/ends_with/nonnull.cc
	* testsuite/21_strings/basic_string_view/operations/starts_with/nonnull.cc
2022-08-26 15:29:03 +01:00
Jakub Jelinek
dad2d3e003 libcpp: Implement P2362R3 - Remove non-encodable wide character literals and multicharacter [PR106647]
My understanding of the paper is that we just want to promote the CPP_WCHAR
"character constant too long for its type" warning to error as it is already
error for u8, u and U literals.

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

	PR c++/106647
	* charset.cc (wide_str_to_charconst): Implement P2362R3 - Remove
	non-encodable wide character literals and multicharacter.  For
	C++23 use CPP_DL_ERROR instead of CPP_DL_WARNING for
	"character constant too long for its type" diagnostics on CPP_WCHAR
	literals.

	* g++.dg/cpp23/wchar-multi1.C: New test.
	* g++.dg/cpp23/wchar-multi2.C: New test.
2022-08-26 16:06:20 +02:00
Richard Biener
8e08906973 Remove uninit_analysis::use_cannot_happen
As written earlier uninit_analysis::use_cannot_happen is duplicate
functionality implemented in a complement way, not adhering to
the idea of disproving a may-uninit use and eventually (I have not
yet found a testcase it helps to avoid false positives) avoiding
false positives because of this or different ways it imposes limits
on the predicate computations.

This patch removes it.

	* gimple-predicate-analysis.h
	(uninit_analysis::use_cannot_happen): Remove.
	* gimple-predicate-analysis.cc (can_be_invalidated_p): Remove.
	(uninit_analysis::use_cannot_happen): Likewise.
	(uninit_analysis::is_use_guarded): Do not call
	use_cannot_happen.
	(dump_predicates): Remove.
	(simple_control_dep_chain): Remove edge overload.
2022-08-26 12:59:05 +02:00
Richard Biener
fc1b5707fa New testcase for uninit
The following adds a testcase that illustrates a defect in
compute_control_dep_chain and its attempt to identify loop
exits as special to continue walking post-dominators but failing
to do so for following post-dominators.  On trunk there is now
simple_control_dep_chain saving the day, avoiding the false
positive but with GCC 12 we get a bogus diagnostic.

	* gcc.dg/uninit-pred-11.c: New testcase.
2022-08-26 12:59:05 +02:00
Tobias Burnus
d6621a2f31 OpenMP: Support reverse offload (middle end part)
gcc/ChangeLog:

	* internal-fn.cc (expand_GOMP_TARGET_REV): New.
	* internal-fn.def (GOMP_TARGET_REV): New.
	* lto-cgraph.cc (lto_output_node, verify_node_partition): Mark
	'omp target device_ancestor_host' as in_other_partition and don't
	error if absent.
	* omp-low.cc (create_omp_child_function): Mark as 'noclone'.
	* omp-expand.cc (expand_omp_target): For reverse offload, remove
	sorry, use device = GOMP_DEVICE_HOST_FALLBACK and create
	empty-body nohost function.
	* omp-offload.cc (execute_omp_device_lower): Handle
	IFN_GOMP_TARGET_REV.
	(pass_omp_target_link::execute): For ACCEL_COMPILER, don't
	nullify fn argument for reverse offload

libgomp/ChangeLog:

	* libgomp.texi (OpenMP 5.0): Mark 'ancestor' as implemented but
	refer to 'requires'.
	* testsuite/libgomp.c-c++-common/reverse-offload-1-aux.c: New test.
	* testsuite/libgomp.c-c++-common/reverse-offload-1.c: New test.
	* testsuite/libgomp.fortran/reverse-offload-1-aux.f90: New test.
	* testsuite/libgomp.fortran/reverse-offload-1.f90: New test.

gcc/testsuite/ChangeLog:

	* c-c++-common/gomp/reverse-offload-1.c: Remove dg-sorry.
	* c-c++-common/gomp/target-device-ancestor-4.c: Likewise.
	* gfortran.dg/gomp/target-device-ancestor-4.f90: Likewise.
	* gfortran.dg/gomp/target-device-ancestor-5.f90: Likewise.
	* c-c++-common/goacc/classify-kernels-parloops.c: Add 'noclone' to
	scan-tree-dump-times.
	* c-c++-common/goacc/classify-kernels-unparallelized-parloops.c:
	Likewise.
	* c-c++-common/goacc/classify-kernels-unparallelized.c: Likewise.
	* c-c++-common/goacc/classify-kernels.c: Likewise.
	* c-c++-common/goacc/classify-parallel.c: Likewise.
	* c-c++-common/goacc/classify-serial.c: Likewise.
	* c-c++-common/goacc/kernels-counter-vars-function-scope.c: Likewise.
	* c-c++-common/goacc/kernels-loop-2.c: Likewise.
	* c-c++-common/goacc/kernels-loop-3.c: Likewise.
	* c-c++-common/goacc/kernels-loop-data-2.c: Likewise.
	* c-c++-common/goacc/kernels-loop-data-enter-exit-2.c: Likewise.
	* c-c++-common/goacc/kernels-loop-data-enter-exit.c: Likewise.
	* c-c++-common/goacc/kernels-loop-data-update.c: Likewise.
	* c-c++-common/goacc/kernels-loop-data.c: Likewise.
	* c-c++-common/goacc/kernels-loop-g.c: Likewise.
	* c-c++-common/goacc/kernels-loop-mod-not-zero.c: Likewise.
	* c-c++-common/goacc/kernels-loop-n.c: Likewise.
	* c-c++-common/goacc/kernels-loop-nest.c: Likewise.
	* c-c++-common/goacc/kernels-loop.c: Likewise.
	* c-c++-common/goacc/kernels-one-counter-var.c: Likewise.
	* c-c++-common/goacc/kernels-parallel-loop-data-enter-exit.c: Likewise.
	* gfortran.dg/goacc/classify-kernels-parloops.f95: Likewise.
	* gfortran.dg/goacc/classify-kernels-unparallelized-parloops.f95:
	Likewise.
	* gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise.
	* gfortran.dg/goacc/classify-kernels.f95: Likewise.
	* gfortran.dg/goacc/classify-parallel.f95: Likewise.
	* gfortran.dg/goacc/classify-serial.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-2.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-data-2.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-data-enter-exit-2.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-data-enter-exit.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-data-update.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-data.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop-n.f95: Likewise.
	* gfortran.dg/goacc/kernels-loop.f95: Likewise.
	* gfortran.dg/goacc/kernels-parallel-loop-data-enter-exit.f95: Likewise.
2022-08-26 12:12:25 +02:00
Jakub Jelinek
0c2d6aa1be fortran: Expand ieee_arithmetic module's ieee_value inline [PR106579]
The following patch expands IEEE_VALUE function inline in the FE.

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/106579
	* trans-intrinsic.cc: Include realmpfr.h.
	(conv_intrinsic_ieee_value): New function.
	(gfc_conv_ieee_arithmetic_function): Handle ieee_value.
2022-08-26 09:56:19 +02:00
Jakub Jelinek
db630423a9 fortran: Expand ieee_arithmetic module's ieee_class inline [PR106579]
The following patch expands IEEE_CLASS inline in the FE, using the
__builtin_fpclassify, __builtin_signbit and the new __builtin_issignaling
builtins.

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/106579
gcc/fortran/
	* f95-lang.cc (gfc_init_builtin_functions): Initialize
	BUILT_IN_FPCLASSIFY.
	* libgfortran.h (IEEE_OTHER_VALUE, IEEE_SIGNALING_NAN,
	IEEE_QUIET_NAN, IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL,
	IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE_SUBNORMAL,
	IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL,
	IEEE_POSITIVE_SUBNORMAL, IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF):
	New enum.
	* trans-intrinsic.cc (conv_intrinsic_ieee_class): New function.
	(gfc_conv_ieee_arithmetic_function): Handle ieee_class.
libgfortran/
	* ieee/ieee_helper.c (IEEE_OTHER_VALUE, IEEE_SIGNALING_NAN,
	IEEE_QUIET_NAN, IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL,
	IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE_SUBNORMAL,
	IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL,
	IEEE_POSITIVE_SUBNORMAL, IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF):
	Move to gcc/fortran/libgfortran.h.
2022-08-26 09:52:02 +02:00
Jakub Jelinek
387e6f1570 libgfortran: Use __builtin_issignaling in libgfortran [PR105105]
The following patch makes use of the new __builtin_issignaling,
so it no longer needs the fallback implementation and can use
the builtin even where glibc provides the macro.

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/105105
	* ieee/ieee_helper.c: Don't include issignaling_fallback.h.
	(CLASSMACRO): Use __builtin_issignaling instead of issignaling.
	* ieee/issignaling_fallback.h: Removed.
2022-08-26 09:45:19 +02:00
Jakub Jelinek
0982edd371 Implement __builtin_issignaling
The following patch implements a new builtin, __builtin_issignaling,
which can be used to implement the ISO/IEC TS 18661-1  issignaling
macro.

It is implemented as type-generic function, so there is just one
builtin, not many with various suffixes.
This patch doesn't address PR56831 nor PR58416, but I think compared to
using glibc issignaling macro could make some cases better (as
the builtin is expanded always inline and for SFmode/DFmode just
reinterprets a memory or pseudo register as SImode/DImode, so could
avoid some raising of exception + turning sNaN into qNaN before the
builtin can analyze it).

For floading point modes that do not have NaNs it will return 0,
otherwise I've tried to implement this for all the other supported
real formats.
It handles both the MIPS/PA floats where a sNaN has the mantissa
MSB set and the rest where a sNaN has it cleared, with the exception
of format which are known never to be in the MIPS/PA form.
The MIPS/PA floats are handled using a test like
(x & mask) == mask,
the other usually as
((x ^ bit) & mask) > val
where bit, mask and val are some constants.
IBM double double is done by doing DFmode test on the most significant
half, and Intel/Motorola extended (12 or 16 bytes) and IEEE quad are
handled by extracting 32-bit/16-bit words or 64-bit parts from the
value and testing those.
On x86, XFmode is handled by a special optab so that even pseudo numbers
are considered signaling, like in glibc and like the i386 specific testcase
tests.

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* builtins.def (BUILT_IN_ISSIGNALING): New built-in.
	* builtins.cc (expand_builtin_issignaling): New function.
	(expand_builtin_signbit): Don't overwrite target.
	(expand_builtin): Handle BUILT_IN_ISSIGNALING.
	(fold_builtin_classify): Likewise.
	(fold_builtin_1): Likewise.
	* optabs.def (issignaling_optab): New.
	* fold-const-call.cc (fold_const_call_ss): Handle
	BUILT_IN_ISSIGNALING.
	* config/i386/i386.md (issignalingxf2): New expander.
	* doc/extend.texi (__builtin_issignaling): Document.
	(__builtin_isinf, __builtin_isnan): Clarify behavior with
	-ffinite-math-only.
	* doc/md.texi (issignaling<mode>2): Likewise.
gcc/c-family/
	* c-common.cc (check_builtin_function_arguments): Handle
	BUILT_IN_ISSIGNALING.
gcc/c/
	* c-typeck.cc (convert_arguments): Handle BUILT_IN_ISSIGNALING.
gcc/fortran/
	* f95-lang.cc (gfc_init_builtin_functions): Initialize
	BUILT_IN_ISSIGNALING.
gcc/testsuite/
	* gcc.dg/torture/builtin-issignaling-1.c: New test.
	* gcc.dg/torture/builtin-issignaling-2.c: New test.
	* gcc.dg/torture/float16-builtin-issignaling-1.c: New test.
	* gcc.dg/torture/float32-builtin-issignaling-1.c: New test.
	* gcc.dg/torture/float32x-builtin-issignaling-1.c: New test.
	* gcc.dg/torture/float64-builtin-issignaling-1.c: New test.
	* gcc.dg/torture/float64x-builtin-issignaling-1.c: New test.
	* gcc.dg/torture/float128-builtin-issignaling-1.c: New test.
	* gcc.dg/torture/float128x-builtin-issignaling-1.c: New test.
	* gcc.target/i386/builtin-issignaling-1.c: New test.
2022-08-26 09:39:51 +02:00
Jakub Jelinek
530dc5aaae internal-fn, tree-cfg: Fix .TRAP handling and another __builtin_trap vops issue [PR106099]
This patch fixes 2 __builtin_unreachable/__builtin_trap related issues.
One (first hunk) is that CDDCE happily removes calls to .TRAP ()
internal-fn as useless.  The problem is that the internal-fn is
ECF_CONST | ECF_NORETURN, doesn't have lhs and so DCE thinks it doesn't
have side-effects and removes it.  __builtin_unreachable which has
the same ECF_* flags works fine, as since PR44485 we implicitly add
ECF_LOOPING_CONST_OR_PURE to ECF_CONST | ECF_NORETURN builtins, but
do it in flags_from_decl_or_type which isn't called for internal-fns.
As IFN_TRAP is the only ifn with such flags, it seems easier to
add it explicitly.

The other issue (which on the testcase can be seen only with the
first bug unfixed) is that execute_fixup_cfg can add a __builtin_trap
which needs vops, but nothing adds it and it can appear in many passes
which don't have corresponding TODO_update_ssa_only_virtuals etc.
Fixed similarly as last time but emitting ifn there instead.

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/106099
	* internal-fn.def (TRAP): Add ECF_LOOPING_CONST_OR_PURE flag.
	* tree-cfg.cc (execute_fixup_cfg): Add IFN_TRAP instead of
	__builtin_trap to avoid the need of vops.

	* gcc.dg/pr106099.c: New test.
2022-08-26 09:28:48 +02:00
Jakub Jelinek
eb4879ab90 c++: Implement C++23 P2071R2 - Named universal character escapes [PR106648]
The following patch implements the
C++23 P2071R2 - Named universal character escapes
paper to support \N{LATIN SMALL LETTER E} etc.
I've used Unicode 14.0, there are 144803 character name properties
(including the ones generated by Unicode NR1 and NR2 rules)
and correction/control/alternate aliases, together with zero terminators
that would be 3884745 bytes, which is clearly unacceptable for libcpp.
This patch instead contains a generator which from the UnicodeData.txt
and NameAliases.txt files emits a space optimized radix tree (208765
bytes long for 14.0), a single string literal dictionary (59418 bytes),
maximum name length (currently 88 chars) and two small helper arrays
for the NR1/NR2 name generation.
The radix tree needs 2 to 9 bytes per node, the exact format is
described in the generator program.  There could be ways to shrink
the dictionary size somewhat at the expense of slightly slower lookups.

Currently the patch implements strict matching (that is what is needed
to actually implement it on valid code) and Unicode UAX44-LM2 algorithm
loose matching to provide hints (that algorithm essentially ignores
hyphens in between two alphanumeric characters, spaces and underscores
(with one exception for hyphen) and does case insensitive matching).
In the attachment is a WIP patch that shows how to implement also
spellcheck.{h,cc} style discovery of misspellings, but I'll need to talk
to David Malcolm about it, as spellcheck.{h,cc} is in gcc/ subdir
(so the WIP incremental patch instead prints all the names to stderr).

2022-08-26  Jakub Jelinek  <jakub@redhat.com>

	PR c++/106648
libcpp/
	* charset.cc: Implement C++23 P2071R2 - Named universal character
	escapes.  Include uname2c.h.
	(hangul_syllables, hangul_count): New variables.
	(struct uname2c_data): New type.
	(_cpp_uname2c, _cpp_uname2c_uax44_lm2): New functions.
	(_cpp_valid_ucn): Use them.  Handle named universal character escapes.
	(convert_ucn): Adjust comment.
	(convert_escape): Call convert_ucn even for \N.
	(_cpp_interpret_identifier): Handle named universal character escapes.
	* lex.cc (get_bidi_ucn): Fix up function comment formatting.
	(get_bidi_named): New function.
	(forms_identifier_p, lex_string): Handle named universal character
	escapes.
	* makeuname2c.cc: New file.  Small parts copied from makeucnid.cc.
	* uname2c.h: New generated file.
gcc/c-family/
	* c-cppbuiltin.cc (c_cpp_builtins): Predefine
	__cpp_named_character_escapes to 202207L.
gcc/testsuite/
	* c-c++-common/cpp/named-universal-char-escape-1.c: New test.
	* c-c++-common/cpp/named-universal-char-escape-2.c: New test.
	* c-c++-common/cpp/named-universal-char-escape-3.c: New test.
	* c-c++-common/cpp/named-universal-char-escape-4.c: New test.
	* c-c++-common/Wbidi-chars-25.c: New test.
	* gcc.dg/cpp/named-universal-char-escape-1.c: New test.
	* gcc.dg/cpp/named-universal-char-escape-2.c: New test.
	* g++.dg/cpp/named-universal-char-escape-1.C: New test.
	* g++.dg/cpp/named-universal-char-escape-2.C: New test.
	* g++.dg/cpp23/feat-cxx2b.C: Test __cpp_named_character_escapes.
2022-08-26 09:27:39 +02:00
Richard Biener
670961f051 Improve compute_control_dep_chain path finding
This improves the compute_control_dep_chain path finding by first
marking the dominating region we search and then making sure to
not walk outside if it when enumerating all paths from the dominating
block to the interesting PHI edge source.  I have limited the DFS
walk done for the marking in similar ways as we limit the walking
in compute_control_dep_chain, more careful limiting might be
necessary though - the --param uninit-control-dep-attempts param
I re-use has a rather high default of 1000 which we might be able
to reduce with this patch as well (I think we'll usually hit some of the
other limits before ever reaching this).

	* gimple-predicate-analysis.cc (dfs_mark_dominating_region):
	New helper.
	(compute_control_dep_chain): Adjust to honor marked region
	if provided.
	(uninit_analysis::init_from_phi_def): Pre-mark the dominating
	region to improve compute_control_dep_chain walking.
	* vec.h (vec<T, va_heap, vl_ptr>::allocated): Add forwarder.
2022-08-26 08:23:50 +02:00
Richard Biener
8b4d528d8c Improve uninit_analysis::collect_phi_def_edges
This avoids expanding an edge to those of a PHI def if it is not
may-undefined, reducing the number of compute_control_dep_chain calls.

	* gimple-predicate-analysis.cc
	(uninit_analysis::collect_phi_def_edges): Only expand a
	PHI def edge when it is possibly undefined.
2022-08-26 08:23:50 +02:00
Martin Liska
eb6358247a cr16: remove obsoleted port
contrib/ChangeLog:

	* config-list.mk: Remove cr16.

gcc/ChangeLog:

	* doc/extend.texi: Remove cr16 related stuff.
	* doc/install.texi: Likewise.
	* doc/invoke.texi: Likewise.
	* doc/md.texi: Likewise.
	* function-tests.cc (test_expansion_to_rtl): Likewise.
	* common/config/cr16/cr16-common.cc: Removed.
	* config/cr16/constraints.md: Removed.
	* config/cr16/cr16-protos.h: Removed.
	* config/cr16/cr16.cc: Removed.
	* config/cr16/cr16.h: Removed.
	* config/cr16/cr16.md: Removed.
	* config/cr16/cr16.opt: Removed.
	* config/cr16/predicates.md: Removed.
	* config/cr16/t-cr16: Removed.

libgcc/ChangeLog:

	* config.host: Remove cr16 related stuff.
	* config/cr16/crti.S: Removed.
	* config/cr16/crtlibid.S: Removed.
	* config/cr16/crtn.S: Removed.
	* config/cr16/divmodhi3.c: Removed.
	* config/cr16/lib1funcs.S: Removed.
	* config/cr16/t-cr16: Removed.
	* config/cr16/t-crtlibid: Removed.
	* config/cr16/unwind-cr16.c: Removed.
	* config/cr16/unwind-dw2.h: Removed.

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp: Remove cr16 related stuff.
2022-08-26 08:19:38 +02:00
liuhongt
388f1a8cf0 Don't gimple fold ymm-version vblendvpd/vblendvps/vpblendvb w/o TARGET_AVX2
Since 256-bit vector integer comparison is under TARGET_AVX2,
and gimple folding for vblendvpd/vblendvps/vpblendvb relies on that.
Restrict gimple fold condition to TARGET_AVX2.

gcc/ChangeLog:

	PR target/106704
	* config/i386/i386-builtin.def (BDESC): Add
	CODE_FOR_avx_blendvpd256/CODE_FOR_avx_blendvps256 to
	corresponding builtins.
	* config/i386/i386.cc (ix86_gimple_fold_builtin):
	Don't fold IX86_BUILTIN_PBLENDVB256, IX86_BUILTIN_BLENDVPS256,
	IX86_BUILTIN_BLENDVPD256 w/o TARGET_AVX2.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr106704.c: New test.
2022-08-26 09:20:59 +08:00
GCC Administrator
5d4389dc91 Daily bump. 2022-08-26 00:16:21 +00:00
Marek Polacek
60d84e8263 c: Implement C23 nullptr (N3042)
This patch implements the C23 nullptr literal:
<https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3042.htm> (with
wording fixes from N3047), which is intended to replace the problematic
definition of NULL which might be either of integer type or void*.

Since C++ has had nullptr for over a decade now, it was relatively easy
to just move the built-in node definitions from the C++ FE to the C/C++
common code.  Also, our DWARF emitter already handles NULLPTR_TYPE by
emitting DW_TAG_unspecified_type.  However, I had to handle a lot of
contexts such as ?:, comparison, conversion, etc.

There are some minor differences, e.g. in C you can do

  bool b = nullptr;

but in C++ you have to use direct-initialization:

  bool b{nullptr};

And I think that

  nullptr_t n = 0;

is only valid in C++.

Of course, C doesn't have to handle mangling, RTTI, substitution,
overloading, ...

This patch also defines nullptr_t in <stddef.h>.  However, it does not
define __STDC_VERSION_STDDEF_H__ yet, because we don't know yet what value
it should be defined to.

gcc/c-family/ChangeLog:

	* c-common.cc (c_common_reswords): Enable nullptr in C2X.
	(c_common_nodes_and_builtins): Create the built-in node for nullptr.
	* c-common.h (enum c_tree_index): Add CTI_NULLPTR, CTI_NULLPTR_TYPE.
	(struct c_common_resword): Resize the disable member.
	(D_C2X): Add.
	(nullptr_node): Define.
	(nullptr_type_node): Define.
	(NULLPTR_TYPE_P): Define.
	* c-pretty-print.cc (c_pretty_printer::simple_type_specifier): Handle
	NULLPTR_TYPE.
	(c_pretty_printer::direct_abstract_declarator): Likewise.
	(c_pretty_printer::constant): Likewise.

gcc/c/ChangeLog:

	* c-convert.cc (c_convert) <case POINTER_TYPE>: Handle NULLPTR_TYPE.
	Give a better diagnostic when converting to nullptr_t.
	* c-decl.cc (c_init_decl_processing): Perform C-specific nullptr
	initialization.
	* c-parser.cc (c_parse_init): Maybe OR D_C2X into mask.
	(c_parser_postfix_expression): Handle RID_NULLPTR.
	* c-typeck.cc (null_pointer_constant_p): Return true when expr is
	nullptr_node.
	(build_unary_op) <case TRUTH_NOT_EXPR>: Handle NULLPTR_TYPE.
	(build_conditional_expr): Handle the case when the second/third operand
	is NULLPTR_TYPE and third/second operand is POINTER_TYPE.
	(convert_for_assignment): Handle converting an expression of type
	nullptr_t to pointer/bool.
	(build_binary_op) <case TRUTH_XOR_EXPR>: Handle NULLPTR_TYPE.
	<case EQ_EXPR>: Handle comparing operands of type nullptr_t.

gcc/cp/ChangeLog:

	* cp-tree.h (enum cp_tree_index): Remove CTI_NULLPTR, CTI_NULLPTR_TYPE.
	Move it to c_tree_index.
	(nullptr_node): No longer define here.
	(nullptr_type_node): Likewise.
	(NULLPTR_TYPE_P): Likewise.
	* decl.cc (cxx_init_decl_processing): Only keep C++-specific nullptr
	initialization; move the shared code to c_common_nodes_and_builtins.

gcc/ChangeLog:

	* ginclude/stddef.h: Define nullptr_t.

gcc/testsuite/ChangeLog:

	* gcc.dg/c11-nullptr-1.c: New test.
	* gcc.dg/c17-nullptr-1.c: New test.
	* gcc.dg/c17-nullptr-2.c: New test.
	* gcc.dg/c2x-nullptr-1.c: New test.
	* gcc.dg/c2x-nullptr-2.c: New test.
	* gcc.dg/c2x-nullptr-3.c: New test.
	* gcc.dg/c2x-nullptr-4.c: New test.
	* gcc.dg/c2x-nullptr-5.c: New test.
2022-08-25 17:54:13 -04:00
Joseph Myers
14cfa01755 c: Support C2x empty initializer braces
ISO C2x standardizes empty initializer braces {}.  Implement this
feature accordingly.  The basic case was already supported and so just
needed diagnostic adjustments.  However, the standard feature also
includes two cases that were not previously supported: empty
initializer braces for scalars, and empty initializer braces for
VLAs.  Thus, add support for those features as well, updating existing
tests that expected them to be diagnosed.

There was already some gimplifier support for converting
variable-sized initializations with empty CONSTRUCTORs to memset.
However, it didn't apply here; code earlier in gimplify_modify_expr
ended up calling gimplify_init_constructor via
gimplify_modify_expr_rhs, which ended up handling the CONSTRUCTOR in a
way that generated an ICE later.  Add a check for this case earlier in
gimplify_modify_expr to avoid that issue.

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

gcc/
	* gimplify.cc (gimplify_modify_expr): Convert initialization from
	a variable-size CONSTRUCTOR to memset before call to
	gimplify_modify_expr_rhs.

gcc/c/
	* c-decl.cc (start_decl): Do not diagnose initialization of
	variable-sized objects here.
	* c-parser.cc (c_parser_braced_init): Add argument DECL.  All
	callers changed.
	(c_parser_initializer): Diagnose initialization of variable-sized
	objects other than with braced initializer.
	(c_parser_braced_init): Use pedwarn_c11 for empty initializer
	braces and update diagnostic text.  Diagnose initialization of
	variable-sized objects with nonempty braces.
	* c-typeck.cc (digest_init): Update diagnostic for initialization
	of variable-sized objects.
	(really_start_incremental_init, set_designator)
	(process_init_element): Update comments.
	(pop_init_level): Allow scalar empty initializers.

gcc/testsuite/
	* gcc.dg/c11-empty-init-1.c, gcc.dg/c11-empty-init-2.c,
	gcc.dg/c11-empty-init-3.c, gcc.dg/c2x-empty-init-1.c,
	gcc.dg/c2x-empty-init-2.c, gcc.dg/c2x-empty-init-3.c,
	gcc.dg/gnu2x-empty-init-1.c, gcc.dg/gnu2x-empty-init-2.c: New
	tests.
	* gcc.dg/torture/dfp-default-init-1.c: Also test empty
	initializers.
	* gcc.dg/init-bad-1.c, gcc.dg/noncompile/pr71583.c,
	gcc.dg/pr61096-1.c, gcc.dg/vla-init-2.c, gcc.dg/vla-init-3.c,
	gcc.target/i386/sse2-bfloat16-scalar-typecheck.c: Update expected
	diagnostics.
	* gcc.dg/ubsan/c-shift-1.c: Use nonempty initializers for VLA
	initializations expected to be diagnosed.
2022-08-25 21:04:12 +00:00
Jason Merrill
072d3115c0 c++: block copy elision in delegating ctor
CWG2403 deals with the issue that copy elision is not possible when the
initialized object is a potentially-overlapping subobject and the
initializer is a function that returns by value.  Jonathan pointed out that
this also affects delegating constructors, which might be used to construct
a base subobject.

gcc/cp/ChangeLog:

	* call.cc (unsafe_return_slot_p): Return 2 for *this in a
	constructor.

gcc/testsuite/ChangeLog:

	* g++.dg/init/elide8.C: New test.
2022-08-25 17:03:10 -04:00
Jason Merrill
30e1604754 dwarf2: use DW_ATE_UTF for char8_t
While looking at the Rust changes to dwarf2out I noticed that this was
missing from the char8_t support.

gcc/ChangeLog:

	* dwarf2out.cc (base_type_die): Also use DW_ATE_UTF for char8_t.

gcc/testsuite/ChangeLog:

	* g++.dg/debug/dwarf2/utf-1.C: New test.
2022-08-25 17:03:01 -04:00
Patrick Palka
980e0aa0ce libstdc++: Some minor <ranges> cleanups
libstdc++-v3/ChangeLog:

	* include/std/ranges (lazy_split_view::_OuterIter::_M_current):
	Remove redundant comment.
	(lazy_split_view::_M_current): Likewise.
	(common_view::common_view): Remove commented out view-converting
	constructor as per LWG3405.
	(elements_view::_Iterator::_Iterator): Uglify 'current' and 'i'.
2022-08-25 11:11:04 -04:00
Andreas Krebbel
585a21bab3 PR 106101: IBM zSystems: Fix strict_low_part problem
This avoids generating illegal (strict_low_part (reg ...)) RTXs. This
required two changes:

1. Do not use gen_lowpart to generate the inner expression of a
STRICT_LOW_PART.  gen_lowpart might fold the SUBREG either because
there is already a paradoxical subreg or because it can directly be
applied to the register. A new wrapper function makes sure that we
always end up having an actual SUBREG.

2. Change the movstrict patterns to enforce a SUBREG as inner operand
of the STRICT_LOW_PARTs.  The new predicate introduced for the
destination operand requires a SUBREG expression with a
register_operand as inner operand.  However, since reload strips away
the majority of the SUBREGs we have to accept single registers as well
once we reach reload.

Bootstrapped and regression tested on IBM zSystems 64 bit.

gcc/ChangeLog:

	PR target/106101
	* config/s390/predicates.md (subreg_register_operand): New
	predicate.
	* config/s390/s390-protos.h (s390_gen_lowpart_subreg): New
	function prototype.
	* config/s390/s390.cc (s390_gen_lowpart_subreg): New function.
	(s390_expand_insv): Use s390_gen_lowpart_subreg instead of
	gen_lowpart.
	* config/s390/s390.md ("*get_tp_64", "*zero_extendhisi2_31")
	("*zero_extendqisi2_31", "*zero_extendqihi2_31"): Likewise.
	("movstrictqi", "movstricthi", "movstrictsi"): Use the
	subreg_register_operand predicate instead of register_operand.

gcc/testsuite/ChangeLog:

	PR target/106101
	* gcc.c-torture/compile/pr106101.c: New test.
2022-08-25 14:39:49 +02:00
Martin Liska
b1a3d2b778 regenerate configure files and config.h.in files
fixincludes/ChangeLog:

	* config.h.in: Regenerate.
	* configure: Regenerate.

libada/ChangeLog:

	* configure: Regenerate.

libiberty/ChangeLog:

	* configure: Regenerate.

libobjc/ChangeLog:

	* configure: Regenerate.

liboffloadmic/ChangeLog:

	* configure: Regenerate.
	* plugin/configure: Regenerate.

libquadmath/ChangeLog:

	* configure: Regenerate.

libssp/ChangeLog:

	* configure: Regenerate.

libvtv/ChangeLog:

	* configure: Regenerate.

zlib/ChangeLog:

	* configure: Regenerate.
2022-08-25 14:23:40 +02:00
Xi Ruoyao
362749184c
LoongArch: add model attribute
A linker script and/or a section attribute may locate some object
specially, so we need to handle the code model for such objects
differently than the -mcmodel setting. This happens when the Linux
kernel loads a module with per-CPU variables.

Add an attribute to override the code model for a specific variable.

gcc/ChangeLog:

	* config/loongarch/loongarch-protos.h (loongarch_symbol_type):
	Add SYMBOL_PCREL64 and change the description for SYMBOL_PCREL.
	* config/loongarch/loongarch.cc (loongarch_attribute_table):
	New attribute table.
	(TARGET_ATTRIBUTE_TABLE): Define the target hook.
	(loongarch_handle_model_attribute): New static function.
	(loongarch_classify_symbol): Take TARGET_CMODEL_EXTREME and the
	model attribute of SYMBOL_REF_DECL into account returning
	SYMBOL_PCREL or SYMBOL_PCREL64.
	(loongarch_use_anchors_for_symbol_p): New static function.
	(TARGET_USE_ANCHORS_FOR_SYMBOL_P): Define the target hook.
	(loongarch_symbol_extreme_p): New static function.
	(loongarch_symbolic_constant_p): Handle SYMBOL_PCREL64.
	(loongarch_symbol_insns): Likewise.
	(loongarch_split_symbol_type): Likewise.
	(loongarch_split_symbol): Check SYMBOL_PCREL64 instead of
	TARGET_CMODEL_EXTREME for PC-relative addressing.
	(loongarch_print_operand_reloc): Likewise.
	* doc/extend.texi (Variable Attributes): Document new
	LoongArch specific attribute.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/attr-model-test.c: New test.
	* gcc.target/loongarch/attr-model-1.c: New test.
	* gcc.target/loongarch/attr-model-2.c: New test.
	* gcc.target/loongarch/attr-model-diag.c: New test.
2022-08-25 19:00:41 +08:00
Xi Ruoyao
a45b7b19e1
LoongArch: Avoid RTL flag check failure in loongarch_classify_symbol
SYMBOL_REF_TLS_MODEL invokes SYMBOL_REF_FLAGS, and SYMBOL_REF_FLAGS
invokes RTL_FLAG_CHECK1 and aborts when RTL code is not SYMBOL_REF.

r13-1833 removed "gcc_assert (SYMBOL_REF_P (x))" before invoking
"SYMBOL_REF_TLS_MODEL (x)", indicating that it's now possible that "x"
is not a SYMBOL_REF.  So we need to check if "x" is SYMBOL_REF first.

This fixes a test failure happening with r13-2173 with RTL flag
checking enabled:

    pr106096.C:26:1: internal compiler error: RTL flag check:
    SYMBOL_REF_FLAGS used with unexpected rtx code 'const' in
    loongarch_classify_symbol

gcc/ChangeLog:

	* config/loongarch/loongarch.cc (loongarch_classify_symbol):
	Return early if the rtx is not SYMBOL_REF.
2022-08-25 18:55:36 +08:00
Richard Biener
818073fe9d tree-optimization/106737 - remove intermediate SSA verification in autopar
The following removes intermediate SSA verification in autopar which
isn't expected to succeed after previous changes delaying (virtual)
SSA update to the end of the pass.

	PR tree-optimization/106737
	* tree-parloops.cc (transform_to_exit_first_loop_alt): Do not
	verify SSA form.

	* gcc.dg/autopar/pr106737.c: New testcase.
2022-08-25 10:44:43 +02:00
Tobias Burnus
33f24eb587 Fortran/OpenMP: Fix strictly structured blocks parsing
gcc/fortran/ChangeLog:

	* parse.cc (parse_omp_structured_block): When parsing strictly
	structured blocks, issue an error if the end-directive comes
	before the 'end block'.

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/strictly-structured-block-4.f90: New test.
2022-08-25 08:34:40 +02:00
Chenghua Xu
b169b67d7d LoongArch: Fix pr106459 by use HWIT instead of 1UL.
gcc/ChangeLog:

	PR target/106459
	* config/loongarch/loongarch.cc (loongarch_build_integer):
	Use HOST_WIDE_INT.
	* config/loongarch/loongarch.h (IMM_REACH): Likewise.
	(HWIT_1U): New Defined.
	(LU12I_OPERAND): Use HOST_WIDE_INT.
	(LU32I_OPERAND): Likewise.
	(LU52I_OPERAND): Likewise.
	(HWIT_UC_0xFFF): Likwise.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/pr106459.c: New test.
2022-08-25 09:18:26 +08:00
GCC Administrator
e8fc33aabc Daily bump. 2022-08-25 00:16:33 +00:00
Patrick Palka
49e25d3e29 libstdc++: Implement ranges::zip_view from P2321R2
libstdc++-v3/ChangeLog:

	* include/bits/ranges_algo.h (__min_fn, min): Move to ...
	* include/bits/ranges_util.h: ... here, in order to avoid
	including all of ranges_algo.h from <ranges>.
	* include/std/ranges (__detail::__zip_is_common): Define for
	C++23 as per P2321R2.
	(__detail::__tuple_or_pair): Likewise.
	(__detail::__tuple_or_pair_t): Likewise.
	(__detail::__tuple_transform): Likewise.
	(__detail::__tuple_for_each): Likewise.
	(zip_view): Likewise.
	(enable_borrowed_range<zip_view>): Likewise.
	(__detail::__all_random_access): Likewise.
	(__detail::__all_bidirectional): Likewise.
	(__detail::__all_forward): Likewise.
	(__detail::__zip_view_iter_cat): Likewise.
	(zip_view::_Iterator): Likewise.
	(zip_view::_Sentinel): Likewise.
	* testsuite/std/ranges/zip/1.cc: New test.
2022-08-24 19:17:27 -04:00
Jonathan Wakely
e5428086c2 Revert "libstdc++: Optimize operator+(string/char*, char*/string) equally"
This reverts commit 0b7c925499.
2022-08-24 23:47:43 +01:00
Patrick Palka
f46f58e61d libstdc++: Fix fallout from P2321R2 std::pair/tuple enhancements
r13-2159-g72886fcc626953 caused some testsuite regressions in C++23 mode:

  FAIL: 20_util/pair/requirements/explicit_instantiation/1.cc (test for excess errors)
  FAIL: 20_util/tuple/53648.cc (test for excess errors)
  FAIL: 20_util/tuple/cons/noexcept_specs.cc (test for excess errors)
  FAIL: 20_util/tuple/requirements/explicit_instantiation.cc (test for excess errors)

The test noexcept_specs.cc just needs to be updated to consider the
additional converting constructors of tuple in C++23 mode, which happen
to improve constructing from a const tuple rvalue that has an rvalue
reference element (for the better, as far as I can tell).

The other three tests fail because they explicitly instantiate a
specialization of pair/tuple whose elements are not all const swappable,
which in C++23 mode now results in a hard error due to the new const
swap member function.  Rather than XFAILing the tests in C++23 mode,
this patch adds non-standard constraints to this member function so that
we continue to accept such explicit instantiations.

libstdc++-v3/ChangeLog:

	* include/bits/stl_pair.h (pair::swap const): Add non-standard
	is_swappable_v constraints.
	* include/std/tuple (tuple::swap const): Likewise.
	* testsuite/20_util/tuple/cons/noexcept_specs.cc: Correct some
	asserts in C++23 mode.
2022-08-24 16:38:45 -04:00
Andrew Pinski
df5204ddd4 [RISCV] Fix PR 106632 and PR 106588 a few constraints in bitmanip.md
The constraints should be n instead of i. Also there
needs to a check for out of bounds zero_extract for
*bexti.

gcc/ChangeLog:

	PR target/106632
	PR target/106588
	* config/riscv/bitmanip.md (*shNadduw): Use n constraint
	instead of i.
	(*slliuw): Likewise.
	(*bexti): Likewise. Also add a check for operands[2] to be less
	than the mode bitsize.
2022-08-24 12:15:33 -07:00
Andrew Pinski
2a5549f1cc [RISCV] Add constraints for not_single_bit_mask_operand/single_bit_mask_operand
Like a previous patch, just add constraints for predicates
not_single_bit_mask_operand and single_bit_mask_operand.

OK? Built and tested for riscv32-linux-gnu and riscv64-linux-gnu.

Thanks,
Andrew Pinski

gcc/ChangeLog:

	* config/riscv/constraints.md (DbS): New constraint.
	(DnS): New constraint.
	* config/riscv/bitmanip.md (*bset<mode>_1_mask): Use new constraint.
	(*bclr<mode>): Likewise.
	(*binvi<mode>): Likewise.
2022-08-24 12:15:33 -07:00
Andrew Pinski
2c721ea947 [RISCV] Fix PR 106586: riscv32 vs ZBS
The problem here is two fold. With RISCV32, 32bit
const_int are always signed extended to 64bit in HWI.
So that means for SINGLE_BIT_MASK_OPERAND, it should
mask off the upper bits to see it is a single bit
for !TARGET_64BIT.
Plus there are a few locations which forget to call
trunc_int_for_mode when generating a SImode constant
so they are not sign extended correctly for HWI.
The predicates single_bit_mask_operand and
not_single_bit_mask_operand need get the same handling
as SINGLE_BIT_MASK_OPERAND so just use SINGLE_BIT_MASK_OPERAND.

OK? Built and tested on riscv32-linux-gnu and riscv64-linux-gnu with
--with-arch=rvNimafdc_zba_zbb_zbc_zbs where N is replaced with 32 or 64.

Thanks,
Andrew Pinski

gcc/ChangeLog:

	PR target/106586
	* config/riscv/predicates.md (single_bit_mask_operand):
	Use SINGLE_BIT_MASK_OPERAND instead of directly calling pow2p_hwi.
	(not_single_bit_mask_operand): Likewise.
	* config/riscv/riscv.cc (riscv_build_integer_1): Don't special case
	1<<31 for 32bits as it is already handled.
	Call trunc_int_for_mode on the upper part after the subtraction.
	(riscv_move_integer): Call trunc_int_for_mode before generating
	the integer just make sure the constant has been sign extended
	corectly.
	(riscv_emit_int_compare): Call trunc_int_for_mode after doing the
	addition for the new rhs.
	* config/riscv/riscv.h (SINGLE_BIT_MASK_OPERAND): If !TARGET64BIT,
	then mask off the upper 32bits of the HWI as it will be sign extended.
2022-08-24 12:15:33 -07:00
Andrew Pinski
95989ab39b [RISCV] Use a constraint for bset<mode>_mask and bset<mode>_1_mask
A constraint here just makes it easier to understand what the
operands are.

OK? Built and tested on riscv32-linux-gnu and riscv64-linux-gnu with
--with-arch=rvNimafdc_zba_zbb_zbc_zbs (where N is 32 and 64).

Thanks,
Andrew Pinski

gcc/ChangeLog:

	* config/riscv/constraints.md (DsS): New constraint.
	(DsD): New constraint.
	* config/riscv/iterators.md (shiftm1c): New iterator.
	* config/riscv/bitmanip.md (*bset<mode>_mask):
	Use shiftm1c.
	(*bset<mode>_1_mask): Likewise.
2022-08-24 12:15:32 -07:00
Andrew Pinski
b7d4b734f2 [RISCV] Use constraints/predicates instead of checking const_int directly for shNadd patterns
This simplifies the code by adding a predicate and a constraint for 1/2/3.
The aarch64 backend has a similar predicate called aarch64_shift_imm_<mode>
which they use there.

OK? Built and tested on riscv32-linux-gnu and riscv64-linux-gnu with no regressions.

Thanks,
Andrew Pinski

gcc/ChangeLog:

	* config/riscv/constraints.md (Ds3): New constraint.
	* config/riscv/predicates.md (imm123_operand): New predicate.
	* config/riscv/bitmanip.md (*shNadd): Use Ds3 and imm123_operand.
	(*shNadduw): Likewise.
2022-08-24 12:15:32 -07:00
Andrew Pinski
473d7aad84 [RISCV] Add %~ to print w if TARGET_64BIT and use it
To make things easier and more maintainable, we need to
add support printing out w if TARGET_64BIT so this patch
adds %~ to do that, similar how the x86 backend uses %~
to print out i/f for TARGET_AVX2. We could have chosen any
punctuation symbol but ~ looks the closest to w.

OK? Build and tested for riscv64-linux-gnu and riscv32-linux-gnu with no regressions.

Thanks,
Andrew Pinski

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_print_operand):
	Handle '~'.
	(riscv_print_operand_punct_valid_p): New function
	(TARGET_PRINT_OPERAND_PUNCT_VALID_P): Define.
	* config/riscv/bitmanip.md (<bitmanip_optab>si2/clz_ctz_pcnt):
	Use %~ instead of conditional the pattern on TARGET_64BIT.
	(rotrsi3): Likewise.
	(rotlsi3): Likewise.
	* config/riscv/riscv.md: Add ~ to the list of modifiers.
	(addsi3): Use %~ instead of conditional the pattern on TARGET_64BIT.
	(subsi3): Likewise.
	(negsi2): Likewise.
	(mulsi3): Likewise.
	(optab>si3/any_div): Likewise.
	(*add<mode>hi3): Likewise.
	(<optab>si3/any_shift): Likewise.
2022-08-24 12:15:31 -07:00
Andrew Pinski
380b8fd96e [RISCV] Add the list of operand modifiers to riscv.md too
To make it easier to find operands modifiers while in the md
file, add the list of modifiers to the top of the md file.
This is similar to i386 target.

OK? Built and tested for riscv32-linux-gnu and riscv64-linux-gnu.

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_print_operand): Make a mention to
	keep the list in riscv.md in sync with this list.
	* config/riscv/riscv.md: Add list of modifiers as comments.
2022-08-24 12:15:31 -07:00