Commit Graph

214118 Commits

Author SHA1 Message Date
Jason Merrill
5dad738c1d c++: record template specialization hash
A lot of compile time of template-heavy code is spent in re-hashing
hashtable elements upon expansion.  The following records the hash in the
hash element.  This speeds up C++20 compilation of stdc++.h by about 25% for
about a 0.1% increase in memory usage.

With the hash value in the entry, we don't need to pass it separately to the
find functions.

Adding default arguments to the spec and hash fields simplifies spec_entry
initialization and avoids problems from hash starting with an indeterminate
value.

gcc/cp/ChangeLog:

	* cp-tree.h (spec_entry::hash): New member.
	* pt.cc (spec_hasher::hash): Set it and return it.
	(maybe_process_partial_specialization): Clear it when
	changing tmpl/args.
	(lookup_template_class): Likewise, don't pass hash to find.
	(retrieve_specialization): Set it, don't pass hash to find.
	(register_specialization): Don't pass hash to find.
	(reregister_specialization): Likewise.
	(match_mergeable_specialization): Likewise.
	(add_mergeable_specialization): Likewise.

Co-authored-by: Richard Biener <rguenther@suse.de>
2024-10-03 21:43:21 -04:00
GCC Administrator
e175fb380a Daily bump. 2024-10-04 00:17:32 +00:00
Jason Merrill
d77f073ce6 c++: free garbage vec in coerce_template_parms
coerce_template_parms can create two different vecs for the inner template
arguments, new_inner_args and (potentially) the result of
expand_template_argument_pack.  One or the other, or possibly both, end up
being garbage: in the typical case, the expanded vec is garbage because it's
only used as the source for convert_template_argument.  In some dependent
cases, the new vec is garbage because we decide to return the original args
instead.  In these cases, ggc_free the garbage vec to reduce the memory
overhead of overload resolution.

gcc/cp/ChangeLog:

	* pt.cc (coerce_template_parms): Free garbage vecs.

Co-authored-by: Richard Biener <rguenther@suse.de>
2024-10-03 16:31:00 -04:00
Eric Botcazou
547219f41f Aarch64: Define WIDEST_HARDWARE_FP_SIZE
The macro is documented like this in the internal manual:

 -- Macro: WIDEST_HARDWARE_FP_SIZE
     A C expression for the size in bits of the widest floating-point
     format supported by the hardware.  If you define this macro, you
     must specify a value less than or equal to mode precision of the
     mode used for C type 'long double' (from hook
     'targetm.c.mode_for_floating_type' with argument
     'TI_LONG_DOUBLE_TYPE').  If you do not define this macro, mode
     precision of the mode used for C type 'long double' is the default.

AArch64 uses 128-bit TFmode for long double but, as far as I know, no FPU
implemented in hardware supports it.

gcc/
	* config/aarch64/aarch64.h (WIDEST_HARDWARE_FP_SIZE): Define to 64.

gcc/testsuite/
	* gnat.dg/specs/size_clause6.ads: New test.
2024-10-03 20:02:27 +02:00
Jason Merrill
fe33530e62 Revert "c++: free garbage vec in coerce_template_parms"
This broke bootstrap, improving.

This reverts commit 5b08ae503d.
2024-10-03 13:25:43 -04:00
Jason Merrill
dca2b47916 c++: -Wdeprecated enables later standard deprecations
By default -Wdeprecated warns about deprecations in the active standard.
When specified explicitly, let's also warn about deprecations in later
standards.

gcc/c-family/ChangeLog:

	* c-opts.cc (c_common_post_options): Explicit -Wdeprecated enables
	deprecations from later standards.

gcc/ChangeLog:

	* doc/invoke.texi: Explicit -Wdeprecated enables more warnings.
2024-10-03 12:39:00 -04:00
Jason Merrill
b6ff52a995 c++: add -Wdeprecated-literal-operator [CWG2521]
C++23 CWG issue 2521 (https://wg21.link/cwg2521) deprecates user-defined
literal operators declared with the optional space between "" and the
suffix.

Many testcases used that syntax; I removed the space from most of them, and
added C++23 warning tests to a few.

	CWG 2521

gcc/ChangeLog:

	* doc/invoke.texi: Document -Wdeprecated-literal-operator.

gcc/c-family/ChangeLog:

	* c.opt: Add -Wdeprecated-literal-operator.
	* c-opts.cc (c_common_post_options): Default on in C++23.
	* c.opt.urls: Regenerate.

gcc/cp/ChangeLog:

	* parser.cc (location_between): New.
	(cp_parser_operator): Handle -Wdeprecated-literal-operator.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/udlit-string-literal.h
	* g++.dg/cpp0x/Wliteral-suffix2.C
	* g++.dg/cpp0x/constexpr-55708.C
	* g++.dg/cpp0x/gnu_fext-numeric-literals.C
	* g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
	* g++.dg/cpp0x/pr51420.C
	* g++.dg/cpp0x/pr60209-neg.C
	* g++.dg/cpp0x/pr60209.C
	* g++.dg/cpp0x/pr61038.C
	* g++.dg/cpp0x/std_fext-numeric-literals.C
	* g++.dg/cpp0x/std_fno-ext-numeric-literals.C
	* g++.dg/cpp0x/udlit-addr.C
	* g++.dg/cpp0x/udlit-args-neg.C
	* g++.dg/cpp0x/udlit-args.C
	* g++.dg/cpp0x/udlit-args2.C
	* g++.dg/cpp0x/udlit-clink-neg.C
	* g++.dg/cpp0x/udlit-concat-neg.C
	* g++.dg/cpp0x/udlit-concat.C
	* g++.dg/cpp0x/udlit-constexpr.C
	* g++.dg/cpp0x/udlit-cpp98-neg.C
	* g++.dg/cpp0x/udlit-declare-neg.C
	* g++.dg/cpp0x/udlit-embed-quote.C
	* g++.dg/cpp0x/udlit-extended-id-1.C
	* g++.dg/cpp0x/udlit-extended-id-3.C
	* g++.dg/cpp0x/udlit-extern-c.C
	* g++.dg/cpp0x/udlit-friend.C
	* g++.dg/cpp0x/udlit-general.C
	* g++.dg/cpp0x/udlit-implicit-conv-neg-char8_t.C
	* g++.dg/cpp0x/udlit-implicit-conv-neg.C
	* g++.dg/cpp0x/udlit-inline.C
	* g++.dg/cpp0x/udlit-mangle.C
	* g++.dg/cpp0x/udlit-member-neg.C
	* g++.dg/cpp0x/udlit-namespace.C
	* g++.dg/cpp0x/udlit-nofunc-neg.C
	* g++.dg/cpp0x/udlit-nonempty-str-neg.C
	* g++.dg/cpp0x/udlit-nosuffix-neg.C
	* g++.dg/cpp0x/udlit-nounder-neg.C
	* g++.dg/cpp0x/udlit-operator-neg.C
	* g++.dg/cpp0x/udlit-overflow-neg.C
	* g++.dg/cpp0x/udlit-overflow.C
	* g++.dg/cpp0x/udlit-preproc-neg.C
	* g++.dg/cpp0x/udlit-raw-length.C
	* g++.dg/cpp0x/udlit-raw-op-string-neg.C
	* g++.dg/cpp0x/udlit-raw-op.C
	* g++.dg/cpp0x/udlit-raw-str.C
	* g++.dg/cpp0x/udlit-resolve-char8_t.C
	* g++.dg/cpp0x/udlit-resolve.C
	* g++.dg/cpp0x/udlit-shadow-neg.C
	* g++.dg/cpp0x/udlit-string-length.C
	* g++.dg/cpp0x/udlit-suffix-neg.C
	* g++.dg/cpp0x/udlit-template.C
	* g++.dg/cpp0x/udlit-tmpl-arg-neg.C
	* g++.dg/cpp0x/udlit-tmpl-arg-neg2.C
	* g++.dg/cpp0x/udlit-tmpl-arg.C
	* g++.dg/cpp0x/udlit-tmpl-parms-neg.C
	* g++.dg/cpp0x/udlit-tmpl-parms.C
	* g++.dg/cpp1y/pr57640.C
	* g++.dg/cpp1y/pr88872.C
	* g++.dg/cpp26/unevalstr1.C
	* g++.dg/cpp2a/concepts-pr60391.C
	* g++.dg/cpp2a/consteval-prop21.C
	* g++.dg/cpp2a/nontype-class6.C
	* g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C
	* g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C
	* g++.dg/cpp2a/udlit-class-nttp-ctad.C
	* g++.dg/cpp2a/udlit-class-nttp-neg.C
	* g++.dg/cpp2a/udlit-class-nttp-neg2.C
	* g++.dg/cpp2a/udlit-class-nttp.C
	* g++.dg/ext/is_convertible2.C
	* g++.dg/lookup/pr87269.C
	* g++.dg/cpp0x/udlit_system_header: Adjust for C++23 deprecated
	operator "" _suffix.
	* g++.dg/DRs/dr2521.C: New test.
2024-10-03 12:39:00 -04:00
Jason Merrill
5b08ae503d c++: free garbage vec in coerce_template_parms
coerce_template_parms can create two different vecs for the inner template
arguments, new_inner_args and (potentially) the result of
expand_template_argument_pack.  One or the other, or possibly both, end up
being garbage: in the typical case, the expanded vec is garbage because it's
only used as the source for convert_template_argument.  In some dependent
cases, the new vec is garbage because we decide to return the original args
instead.  In these cases, ggc_free the garbage vec to reduce the memory
overhead of overload resolution.

gcc/cp/ChangeLog:

	* pt.cc (struct free_if_changed_proxy): New.
	(coerce_template_parms): Use it.

Co-authored-by: Richard Biener  <rguenther@suse.de>
2024-10-03 12:33:53 -04:00
Georg-Johann Lay
8d63d87c6d AVR: Make gcc.dg/c23-stdarg-9.c work.
gcc/testsuite/
	* gcc.dg/c23-stdarg-9.c (struct S) [AVR]: Only use int a[500].
2024-10-03 15:22:47 +02:00
Jonathan Wakely
0d9d687208
libstdc++: Make Unicode utils work with Parallel Mode
libstdc++-v3/ChangeLog:

	* include/bits/unicode.h (__unicode::__is_incb_linker): Use
	_GLIBCXX_STD_A namespace for std::find.
2024-10-03 12:29:55 +01:00
Jonathan Wakely
7754a8b7b4
libstdc++: Fix -Wdeprecated-declarations warning for Parallel Mode [PR116944]
The pragmas to disable warnings need to be moved before the first use of
the deprecated classes.

libstdc++-v3/ChangeLog:

	PR libstdc++/116944
	* include/parallel/base.h: Move diagnostic pragmas earlier.
2024-10-03 12:29:55 +01:00
Jonathan Wakely
28911f6268
libstdc++: Fix some warnings seen during bootstrap
libstdc++-v3/ChangeLog:

	* include/bits/locale_facets_nonio.tcc (money_put::__do_get):
	Ignore -Wformat warning for __ibm128 arguments.
	* include/tr1/tuple (ignore): Ignore -Wunused warning.
2024-10-03 12:29:55 +01:00
Richard Biener
34670dee56 Restore aarch64 bootstrap
This zero-initializes vec_init to avoid a bogus maybe-uninitialized
diagnostic.

	* tree-vect-loop.cc (vectorizable_induction): Initialize
	vec_init.
2024-10-03 13:26:21 +02:00
Andrew Pinski
edec4bfc99 aarch64: Fix early ra for -fno-delete-dead-exceptions [PR116927]
Early-RA was considering throwing instructions as being dead and removing
them even if -fno-delete-dead-exceptions was in use. This fixes that oversight.

Built and tested for aarch64-linux-gnu.

	PR target/116927

gcc/ChangeLog:

	* config/aarch64/aarch64-early-ra.cc (early_ra::is_dead_insn): Insns
	that throw are not dead with -fno-delete-dead-exceptions.

gcc/testsuite/ChangeLog:

	* g++.dg/torture/pr116927-1.C: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-03 01:31:11 -07:00
François Dumont
ccb6e08a4d
libstdc++: [_Hashtable] Fix some implementation inconsistencies
Get rid of the different usages of the mutable keyword except in
_Prime_rehash_policy where it is preserved for abi compatibility reason.

Fix comment to explain that we need the computation of bucket index noexcept
to be able to rehash the container when needed.

For Standard instantiations through std::unordered_xxx containers we already
force caching of hash code when hash functor is not noexcep so it is guarantied.

The static_assert purpose in _Hashtable on _M_bucket_index is thus limited
to usages of _Hashtable with exotic _Hashtable_traits.

libstdc++-v3/ChangeLog:

	* include/bits/hashtable_policy.h (_NodeBuilder<>::_S_build): Remove
	const qualification on _NodeGenerator instance.
	(_ReuseOrAllocNode<>::operator()(_Args&&...)): Remove const qualification.
	(_ReuseOrAllocNode<>::_M_nodes): Remove mutable.
	(_Insert_base<>::_M_insert_range): Remove _NodeGetter const qualification.
	(_Hash_code_base<>::_M_bucket_index(const _Hash_node_value<>&, size_t)):
	Simplify noexcept declaration, we already static_assert that _RangeHash functor
	is noexcept.
	* include/bits/hashtable.h: Rework comments. Remove const qualifier on
	_NodeGenerator& arguments.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2024-10-03 06:44:21 +02:00
David Malcolm
caef7002b7 diagnostics: support SARIF 2.2 output, undocumented for now [PR116301]
GCC currently supports outputting SARIF v2.1.0

Version 2.2 of the SARIF spec is not yet official, but the draft has
already gained features we might might want to use.

This patch extends the SARIF output code to accept a enum sarif_version
parameter internally, representing 2.1.0 or a prerelease of 2.2

The patch updates the SARIF output selftests so that they are run for
all such versions.

I hope to expose this "properly" via the mechanism described
in comment #13 of PR116613.  In the meantime, the patch adds a new
  -fdiagnostics-format=sarif-file-2.2-prerelease
for use by the DejaGnu testsuite, deliberately left undocumented for
now.

The copy of the 2.2 draft schema in the testsuite was downloaded from
https://raw.githubusercontent.com/oasis-tcs/sarif-spec/refs/tags/2.2-prerelease-2024-08-08/sarif-2.2/schema/sarif-2-2.schema.json

The patch adds support for capturing related locations within an ICE
notification for SARIF 2.2 onwards, thus capturing "include chain"
information for SARIF-based reports of ICEs that occur within a
header; see https://github.com/oasis-tcs/sarif-spec/issues/540

The patch does *not* add support for the "scannedFile" role, leaving it
to followup work; see https://github.com/oasis-tcs/sarif-spec/issues/459

gcc/ChangeLog:
	PR other/116301
	* common.opt (sarif-file-2.2-prerelease): New value for
	-fdiagnostics-format=.
	* diagnostic-format-sarif.cc
	(sarif_location_manager::sarif_location_manager): Move
	initialization of m_related_locations_arr here from sarif_result's
	ctor.
	(sarif_location_manager::add_related_location): Implement for
	base class, taking sarif_result's implementation.  Add "builder"
	param.
	(sarif_location_manager::m_related_locations_arr): Move here from
	class sarif_result.
	(class sarif_result): Move m_related_locations_arr field and
	add_related_location vfunc to class sarif_location_manager.
	(sarif_builder::get_version): New accessor.
	(sarif_builder::m_version): New field.
	(sarif_invocation::add_notification_for_ice): Call
	process_worklist on the notification for SARIF 2.2 and later.
	(sarif_location_manager::process_worklist_item): Pass builder to
	calls to add_related_location.
	(sarif_result::on_nested_diagnostic): Likewise.
	(sarif_result::on_diagram): Likewise.
	(sarif_ice_notification::add_related_location): Add builder param.
	For SARIF 2.2 and later chain up to base class impl so that
	notifications get related locations.
	(sarif_builder::sarif_builder): Add "version" param.
	(SARIF_SCHEMA): Delete in favor of...
	(sarif_version_to_url): New function.
	(SARIF_VERSION): Delete in favor of...
	(sarif_version_to_property): New function.
	(make_top_level_object): Update to use m_version for "$schema" and
	"version".
	(sarif_output_format::sarif_output_format): Add "version" param.
	(sarif_stream_output_format::sarif_stream_output_format):
	Likewise.
	(sarif_file_output_format::sarif_file_output_format): Likewise.
	(diagnostic_output_format_init_sarif_stderr): Likewise.
	(diagnostic_output_format_init_sarif_file): Likewise.
	(diagnostic_output_format_init_sarif_stream): Likewise.
	(selftest::test_sarif_diagnostic_context): Likewise.
	(selftest::test_make_location_object): Likewise.
	(selftest::test_simple_log): Likewise.  Update schema and version
	tests accordingly.
	(selftest::test_simple_log_2): Add "version" param.
	(selftest::test_message_with_embedded_link): Likewise.
	(selftest::run_tests_per_version): New, based on the
	for_each_line_table_case calls in...
	(selftest::diagnostic_format_sarif_cc_tests): Add loop over sarif
	versions.  Replace for_each_line_table_case calls with one
	call to run_tests_per_version.
	* diagnostic-format-sarif.h: Include "diagnostic-format.h".
	(enum class sarif_version): New.
	(diagnostic_output_format_init_sarif_stderr): Move to here from
	diagnostic-format.h.  Add "version" param.
	(diagnostic_output_format_init_sarif_file): Likewise.
	(diagnostic_output_format_init_sarif_stream): Likewise.
	* diagnostic-format.h: Include "diagnostic.h".
	(diagnostic_output_format_init_sarif_stderr): Move from here to
	diagnostic-format-sarif.h.
	* diagnostic.cc: Define INCLUDE_MEMORY.
	Include "diagnostic-format-sarif.h".
	(diagnostic_output_format_init): Pass sarif_version::v2_1_0 to
	existing SARIF options.
	Add case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE_2_2_PRERELEASE.
	* diagnostic.h (enum diagnostics_output_format): Add
	DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE_2_2_PRERELEASE.

gcc/testsuite/ChangeLog:
	PR other/116301
	* gcc.dg/plugin/crash-test-ice-in-header-sarif-2.1.c: New test.
	* gcc.dg/plugin/crash-test-ice-in-header-sarif-2.2.c: New test.
	* gcc.dg/plugin/crash-test-ice-in-header-sarif-2_1.py: Support
	script for new test.
	* gcc.dg/plugin/crash-test-ice-in-header-sarif-2_2.py: Likewise.
	* gcc.dg/plugin/crash-test-ice-in-header.h: New header.
	* gcc.dg/plugin/plugin.exp: Add the new tests.
	* lib/sarif-schema-2.2-prerelease-2024-08-08.json: New schema
	file.
	* lib/scansarif.exp (verify-sarif-file): Add optional argument for
	specifying which version of the schema to validate against,
	supporting "2.1" and "2.2", defaulting to the former.
	Update the test name to capture the version of the schema tested
	against.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-10-02 22:05:03 -04:00
GCC Administrator
1d09117830 Daily bump. 2024-10-03 00:18:37 +00:00
Andrew Pinski
1f619fe259 phiopt: Fix VCE moving by rewriting it into cast [PR116098]
Phiopt match_and_simplify might move a well defined VCE assign statement
from being conditional to being uncondtitional; that VCE might no longer
being defined. It will need a rewrite into a cast instead.

This adds the rewriting code to move_stmt for the VCE case.
This is enough to fix the issue at hand. It should also be using rewrite_to_defined_overflow
but first I need to move the check to see a rewrite is needed into its own function
and that is causing issues (see https://gcc.gnu.org/pipermail/gcc-patches/2024-September/663938.html).
Plus this version is easiest to backport.

Bootstrapped and tested on x86_64-linux-gnu.

	PR tree-optimization/116098

gcc/ChangeLog:

	* tree-ssa-phiopt.cc (move_stmt): Rewrite VCEs from integer to integer
	types to case.

gcc/testsuite/ChangeLog:

	* c-c++-common/torture/pr116098-2.c: New test.
	* g++.dg/torture/pr116098-1.C: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-02 17:16:01 +00:00
Georg-Johann Lay
77c3ef08e9 testsuite/52641 - Make gcc.dg/strict-flex-array-3.c work on int != 32 bits.
PR testsuite/52641
gcc/testsuite/
	* gcc.dg/strict-flex-array-3.c (expect) [AVR]: Use custom
	version due to AVR-LibC limitations.
	(stuff): Use __SIZEOF_INT__ instead of hard-coded values.
2024-10-02 19:09:18 +02:00
Georg-Johann Lay
524b9c2e62 AVR: Make gcc.dg/pr113596.c work.
gcc/testsuite/
	* gcc.dg/pr113596.c: Require less memory so it works on AVR.
2024-10-02 18:42:26 +02:00
Georg-Johann Lay
5bf78cf0a2 testsuite/52641 - Require int32 for gcc.dg/pr93820-2.c.
PR testsuite/52641
gcc/testsuite/
	* gcc.dg/pr93820-2.c: Add dg-require-effective-target int32.
2024-10-02 17:16:55 +02:00
Georg-Johann Lay
875a1df813 testsuite/52641 - Fix gcc.dg/signbit-6.c for int != 32-bit targets.
PR testsuite/52641
gcc/testsuite/
	* gcc.dg/signbit-6.c (main): Initialize a[0] and b[0]
	with INT32_MIN (instead of with INT_MIN).
2024-10-02 16:50:36 +02:00
Victor Do Nascimento
4d9e473d12 middle-end: Fix ifcvt predicate generation for masked function calls
Up until now, due to a latent bug in the code for the ifcvt pass,
irrespective of the branch taken in a conditional statement, the
original condition for the if statement was used in masking the
function call.

Thus, for code such as:

  if (a[i] > limit)
    b[i] = fixed_const;
  else
    b[i] = fn (a[i]);

we would generate the following (wrong) if-converted tree code:

  _1 = a[i_1];
  _2 = _1 > limit;
  _3 = .MASK_CALL (fn, _1, _2);
  cstore_4 = _2 ? fixed_const : _3;

as opposed to the correct expected sequence:

  _1 = a[i_1];
  _2 = _1 > limit;
  _3 = ~_2;
  _4 = .MASK_CALL (fn, _1, _3);
  cstore_5 = _2 ? fixed_const : _4;

This patch ensures that the correct predicate mask generation is
carried out such that, upon autovectorization, the correct vector
lanes are selected in the vectorized function call.

gcc/ChangeLog:

	* tree-if-conv.cc (predicate_statements): Fix handling of
	predicated function calls.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/vect-fncall-mask.c: New.
2024-10-02 15:27:42 +01:00
Andre Vieira
4e11ad7c34 arm: Prevent ICE when doloop dec_set is not PLUS expr
This patch refactors and fixes an issue where arm_mve_dlstp_check_dec_counter
was making an assumption about the form of what a candidate for a dec_insn
should be, which caused an ICE.
This dec_insn is the instruction that decreases the loop counter inside a
decrementing loop and we expect it to have the following form:
(set (reg CONDCOUNT)
     (plus (reg CONDCOUNT)
           (const_int)))

Where CONDCOUNT is the loop counter, and const int is the negative constant
used to decrement it.

This patch also improves our search for a valid dec_insn.  Before this patch
we'd only look for a dec_insn inside the loop header if the loop latch was
empty.  We now also search the loop header if the loop latch is not empty but
the last instruction is not a valid dec_insn.  This could potentially be improved
to search all instructions inside the loop latch.

gcc/ChangeLog:

	* config/arm/arm.cc (check_dec_insn): New helper function containing
	code hoisted from...
	(arm_mve_dlstp_check_dec_counter): ... here. Use check_dec_insn to
	check the validity of the candidate dec_insn.

gcc/testsuite/ChangeLog:

	* gcc.target/arm/mve/dlstp-loop-form.c: New test.
2024-10-02 15:15:47 +01:00
Simon Martin
3a52838657 c++: Fix regression introduced by r15-3796 [PR116722]
Jason pointed out that the fix I made for PR116722 via r15-3796
introduces a regression when running constexpr-dynamic10.C with
-fimplicit-constexpr.

The problem is that my change makes us leave cxx_eval_call_expression
early, and bypass the call to cxx_eval_thunk_call (through a recursive
call to cxx_eval_call_expression) that used to emit an error for that
testcase with -fimplicit-constexpr.

This patch emits the error if !ctx->quiet before bailing out because the
{con,de}structor belongs to a class with virtual bases.

	PR c++/116722

gcc/cp/ChangeLog:

	* constexpr.cc (cxx_bind_parameters_in_call): When !ctx->quiet,
	emit error before bailing out due to a call to {con,de}structor
	for a class with virtual bases.
2024-10-02 15:32:37 +02:00
Richard Biener
dafbfdb015 Replace another missed iterative_hash_object
I missed one that's actually hit quite a lot, hashing of the canonical
type TYPE_HASH.

gcc/cp/
	* pt.cc (iterative_hash_template_arg): Use iterative_hash_hashval_t
	to hash TYPE_HASH.
2024-10-02 15:29:10 +02:00
Filip Kastl
ffc389cb11 gimple ssa: Don't use __builtin_popcount in switch exp transform [PR116616]
Switch exponential transformation in the switch conversion pass
currently generates

tmp1 = __builtin_popcount (var);
tmp2 = tmp1 == 1;

when inserting code to determine if var is power of two.  If the target
doesn't support expanding the builtin as special instructions switch
conversion relies on this whole pattern being expanded as bitmagic.
However, it is possible that other GIMPLE optimizations move the two
statements of the pattern apart.  In that case the builtin becomes a
libgcc call in the final binary.  The call is slow and in case of
freestanding programs can result in linking error (this bug was
originally found while compiling Linux kernel).

This patch modifies switch conversion to insert the bitmagic
(var ^ (var - 1)) > (var - 1) instead of the builtin.

gcc/ChangeLog:

	PR tree-optimization/116616
	* tree-switch-conversion.cc (can_pow2p): Remove this function.
	(gen_pow2p): Generate bitmagic instead of a builtin.  Remove the
	TYPE parameter.
	(switch_conversion::is_exp_index_transform_viable): Don't call
	can_pow2p.
	(switch_conversion::exp_index_transform): Call gen_pow2p without
	the TYPE parameter.
	* tree-switch-conversion.h: Remove
	m_exp_index_transform_pow2p_type.

gcc/testsuite/ChangeLog:

	PR tree-optimization/116616
	* gcc.target/i386/switch-exp-transform-1.c: Don't test for
	presence of the POPCOUNT internal fn call.

Signed-off-by: Filip Kastl <fkastl@suse.cz>
2024-10-02 14:14:44 +02:00
Richard Biener
842fbfa15f Speedup iterative_hash_template_arg
Using iterative_hash_object is expensive compared to using
iterative_hash_hashval_t which is fit for integer sized values.
The following reduces the number of perf cycles spent in
iterative_hash_template_arg and iterative_hash combined by 20%.

gcc/cp/
	* pt.cc (iterative_hash_template_arg): Avoid using
	iterative_hash_object.
2024-10-02 13:59:58 +02:00
Richard Biener
77c5e4ad08 Adjust gcc.dg/vect/slp-12a.c
We can now SLP the loop.  There's PR116583 tracking that this still
fails for VLA vectors when load-lanes doesn't support a group of
size 8.  We can't express this right now so the testcase keeps
FAILing for aarch64 with SVE (but passes now for riscv).

	* gcc.dg/vect/slp-12a.c: Adjust.
2024-10-02 13:45:54 +02:00
Richard Biener
32b99dad9a Adjust expectation for gcc.dg/vect/slp-19c.c
We can now vectorize the first loop with SLP when using V2SImode
vectors since then we can handle the non-power-of-two interleaving.
We can also SLP the second loop reliably now after adding induction
support for VLA vectors.

	* gcc.dg/vect/slp-19c.c: Adjust expectation.
2024-10-02 13:45:54 +02:00
Richard Biener
71896a8bdc un-XFAIL gcc.dg/vect/vect-double-reduc-5.c
The testcase now passes, we can handle double reductions with multiple
types fine.

	* gcc.dg/vect/vect-double-reduc-5.c: Un-XFAIL everywhere.
2024-10-02 13:23:10 +02:00
Richard Biener
61d87f2791 testsuite/116596 - fix gcc.dg/vect/slp-11a.c
The condition on "vectorizing stmts using SLP" needs to match that
of "vectorized 1 loops", obviously.

	PR testsuite/116596
	* gcc.dg/vect/slp-11a.c: Fix.
2024-10-02 13:02:06 +02:00
Richard Biener
02f4efe3c1 tree-optimization/113197 - bougs assert in PTA
PTA asserts that EAF_NO_DIRECT_READ is not set when flags are
set consistently which doesn't make sense.  The following removes
the assert.

	PR tree-optimization/113197
	* tree-ssa-structalias.cc (handle_call_arg): Remove bougs
	assert.

	* gcc.dg/lto/pr113197_0.c: New testcase.
	* gcc.dg/lto/pr113197_1.c: Likewise.
2024-10-02 12:56:02 +02:00
Richard Biener
4ba4165d66 tree-optimiztation/114855 - profile prediction slowness
The testcase in PR114855 shows profile prediction to evaluate
the same SSA def via expr_expected_value for each condition or
switch in a function.  The following patch caches the expected
value (and probability/predictor) for each visited SSA def,
also protecting against recursion and thus obsoleting the visited
bitmap.  This reduces the time spent in branch prediction from
1.2s to 0.3s, though callgrind which was how I noticed this
seems to be comparatively very much happier about the change than
this number suggests.

	PR tree-optimization/114855
	* predict.cc (ssa_expected_value): New global.
	(expr_expected_value): Do not take bitmap.
	(expr_expected_value_1): Likewise.  Use ssa_expected_value
	to cache results for a SSA def.
	(tree_predict_by_opcode): Adjust.
	(tree_estimate_probability): Manage ssa_expected_value.
	(tree_guess_outgoing_edge_probabilities): Likewise.
2024-10-02 12:55:57 +02:00
Jonathan Wakely
c534e37fac
libstdc++: Populate std::time_get::get's %c format for C locale
We were using the empty string "" for D_T_FMT and ERA_D_T_FMT in the C
locale, instead of "%a %b %e %T %Y" as the C standard requires. Set it
correctly for each locale implementation that defines time_members.cc.

We can also explicitly set the _M_era_xxx pointers to the same values as
the corresponding _M_xxx ones, rather than setting them to point to
identical string literals. This doesn't rely on the compiler merging
string literals, and makes it more explicit that they're the same in the
C locale.

libstdc++-v3/ChangeLog:

	* config/locale/dragonfly/time_members.cc
	(__timepunct<char>::_M_initialize_timepunc)
	(__timepunct<wchar_t>::_M_initialize_timepunc): Set
	_M_date_time_format for C locale. Set %Ex formats to the same
	values as the %x formats.
	* config/locale/generic/time_members.cc: Likewise.
	* config/locale/gnu/time_members.cc: Likewise.
	* testsuite/22_locale/time_get/get/char/5.cc: New test.
	* testsuite/22_locale/time_get/get/wchar_t/5.cc: New test.
2024-10-02 11:36:17 +01:00
Jonathan Wakely
5cf26f2569
libstdc++: Fix rounding in chrono::parse
I noticed that chrono::parse was using duration_cast and time_point_cast
to convert the parsed value to the result. Those functions truncate
towards zero, which is not generally what you want. Especially for
negative times before the epoch, where truncating towards zero rounds
"up" towards the next duration/time_point. Using chrono::round is
typically better, as that rounds to nearest.

However, while testing the fix I realised that rounding to the nearest
can give surprising results in some cases. For example if we parse a
chrono::sys_days using chrono::parse("F %T", "2024-09-22 18:34:56", tp)
then we will round up to the next day, i.e. sys_days(2024y/09/23). That
seems surprising, and I think 2024-09-22 is what most users would
expect.

This change attempts to provide a hybrid rounding heuristic where we use
chrono::round for the general case, but when the result has a period
that is one of minutes, hours, days, weeks, or years then we truncate
towards negative infinity using chrono::floor. This means that we
truncate "2024-09-22 18:34:56" to the start of the current
minute/hour/day/week/year, instead of rounding up to 2024-09-23, or to
18:35, or 17:00. For a period of months chrono::round is used, because
the months duration is defined as a twelfth of a year, which is not
actually the length of any calendar month. We don't want to truncate to
a whole number of "months" if that can actually go from e.g. 2023-03-01
to 2023-01-31, because February is shorter than chrono::months(1).

libstdc++-v3/ChangeLog:

	* include/bits/chrono_io.h (__detail::__use_floor): New
	function.
	(__detail::__round): New function.
	(from_stream): Use __detail::__round.
	* testsuite/std/time/clock/file/io.cc: Check for expected
	rounding in parse.
	* testsuite/std/time/clock/gps/io.cc: Likewise.
2024-10-02 11:36:17 +01:00
Jonathan Wakely
05b7ab86e7
libstdc++: Fix -Wlong-long warning in <bits/postypes.h>
For 32-bit targets __INT64_TYPE__ expands to long long, which gives a
pedwarn for C++98 mode, causing:

FAIL: 17_intro/headers/c++1998/all_pedantic_errors.cc  -std=gnu++98 (test for excess errors)
Excess errors:
.../bits/postypes.h:64: error: ISO C++ 1998 does not support 'long long' [-Wlong-long]

libstdc++-v3/ChangeLog:

	* include/bits/postypes.h: Fix -Wlong-long warning.
2024-10-02 11:29:11 +01:00
Richard Biener
79ea0aab75 testsuite/116660 - adjust testcases unexpectedly failing on 32bit sparc
Both testcases miss some effective target requires.

	PR testsuite/116660
	* gcc.dg/vect/no-scevccp-outer-12.c: Add vect_pack_trunc.
	* gcc.dg/vect/vect-multitypes-6.c: Add vect_char_add, remove
	explicit 32bit sparc XFAIL.
2024-10-02 11:29:36 +02:00
Richard Biener
ba7632674a tree-optimization/116566 - single lane SLP for VLA inductions
The following adds SLP support for vectorizing single-lane inductions
with variable length vectors.

	PR tree-optimization/116566
	* tree-vect-loop.cc (vectorizable_induction): Handle single-lane
	SLP for VLA vectors.

	* gcc.dg/tree-ssa/reassoc-46.c: When using partial vectors
	the dump-scan doesn't look for the required .COND_ADD so
	skip for partial vectors.
2024-10-02 11:12:21 +02:00
Gerald Pfeifer
56d0ee7a86 doc: Drop h8300-hms reference to binaries downloads
gcc:
	PR target/69374
	* doc/install.texi (Specific) <h8300-hms>: Drop obsolete
	reference to binaries download docs.
2024-10-02 17:10:33 +08:00
Jakub Jelinek
5943a2fa1b libcpp: Implement clang -Wheader-guard warning [PR96842]
The following patch implements the clang -Wheader-guard warning, which warns
if a valid multiple inclusion header guard's #ifndef/#if !defined directive
is immediately (no other non-line directives nor other (non-comment)
tokens in between) followed by #define directive for some different macro,
which in get_suggestion rules is close enough to the actual header guard
macro (i.e. likely misspelling), the #define is object-like with empty
definition (I've followed what clang implements) and the macro isn't defined
later on (at least not on the final #endif at the end of a header).

In this case it emits a warning, so that
  #ifndef STDIO_H
  #define STDOI_H
  ...
  #endif
or similar misspellings can be caught.

clang enables this warning by default, but I've put it into -Wall instead
as it still seems to be a style warning, nothing more severe; if a header
doesn't survive multiple inclusion because of the misspelling, users will
get different diagnostics.

2024-10-02  Jakub Jelinek  <jakub@redhat.com>

	PR preprocessor/96842
libcpp/
	* include/cpplib.h (struct cpp_options): Add warn_header_guard member.
	(enum cpp_warning_reason): Add CPP_W_HEADER_GUARD enumerator.
	* internal.h (struct cpp_reader): Add mi_def_cmacro, mi_loc and
	mi_def_loc members.
	(_cpp_defined_macro_p): Constify type pointed by argument type.
	Formatting fix.
	* init.cc (cpp_create_reader): Clear
	CPP_OPTION (pfile, warn_header_guard).
	* directives.cc (struct if_stack): Add def_loc and mi_def_cmacro
	members.
	(DIRECTIVE_TABLE): Add IF_COND flag to define.
	(do_define): Set ifs->mi_def_cmacro on a define immediately following
	#ifndef directive for the guard.  Clear pfile->mi_valid.  Formatting
	fix.
	(do_endif): Copy over pfile->mi_def_cmacro and pfile->mi_def_loc
	if ifs->mi_def_cmacro is set and pfile->mi_cmacro isn't a defined
	macro.
	(push_conditional): Clear mi_def_cmacro and mi_def_loc members.
	* files.cc (_cpp_pop_file_buffer): Emit -Wheader-guard diagnostics.
gcc/
	* doc/invoke.texi (Wheader-guard): Document.
gcc/c-family/
	* c.opt (Wheader-guard): New option.
	* c.opt.urls: Regenerated.
	* c-ppoutput.cc (init_pp_output): Initialize also cb->get_suggestion.
gcc/testsuite/
	* c-c++-common/cpp/Wheader-guard-1.c: New test.
	* c-c++-common/cpp/Wheader-guard-1-1.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-2.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-3.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-4.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-5.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-6.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-7.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-8.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-9.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-10.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-11.h: New test.
	* c-c++-common/cpp/Wheader-guard-1-12.h: New test.
	* c-c++-common/cpp/Wheader-guard-2.c: New test.
	* c-c++-common/cpp/Wheader-guard-2.h: New test.
	* c-c++-common/cpp/Wheader-guard-3.c: New test.
	* c-c++-common/cpp/Wheader-guard-3.h: New test.
2024-10-02 10:53:35 +02:00
Jakub Jelinek
ba53ccad55 opts: Fix up regenerate-opt-urls dependencies
It seems that we currently require
1) enabling at least c,c++,fortran,d in --enable-languages
2) first doing make html
before one can successfully regenerate-opt-urls, otherwise without 2)
one gets
make regenerate-opt-urls
make: *** No rule to make target '/home/jakub/src/gcc/obj12x/gcc/HTML/gcc-15.0.0/gcc/Option-Index.html', needed by 'regenerate-opt-urls'.  Stop.
or say if not configuring d after make html one still gets
make regenerate-opt-urls
make: *** No rule to make target '/home/jakub/src/gcc/obj12x/gcc/HTML/gcc-15.0.0/gdc/Option-Index.html', needed by 'regenerate-opt-urls'.  Stop.

Now, I believe neither 1) nor 2) is really necessary.
The regenerate-opt-urls goal has dependency on 3 Option-Index.html files,
but those files don't have dependencies how to generate them.
make html has dependency on $(HTMLS_BUILD) which adds
$(build_htmldir)/gcc/index.html and lang.html among other things, where
the former actually builds not just index.html but also Option-Index.html
and tons of other files, and lang.html is filled in by configure depending
on configured languages, so sometimes will include gfortran.html and
sometimes d.html.

The following patch adds dependencies of the Option-Index.html on their
corresponding index.html files and that is all that seems to be needed,
make regenerate-opt-urls then works even without prior make html and
even if just a subset of c/c++, fortran and d is enabled.

2024-10-02  Jakub Jelinek  <jakub@redhat.com>

	* Makefile.in ($(OPT_URLS_HTML_DEPS)): Add dependencies of the
	Option-Index.html files on the corresponding index.html files.
	Don't mention the requirement that all languages that have their own
	HTML manuals to be enabled.
2024-10-02 10:14:50 +02:00
Andrew Pinski
cea87c84ea backprop: Fix deleting of a phi node [PR116922]
The problem here is remove_unused_var is called on a name that is
defined by a phi node but it deletes it like removing a normal statement.
remove_phi_node should be called rather than gsi_remove for phinodes.

Note there is a possibility of using simple_dce_from_worklist instead
but that is for another day.

Bootstrapped and tested on x86_64-linux-gnu.

	PR tree-optimization/116922

gcc/ChangeLog:

	* gimple-ssa-backprop.cc (remove_unused_var): Handle phi
	nodes correctly.

gcc/testsuite/ChangeLog:

	* gcc.dg/torture/pr116922.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-02 00:36:33 -07:00
Richard Biener
9175d08f75 Fix gcc.dg/pr116905.c
I missed { dg-add-options float16 }.

	* gcc.dg/pr116905.c: Add float16 options.
2024-10-02 08:49:50 +02:00
Richard Biener
eb0698ae62 testsuite/116654 - adjust gcc.target/powerpc/p9-vec-length-full-8.c
gcc.target/powerpc/p9-vec-length-full-8.c was expecting all loops to
use -with-len fully masked vectorization to avoid epilogues because
the loops needed peeling for gaps.  With SLP we have improved things
here and the loops using V2D[IF]mode no longer need peeling for gaps
since the target can compose those vectors from two scalars and
in turn we generate better code and not need an epilogue either
(the iteration count divides by the VF).

	PR testsuite/116654
	* gcc.target/powerpc/p9-vec-length-full-8.c: Adjust.
2024-10-02 08:44:15 +02:00
Richard Biener
b56dc0a9ac testsuite/116654 - adjust gcc.dg/vect/costmodel/ppc/costmodel-slp-12.c
As we now SLP non-grouped stores we have to adjust the expected
count.

	PR testsuite/116654
	* gcc.dg/vect/costmodel/ppc/costmodel-slp-12.c: Adjust.
2024-10-02 08:44:15 +02:00
Richard Biener
e592ea8ddf tree-optimization/116654 - missed dr_explicit_realign[_optimized] with SLP
With single-lane SLP we miss to use the power realing loads causing
some testsuite FAILs.  r14-2430-g4736ddd11874fe exempted SLP of
non-grouped accesses because that could have been only splats
where the scheme isn't used anyway, but now with single-lane SLP
it can be contiguous accesses.

	PR tree-optimization/116654
	* tree-vect-data-refs.cc (vect_supportable_dr_alignment):
	Treat non-grouped accesses like non-SLP.
2024-10-02 08:15:44 +02:00
Pan Li
ed7b3e7818 RISC-V: Add testcases for form 2 of scalar signed SAT_SUB
Form 2:
  #define DEF_SAT_S_SUB_FMT_2(T, UT, MIN, MAX) \
  T __attribute__((noinline))                  \
  sat_s_sub_##T##_fmt_1 (T x, T y)             \
  {                                            \
    T minus = (UT)x - (UT)y;                   \
    if ((x ^ y) >= 0 || (minus ^ x) >= 0)      \
      return minus;                            \
    return x < 0 ? MIN : MAX;                  \
  }

DEF_SAT_S_SUB_FMT_2(int8_t, uint8_t, INT8_MIN, INT8_MAX)

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

It is test only patch and obvious up to a point, will commit it
directly if no comments in next 48H.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/sat_arith.h: Add test helper macros.
	* gcc.target/riscv/sat_s_sub-2-i16.c: New test.
	* gcc.target/riscv/sat_s_sub-2-i32.c: New test.
	* gcc.target/riscv/sat_s_sub-2-i64.c: New test.
	* gcc.target/riscv/sat_s_sub-2-i8.c: New test.
	* gcc.target/riscv/sat_s_sub-run-2-i16.c: New test.
	* gcc.target/riscv/sat_s_sub-run-2-i32.c: New test.
	* gcc.target/riscv/sat_s_sub-run-2-i64.c: New test.
	* gcc.target/riscv/sat_s_sub-run-2-i8.c: New test.

Signed-off-by: Pan Li <pan2.li@intel.com>
2024-10-02 14:01:28 +08:00
Pan Li
3809b4d6ec Match: Support form 2 for scalar signed integer SAT_SUB
This patch would like to support the form 2 of the scalar signed
integer SAT_SUB.  Aka below example:

Form 2:
  #define DEF_SAT_S_SUB_FMT_2(T, UT, MIN, MAX) \
  T __attribute__((noinline))                  \
  sat_s_sub_##T##_fmt_1 (T x, T y)             \
  {                                            \
    T minus = (UT)x - (UT)y;                   \
    if ((x ^ y) >= 0 || (minus ^ x) >= 0)      \
      return minus;                            \
    return x < 0 ? MIN : MAX;                  \
  }

DEF_SAT_S_SUB_FMT_2(int8_t, uint8_t, INT8_MIN, INT8_MAX)

Before this patch:
   4   │ __attribute__((noinline))
   5   │ int8_t sat_s_sub_int8_t_fmt_2 (int8_t x, int8_t y)
   6   │ {
   7   │   int8_t minus;
   8   │   unsigned char x.0_1;
   9   │   unsigned char y.1_2;
  10   │   unsigned char _3;
  11   │   signed char _4;
  12   │   signed char _5;
  13   │   int8_t _6;
  14   │   _Bool _11;
  15   │   signed char _12;
  16   │   signed char _13;
  17   │   signed char _14;
  18   │   signed char _15;
  19   │
  20   │ ;;   basic block 2, loop depth 0
  21   │ ;;    pred:       ENTRY
  22   │   x.0_1 = (unsigned char) x_7(D);
  23   │   y.1_2 = (unsigned char) y_8(D);
  24   │   _3 = x.0_1 - y.1_2;
  25   │   minus_9 = (int8_t) _3;
  26   │   _4 = x_7(D) ^ y_8(D);
  27   │   _5 = x_7(D) ^ minus_9;
  28   │   _15 = _4 & _5;
  29   │   if (_15 >= 0)
  30   │     goto <bb 4>; [42.57%]
  31   │   else
  32   │     goto <bb 3>; [57.43%]
  33   │ ;;    succ:       4
  34   │ ;;                3
  35   │
  36   │ ;;   basic block 3, loop depth 0
  37   │ ;;    pred:       2
  38   │   _11 = x_7(D) < 0;
  39   │   _12 = (signed char) _11;
  40   │   _13 = -_12;
  41   │   _14 = _13 ^ 127;
  42   │ ;;    succ:       4
  43   │
  44   │ ;;   basic block 4, loop depth 0
  45   │ ;;    pred:       2
  46   │ ;;                3
  47   │   # _6 = PHI <minus_9(2), _14(3)>
  48   │   return _6;
  49   │ ;;    succ:       EXIT
  50   │
  51   │ }

After this patch:
   4   │ __attribute__((noinline))
   5   │ int8_t sat_s_sub_int8_t_fmt_2 (int8_t x, int8_t y)
   6   │ {
   7   │   int8_t _6;
   8   │
   9   │ ;;   basic block 2, loop depth 0
  10   │ ;;    pred:       ENTRY
  11   │   _6 = .SAT_SUB (x_7(D), y_8(D)); [tail call]
  12   │   return _6;
  13   │ ;;    succ:       EXIT
  14   │
  15   │ }

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

gcc/ChangeLog:

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

Signed-off-by: Pan Li <pan2.li@intel.com>
2024-10-02 14:01:15 +08:00
GCC Administrator
60f1feded2 Daily bump. 2024-10-02 00:17:48 +00:00