Age | Commit message (Collapse) | Author | Files | Lines |
|
The following renames loop_vect to not_vect, removes the unused
HYBRID_SLP_STMT macro and rewords the slp_vect_type docs to clarify
STMT_SLP_TYPE is mainly used for BB vectorization, tracking what is
vectorized and what not.
* tree-vectorizer.h (enum slp_vect_type): Rename loop_vect
to not_vect, clarify docs.
(HYBRID_SLP_STMT): Remove.
* tree-vectorizer.cc (vec_info::new_stmt_vec_info): Adjust.
* tree-vect-loop.cc (vect_analyze_loop_2): Likewise.
|
|
We now never have hybrid SLP (if we have, we fail immediately).
* tree-vect-data-refs.cc (vect_get_data_access_cost): Use
ncopies == 1.
* tree-vect-slp.cc (vect_remove_slp_scalar_calls): Remove
hybrid/loop SLP skip.
* tree-vect-stmts.cc (vectorizable_store): Remove pure SLP assert.
|
|
IVOPTs, when replacing an IV, inserts the computation of the new IVs
step in the loop preheader without considering the case of the loop
not iterating. This means we have to ensure the step computation
does not invoke UB. There is also SCEV which does not care about
signed arithmetic UB when re-associating expressions to form CHRECs,
so even when we know the loop iterates this is required.
PR tree-optimization/121382
* tree-ssa-loop-ivopts.cc (create_new_iv): Rewrite the IV
step to defined form.
* gcc.dg/torture/pr121382.c: New testcase.
|
|
When there is obvious UB involved in the process of re-associating
a series of IV increments to build up a CHREC, fail. This catches
a few degenerate cases where SCEV introduces UB with its inherent
re-associating of IV increments.
PR tree-optimization/121370
* tree-scalar-evolution.cc (scev_dfs::add_to_evolution_1):
Avoid UB integer overflow in accumulating CHREC_RIGHT.
* gcc.dg/torture/pr121370.c: New testcase.
|
|
In LoongArch psABI, large _BitInt(N) (N > 64) objects are only
extended to fill the highest 8-byte chunk that contains any used bit,
but the size of such a large _BitInt type is a multiple of their
16-byte alignment. So there may be an entire unused 8-byte
chunk that is not filled by extension, and this chunk shouldn't be
checked when testing if the object is properly extended.
The original bitintext.h assumed that all bits within
sizeof(_BitInt(N)) beyond used bits are filled by extension.
This patch changes that for LoongArch and possibly
any future ports with a similar behavior.
P.S. For encoding this test as well as type-generic programming,
it would be nice to have a builtin function to obtain "N" at
compile time from _BitInt(N)-typed expressions. But here
we stick to existing ones (__builtin_clrsbg / __builtin_clzg).
* gcc.dg/bitintext.h (S, CEIL, PROMOTED_SIZE): Define.
(BEXTC): Generalize to only check extension within PROMOTED_SIZE bits.
|
|
For targets that set the "extended" flag in TARGET_C_BITINT_TYPE_INFO,
we assume small _BitInts to be internally extended after arithmetic
operations. In this case, an extra extension during RTL expansion
can be avoided.
* expr.cc (expand_expr_real_1): Do not call
reduce_to_bit_field_precision if the target assumes the _BitInt
results to be already extended.
(EXTEND_BITINT): Same.
* expr.h (bitint_extended): Declare the cache variable.
* function.cc (prepare_function_start): Initialize it.
|
|
For targets that treat small _BitInts like the fundamental
integral types, we should allow their machine modes to be promoted
in the same way.
* explow.cc (promote_function_mode): Add a case for
small/medium _BitInts.
(promote_mode): Same.
|
|
On Mon, Aug 04, 2025 at 11:33:17AM -0400, Patrick Palka wrote:
> > @@ -1693,6 +1697,8 @@ export namespace std
> > {
> > using std::ranges::advance;
> > using std::ranges::distance;
> > + using std::ranges::iter_move;
> > + using std::ranges::iter_swap;
>
> Actually a few lines above we already do:
>
> // _Cpo is an implementation detail we can't avoid exposing; if we do the
> // using in ranges directly, it conflicts with any friend functions of the
> // same name, which is why the customization points are in an inline
> // namespace in the first place.
> namespace ranges::inline _Cpo
> {
> using _Cpo::iter_move;
> using _Cpo::iter_swap;
> }
>
> So I think we don't want to export iter_move and iter_swap directly... Sorry
> for not catching this sooner :/
Here is a patch which does that.
2025-08-05 Jakub Jelinek <jakub@redhat.com>
PR libstdc++/121373
* src/c++23/std.cc.in (std::ranges::iter_move, std::ranges::iter_swap):
Remove exports.
|
|
Another easy part from the paper.
Part of the CWG2579 has been already done in an earlier paper (with
test commits by Marek) and the remaining part is implemented correctly,
we diagnose as error when token pasting doesn't form a valid token.
Except that message
pasting """" and """" does not give a valid preprocessing token
looked weird and so I've updated the message to use %< and %> instead
of \" quoting.
2025-08-05 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/120778
* macro.cc (paste_tokens): Use %< and %> instead of \" in
diagnostics around %.*s.
* g++.dg/DRs/dr2579.C: New test.
* c-c++-common/cpp/va-opt-6.c: Expect ' rather than \" around
tokens in incorrect pasting diagnostics.
* gcc.dg/c23-attr-syntax-6.c: Likewise.
* gcc.dg/cpp/paste12.c: Likewise.
* gcc.dg/cpp/paste12-2.c: Likewise.
* gcc.dg/cpp/paste14.c: Likewise.
* gcc.dg/cpp/paste14-2.c: Likewise.
|
|
gcc:
PR target/69374
* doc/install.texi (Configuration): Mark up atexit as code.
|
|
The previous code-gen of scalar unsigned SAT_MUL, aka usmul.
Leverage the mulhs by mistake, it should be mulhu for the
hight bit result of mul. Thus, this patch would like to make
it correct.
gcc/ChangeLog:
* config/riscv/riscv.cc (riscv_expand_xmode_usmul): Take
umulhu for high bits mul result.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/sat/sat_u_mul-1-u32-from-u64.c: Add mulhu
asm check.
* gcc.target/riscv/sat/sat_u_mul-1-u64-from-u128.c: Ditto.
Signed-off-by: Pan Li <pan2.li@intel.com>
|
|
|
|
Here's a previously accepted testcase that is now ambiguous after
r16-2771-gb9f1cc4e119da, since the uninstantiated constraints are
equivalent but the partially instantiated constraints aren't, so
the two member functions no longer correspond.
PR c++/121351
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/concepts-using6.C: New test.
|
|
The b.f(42) calls in the below testcases started to get rejected as
ambiguous after r15-3740 which corrected our inheritedness tiebreaker to
only apply to constructors (and not all member functions) as per CWG2273.
But arguably these calls should still be valid regardless of the
tiebreaker because B::f corresponds to and therefore hides A::f, so
there should only be a single candidate in the first place. This
doesn't happen because when determining correspondence we compare
the members' uninstantiated constraints instead of their partially
substituted constraints as in other declaration matching situations.
It doesn't really make sense to compare uninstantiated constraints
from two different template contexts.
This patch fixes this by substituting in outer template arguments before
comparing constraints of two potentially corresponding member functions.
PR c++/121351
PR c++/119859
gcc/cp/ChangeLog:
* class.cc (add_method): Substitute outer template arguments
into constraints before comparing them if the declarations are
from different classes.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/concepts-using5.C: New test.
* g++.dg/cpp2a/concepts-using5a.C: New test.
Reviewed-by: Jason Merrill <jason@redhat.com>
|
|
r13-3299 changed our internal declaration of __dynamic_cast to reside
inside the abi/__cxxabiv1:: namespace instead of the global namespace,
matching the real declaration. This inadvertently made us now attempt
constexpr evaluation of user-written calls to abi::__dynamic_cast since
cxx_dynamic_cast_fn_p now also returns true for them, but we're not
prepared to handle arbitrary calls to __dynamic_cast, and therefore ICE.
This patch restores cxx_dynamic_cast_fn_p to return true only for
synthesized calls to __dynamic_cast, which can be distinguished by
DECL_ARTIFICIAL, since apparently the synthesized declaration of
__dynamic_cast doesn't get merged with the actual declaration.
PR c++/120620
gcc/cp/ChangeLog:
* constexpr.cc (cxx_dynamic_cast_fn_p): Return true only
for synthesized __dynamic_cast.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/constexpr-dynamic19.C: New test.
* g++.dg/cpp2a/constexpr-dynamic1a.C: New test.
Reviewed-by: Jason Merrill <jason@redhat.com>
|
|
The old GET_MODE_SIZE (DImode) (i.e. 64) made sense before
64-bitters. Now the default is just a trap: when using the
default 64, things like TImode (128 bits) still mostly works,
but general corner cases related to computing large-size objects
numbers, like (1 << 64)/8 break, as exposed by
gcc.dg/pr105094.c.
So, keep the floor at 64 for 32-bitters and smaller targets, but
for larger targets, make it 2 * BITS_PER_WORD. Also, express it
more directly with focus on BITS_PER_WORD, not the size of a
mode. Add "by GCC internally" in an attempt to tell that this
is when gcc cooks something up, not when plain input uses a type
with such a mode.
* defaults.h (MAX_FIXED_MODE_SIZE): Default to 2 * BITS_PER_WORD
for larger-than-32-bitters.
* doc/tm.texi.in (MAX_FIXED_MODE_SIZE): Adjust accordingly. Tweak
wording.
* doc/tm.texi: Regenerate.
|
|
On Sat, Aug 02, 2025 at 09:05:07PM +0200, Jakub Jelinek wrote:
> Wonder how to automatically discover other missing exports (like in PR121373
> std::byteswap), maybe one could dig that stuff somehow from the raw
> dump (look for identifiers in std namespace (and perhaps inlined namespaces
> thereof at least) which don't start with underscore.
To answer that question, I wrote a simple plugin which just dumps the names
(which do not start with underscore) in std namespace (and its inlined
namespaces) and for non-inline namespaces in there which do not start with
underscore also recurses on those namespaces.
Plugin source in
https://gcc.gnu.org/pipermail/libstdc++/2025-August/062859.html
I went through it all now, using cppreference as a quick check for stuff
removed in C++17/C++20 and for everything added verified it is in
corresponding eel.is/c++-draft/*.syn etc. and looked it up in the libstdc++
headers for guarding macros.
After all the additions I've compiled std.cc with -std=c++20, -std=c++23 and
-std=c++26, the first one revealed std::ranges::shift_{left,right} emitted an
error in that case, the patch fixes that too.
2025-08-04 Jakub Jelinek <jakub@redhat.com>
hexne <printfne@gmail.com>
PR libstdc++/121373
* src/c++23/std.cc.in (std::ranges::shift_left,
std::ranges::shift_right): Only export for C++23 and later.
(std::ranges::fold_left_first_with_iter_result,
std::ranges::fold_left_with_iter_result): Export.
(std::byteswap): Export for C++23 and later.
(std::ranges::iter_move, std::ranges::iter_swap): Export.
(std::projected_value_t): Export for C++26 and later.
(std::out_ptr_t, std::inout_ptr_t): Export.
(std::ranges::iota_result): Export.
(std::regex_constants): Export a lot of constants.
(std::is_scoped_enum, std::is_scoped_enum_v): Export.
|
|
Modernization; no functional change intended.
gcc/ChangeLog:
* dump-context.h: Convert "enum optinfo_item_kind" into
"enum class kind" within class optinfo_item.
* dumpfile.cc: Likewise. Use "auto" in a few places.
Convert "enum optinfo_kind" to "enum class kind" within
class optinfo.
* opt-problem.cc: Likewise.
* optinfo-emit-json.cc: Likewise.
* optinfo.cc: Likewise.
* optinfo.h: Likewise.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
This patch adds support to sarif-replay for "nestingLevel"
from "P3358R0 SARIF for Structured Diagnostics"
https://wg21.link/P3358R0
Doing so revealed a bug where libgdiagnostics was always
creating new location_t values (and thus also
diagnostic_physical_location instances), rather than reusing
existing location_t values, leading to excess source printing.
The patch also fixes this bug, adding a new flag to libgdiagnostics
for debugging physical locations, and exposing this in sarif-replay
via a new "-fdebug-physical-locations" maintainer option.
Finally, the patch adds test coverage for the HTML sink's output
of nested diagnostics (both from a GCC plugin, and from sarif-replay).
gcc/ChangeLog:
PR diagnostics/116253
* diagnostics/context.cc (context::set_nesting_level): New.
* diagnostics/context.h (context::set_nesting_level): New decl.
* doc/libgdiagnostics/topics/compatibility.rst
(LIBGDIAGNOSTICS_ABI_5): New.
* doc/libgdiagnostics/topics/physical-locations.rst
(diagnostic_manager_set_debug_physical_locations): New.
* libgdiagnostics++.h (manager::set_debug_physical_locations):
New.
* libgdiagnostics-private.h
(private_diagnostic_set_nesting_level): New decl.
* libgdiagnostics.cc (diagnostic_manager::diagnostic_manager):
Initialize m_debug_physical_locations.
(diagnostic_manager::new_location_from_file_and_line): Add debug
printing.
(diagnostic_manager::new_location_from_file_line_column):
Likewise.
(diagnostic_manager::new_location_from_range): Likewise.
(diagnostic_manager::set_debug_physical_locations): New.
(diagnostic_manager::ensure_linemap_for_file_and_line): Avoid
redundant calls to linemap_add.
(diagnostic_manager::new_location): Add debug printing.
(diagnostic_manager::m_debug_physical_locations): New field.
(diagnostic::diagnostic): Initialize m_nesting_level.
(diagnostic::get_nesting_level): New accessor.
(diagnostic::set_nesting_level): New.
(diagnostic::m_nesting_level): New field.
(diagnostic_manager::emit_va): Set and reset the nesting level
of the context from that of the diagnostic.
(diagnostic_manager_set_debug_physical_locations): New.
(private_diagnostic_set_nesting_level): New.
* libgdiagnostics.h
(diagnostic_manager_set_debug_physical_locations): New decl.
* libgdiagnostics.map (LIBGDIAGNOSTICS_ABI_5): New.
* libsarifreplay.cc (sarif_replayer::handle_result_obj): Support
the "nestingLevel" property.
* libsarifreplay.h (replay_options::m_debug_physical_locations):
New field.
* sarif-replay.cc: Add -fdebug-physical-locations.
gcc/testsuite/ChangeLog:
PR diagnostics/116253
* gcc.dg/plugin/diagnostic-test-nesting-html.c: New test.
* gcc.dg/plugin/diagnostic-test-nesting-html.py: New test script.
* gcc.dg/plugin/plugin.exp: Add it.
* libgdiagnostics.dg/test-multiple-lines.c: Update expected output
to show fix-it hint.
* sarif-replay.dg/2.1.0-valid/nested-diagnostics-1.sarif: New test.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
For the common case where a diagnostic has no metadata, sarif-replay's
html output was adding a stray space followed by an empty <div> for
the metadata.
Fixed thusly.
gcc/ChangeLog:
PR diagnostics/116792
* diagnostics/html-sink.cc
(html_builder::make_element_for_diagnostic): Don't add the
metadata element if it's empty.
(html_builder::make_element_for_metadata): Return null rather than
an empty element.
gcc/testsuite/ChangeLog:
PR diagnostics/116792
* gcc.dg/plugin/diagnostic-test-graphs-html.py: Remove trailing
space from expected text of message.
* sarif-replay.dg/2.1.0-valid/embedded-links-check-html.py:
Likewise.
* sarif-replay.dg/2.1.0-valid/graphs-check-html.py: Likewise.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
gcc/ChangeLog:
* diagnostics/context.h: Move struct counters to its own header
and include it.
* diagnostics/counters.h: New file, from the above.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
No functional change intended.
gcc/ChangeLog:
* diagnostics/context.h: Split struct source_printing_options out
into "diagnostics/source-printing-options.h" and include it.
* diagnostics/source-printing-options.h: New file, from the above.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
context.h
This patch splits out class option_manager to its own header,
and renames it to class option_id_manager to better describe its
purpose.
No functional change intended.
gcc/ChangeLog:
* diagnostics/context.cc: Update for renaming of option_manager to
option_id_manager and of context::m_option_mgr to
context::m_option_id_mgr.
* diagnostics/context.h: Likewise, moving class declaration to a
new diagnostics/option-id-manager.h.
* diagnostics/lazy-paths.cc: Likewise.
* diagnostics/option-id-manager.h: New file, from material in
diagnostics/context.h.
* lto-wrapper.cc: Update for renaming of option_manager to
option_id_manager.
* opts-common.cc: Likewise.
* opts-diagnostic.h: Likewise.
* opts.cc: Likewise.
* toplev.cc: Likewise.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
gcc/ChangeLog:
* diagnostics/buffering.h: Update comment to refer to output sinks
rather than output formats.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
gcc/ChangeLog:
* gimple-warn-recursion.cc (pass_warn_recursion::execute): Add
missing auto_diagnostic_group.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
|
|
We were calling `is_store_forwarding` with a NULL value for `off_val`,
which was causing a null pointer dereference in `is_constant`, leading
to an ICE.
This patch updates the call to `is_constant` in `is_store_forwarding`
and adds a check for `off_val`, in order to update it with the right
value.
Bootstrapped/regtested on AArch64 and x86_64.
PR rtl-optimization/121303
gcc/ChangeLog:
* avoid-store-forwarding.cc (is_store_forwarding): Add check
for `off_val` in `is_store_forwarding`.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pr121303.c: New test.
|
|
Contrary to what the paper says, I think for #line directives we diagnose
everything we should (sure, some diagnostics are pedwarns).
2025-08-04 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/120778
* g++.dg/DRs/dr2580.C: New test.
|
|
Previously in GNATProve_Mode the frontend would overwrite all of
the assertion policies to check in order to force the generation
of all of the assertions.
This however prevents GNATProve from performing policy related
checks in the tool. Since they are all artificially changed to
check.
This patch removes the modifications to the applicable assertion
policies and instead prevents code from ignored entities being
removed when in GNATProve_Mode.
gcc/ada/ChangeLog:
* contracts.adb: Use Is_Ignored_In_Codegen instead of just
using Is_Ignored.
* exp_ch6.adb: Likewise.
* exp_prag.adb: Likewise.
* exp_util.adb: Likewise.
* frontend.adb: Avoid removal of ignored nodes in GNATProve_Mode.
* gnat1drv.adb: Avoid forcing Assertions_Enabled in GNATProve_Mode.
* lib-writ.adb (Write_With_File_Names): Avoid early exit
with ignored entities in GNATProve_Mode.
* lib-xref.adb: Likewise.
* opt.adb: Remove check for Assertions_Enabled.
* sem_attr.adb: Use Is_Ignored_In_Codegen instead of Is_Ignored.
* sem_ch13.adb: Likewise. Additionally always add predicates in
GNATProve_Mode.
* sem_prag.adb: Likewise. Additionally remove modifications
to applied policies in GNATProve_Mode.
* sem_util.adb (Is_Ignored_In_Codegen): New function that overrides
Is_Ignored in GNATProve_Mode and Codepeer_Mode.
(Is_Ignored_Ghost_Pragma_In_Codegen): Likewise for
Is_Ignored_Ghost_Pragma.
(Is_Ignored_Ghost_Entity_In_Codegen): Likewise for
Is_Ignored_Ghost_Entity.
(Policy_In_List): Remove overriding of policies in GNATProve_Mode.
* sem_util.ads: Add specs for new functions.
* (Predicates_Enabled): Always generate predicates in
GNATProve_Mode.
|
|
Print_Node_Ref, which is called by pp, sometimes calls
Compile_Time_Known_Value, which blows up if Entity (N)
is empty. Rearrange the tests here, and test for
Present (Entity (N)) before calling Compile_Time_Known_Value.
Remove test "Nkind (N) in N_Subexpr", which is redundant with other
tests.
We don't want to make Compile_Time_Known_Value more
robust; you shouldn't call it on half-baked nodes.
But ideally pp should be able to print such nodes.
This change fixes one of many such cases.
gcc/ada/ChangeLog:
* treepr.adb (Print_Node_Ref): Protect against
Entity (N) being empty before calling
Compile_Time_Known_Value.
|
|
gcc/ada/ChangeLog:
* sem_prag.adb (Validate_Compile_Time_Warning_Errors):
Check if the original compile time pragma was replaced and
validate the original node instead.
|
|
Simplify the creation of the control characters in
Validate_Compile_Time_Warning_Or_Error.
gcc/ada/ChangeLog:
* sem_prag.adb (Validate_Compile_Time_Warning_Or_Error):
simplify the implementation.
|
|
If a function result type has an access discriminant, then we already
generate a run-time accessibility check for a return statement. But if
we know statically that the check (if executed) is going to fail, then
that should be rejected at compile-time as a violation of RM 6.5(5.9).
Add this additional compile-time check.
gcc/ada/ChangeLog:
* exp_ch6.adb (Apply_Access_Discrims_Accessibility_Check): If the
accessibility level being checked is known statically, then
statically check it against the level of the function being
returned from.
|
|
Simplify the storing process for ghost mode related variables and
make the process more extendable if new ghost mode related features
are added.
gcc/ada/ChangeLog:
* atree.adb: update references to Ghost_Mode.
* exp_ch3.adb: use a structure type to store all of the existing
ghost mode related state variables.
* exp_disp.adb: Likewise.
* exp_spark.adb: Likewise.
* exp_util.adb: Likewise.
* expander.adb: Likewise.
* freeze.adb: Likewise and replace references to existing ghost
mode variables.
* ghost.adb (Install_Ghost_Region): install the changes of
the region in to the new Ghost_Config structure.
(Restore_Ghost_Region): Use the new Ghost_Config instead.
In general replace all references to the existing ghost mode
variables with the new structure equivalent.
* ghost.ads (Restore_Ghost_Region): update the spec.
* opt.ads (Ghost_Config_Type): A new type that has two of the
previous ghost code related global variables as memembers -
Ghost_Mode and Ignored_Ghost_Region.
(Ghost_Config) New variable to store the previous Ghost_Mode and
Ignored_Ghost_Region info.
* rtsfind.adb: Replace references to existing ghost mode variables.
* sem.adb: Likewise.
* sem_ch12.adb: Likewise.
* sem_ch13.adb: Likewise.
* sem_ch3.adb: Likewise.
* sem_ch5.adb: Likewise.
* sem_ch6.adb: Likewise.
* sem_ch7.adb: Likewise.
* sem_prag.adb: Likewise.
* sem_util.adb: Likewise.
|
|
Do not generate a warning stating that the size of a formal parameter
is 8 bits unless the size of the formal parameter is 8 bits.
gcc/ada/ChangeLog:
* freeze.adb (Freeze_Profile): Do not emit a warning stating that
a formal parameter's size is 8 if the parameter's size is not 8.
|
|
gcc/ada/ChangeLog:
* table.adb (Max): Move variable to the body and initialize
it with the same value as in the Init function.
* table.ads (Max): Likewise.
|
|
...which might make it easier to deal with incorrectly shared
subtrees created during parsing.
There were several Idents arrays, with duplicated code and commentary.
And the related code had somewhat diverged -- different comments,
different index subtypes (Pos vs. Int), etc.
DRY: Move at least some of the code into Par.Util. Raise
Program_Error if the array overflows; there is really no
reason not to check, along with several comments saying
we don't check. In the unlikely event that the array
overflows, the compiler will now crash, which seems better
than erroneous execution (which could conceivably cause
bad code to be generated).
Move the block comments titled
"Handling Semicolon Used in Place of IS" and
"Handling IS Used in Place of Semicolon" so they
are together, which seems obviously desirable.
Rewrite the latter comment.
No need to denigrate other parsers.
gcc/ada/ChangeLog:
* par.adb: Move and rewrite some comments.
(Util): Shared code and comments for dealing with
defining_identifier_lists.
* par-util.adb (Append): Shared code for appending
one identifier onto Defining_Identifiers.
(P_Def_Ids): Shared code for parsing a defining_identifier_list.
Unfortunately, this is not used in all cases, because some of
them mix in sophisticated error recovery, which we do not
modify here.
* par-ch12.adb (P_Formal_Object_Declarations):
Use Defining_Identifiers and related code.
* par-ch3.adb (P_Identifier_Declarations): Likewise.
(P_Known_Discriminant_Part_Opt): Likewise.
(P_Component_Items): Likewise.
* par-ch6.adb (P_Formal_Part): Likewise.
|
|
The following makes us fail earlier when parts of the SLP build fails.
Currently we rely on hybrid stmt detection later to discover not all
stmts are covered by SLP, but this code should go away. I've also
seen a case of a missed gcond SLP build that went undetected. So
the following makes us fail during vect_analyze_slp if any of the
SLP instances we expect to discover fails.
* tree-vect-slp.cc (vect_analyze_slp): When analyzing a loop
and slp instance discovery fails, immediately fail the whole
process.
|
|
This is another case which changed from compile time undefined behavior
to ill-formed, diagnostic required. Now, we warn on this, so pedantically
that is good enough, maybe all we need is a testcase, but the following
patch changes it to a pedwarn for C++26.
2025-08-04 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/120778
* macro.cc (stringify_arg): For C++26 emit a pedarn instead of warning
for \ at the end of stringification.
* g++.dg/DRs/dr2578.C: New test.
|
|
Forr rvalues the _Self parameter deduces a non-reference type. Consequently,
((_Self)__self) moved the object to a temporary, which then destroyed on
function exit.
This patch fixes this by using a C-style cast __self to (const indirect&).
This not only resolves the above issue but also correctly handles types that
are derived (publicly and privately) from indirect. Allocator requirements in
[allocator.requirements.general] p22 guarantee that dereferencing const _M_objp
works with equivalent semantics to dereferencing _M_objp.
PR libstdc++/121128
libstdc++-v3/ChangeLog:
* include/bits/indirect.h (indirect::operator*):
Cast __self to approparietly qualified indirect.
* testsuite/std/memory/indirect/access.cc: New test.
* testsuite/std/memory/polymorphic/access.cc: New test.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
|
|
After previous patches, we should always get a VNx16BI result
for ACLE intrinsics that return svbool_t. This patch adds
an assert that checks a more general condition than that.
gcc/
* config/aarch64/aarch64-sve-builtins.cc
(function_expander::expand): Assert that the return value
has an appropriate mode.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the predicate forms of svdupq.
The general predicate expansion builds an equivalent integer vector
and then compares it with zero. This patch therefore relies on
the earlier patches to the comparison patterns.
gcc/
* config/aarch64/aarch64-protos.h
(aarch64_convert_sve_data_to_pred): Remove the mode argument.
* config/aarch64/aarch64.cc
(aarch64_sve_emit_int_cmp): Allow PRED_MODE to be VNx16BI or
the natural predicate mode for the data mode.
(aarch64_convert_sve_data_to_pred): Remove the mode argument
and instead always create a VNx16BI result.
(aarch64_expand_sve_const_pred): Update call accordingly.
* config/aarch64/aarch64-sve-builtins-base.cc
(svdupq_impl::expand): Likewise, ensuring that the result
has mode VNx16BI.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/dupq_13.c: New test.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the predicate forms of svdup.
gcc/
* config/aarch64/aarch64-protos.h
(aarch64_emit_sve_pred_vec_duplicate): Declare.
* config/aarch64/aarch64.cc
(aarch64_emit_sve_pred_vec_duplicate): New function.
* config/aarch64/aarch64-sve.md (vec_duplicate<PRED_ALL:mode>): Use it.
* config/aarch64/aarch64-sve-builtins-base.cc
(svdup_impl::expand): Handle boolean values specially. Check for
constants and fall back on aarch64_emit_sve_pred_vec_duplicate
for the variable case, ensuring that the result has mode VNx16BI.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/dup_1.c: New test.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the svpnext* intrinsics.
gcc/
* config/aarch64/iterators.md (PNEXT_ONLY): New int iterator.
* config/aarch64/aarch64-sve.md
(@aarch64_sve_<sve_pred_op><mode>): Restrict SVE_PITER pattern
to VNx16BI_ONLY.
(@aarch64_sve_<sve_pred_op><mode>): New PNEXT_ONLY pattern for
PRED_HSD.
(*aarch64_sve_<sve_pred_op><mode>): Likewise.
(*aarch64_sve_<sve_pred_op><mode>_cc): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/pnext_3.c: New test.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the svmatch* and svnmatch*
intrinsics.
gcc/
* config/aarch64/aarch64-sve2.md (@aarch64_pred_<sve_int_op><mode>):
Split SVE2_MATCH pattern into a VNx16QI_ONLY define_ins and a
VNx8HI_ONLY define_expand. Use a VNx16BI destination for the latter.
(*aarch64_pred_<sve_int_op><mode>): New SVE2_MATCH pattern for
VNx8HI_ONLY.
(*aarch64_pred_<sve_int_op><mode>_cc): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve2/acle/general/match_4.c: New test.
* gcc.target/aarch64/sve2/acle/general/nmatch_1.c: Likewise.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the svac* intrinsics (floating-
point compare absolute).
gcc/
* config/aarch64/aarch64-sve.md (@aarch64_pred_fac<cmp_op><mode>):
Replace with...
(@aarch64_pred_fac<cmp_op><mode>_acle): ...this new expander.
(*aarch64_pred_fac<cmp_op><mode>_strict_acle): New pattern.
* config/aarch64/aarch64-sve-builtins-base.cc
(svac_impl::expand): Update accordingly.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/acge_1.c: New test.
* gcc.target/aarch64/sve/acle/general/acgt_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/acle_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/aclt_1.c: Likewise.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the floating-point forms of svcmp*.
gcc/
* config/aarch64/aarch64-sve.md (@aarch64_pred_fcm<cmp_op><mode>_acle)
(*aarch64_pred_fcm<cmp_op><mode>_acle, @aarch64_pred_fcmuo<mode>_acle)
(*aarch64_pred_fcmuo<mode>_acle): New patterns.
* config/aarch64/aarch64-sve-builtins-base.cc
(svcmp_impl::expand, svcmpuo_impl::expand): Use them.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/cmpeq_6.c: New test.
* gcc.target/aarch64/sve/acle/general/cmpge_9.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_9.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_9.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_9.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpne_5.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpuo_1.c: Likewise.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the svcmp*_wide intrinsics.
Since the only uses of these patterns are for ACLE intrinsics,
there didn't seem much point adding an "_acle" suffix.
gcc/
* config/aarch64/aarch64-sve.md (@aarch64_pred_cmp<cmp_op><mode>_wide):
Split into VNx16QI_ONLY and SVE_FULL_HSI patterns. Use VNx16BI
results for both.
(*aarch64_pred_cmp<cmp_op><mode>_wide): New pattern.
(*aarch64_pred_cmp<cmp_op><mode>_wide_cc): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/cmpeq_5.c: New test.
* gcc.target/aarch64/sve/acle/general/cmpge_7.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpge_8.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_7.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_8.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_7.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_8.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_7.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_8.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpne_4.c: Likewise.
|
|
Patterns that fuse a predicate operation P with a PTEST use
aarch64_sve_same_pred_for_ptest_p to test whether the governing
predicates of P and the PTEST are compatible. Most patterns were also
written as define_insn_and_rewrites, with the rewrite replacing P's
original governing predicate with PTEST's. This ensures that we don't,
for example, have both a .H PTRUE for the PTEST and a .B PTRUE for a
comparison that feeds the PTEST.
The svcmp_wide* patterns were missing this rewrite, meaning that we did
have redundant PTRUEs.
gcc/
* config/aarch64/aarch64-sve.md
(*aarch64_pred_cmp<cmp_op><mode>_wide_cc): Turn into a
define_insn_and_rewrite and rewrite the governing predicate
of the comparison so that it is identical to the PTEST's.
(*aarch64_pred_cmp<cmp_op><mode>_wide_ptest): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/cmpeq_1.c: Check the number
of PTRUEs.
* gcc.target/aarch64/sve/acle/general/cmpge_5.c: New test.
* gcc.target/aarch64/sve/acle/general/cmpge_6.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_5.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_6.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_5.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_6.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_5.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_6.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpne_3.c: Likewise.
|
|
The patterns for the svcmp_wide intrinsics used a VNx16BI
input predicate for all modes, instead of the usual <VPRED>.
That unnecessarily made some input bits significant, but more
importantly, it triggered an ICE in aarch64_sve_same_pred_for_ptest_p
when testing whether a comparison pattern could be fused with a PTEST.
A later patch will add tests for other comparisons.
gcc/
* config/aarch64/aarch64-sve.md (@aarch64_pred_cmp<cmp_op><mode>_wide)
(*aarch64_pred_cmp<cmp_op><mode>_wide_cc): Use <VPRED> instead of
VNx16BI for the governing predicate.
(*aarch64_pred_cmp<cmp_op><mode>_wide_ptest): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/cmpeq_1.c: Add more tests.
|
|
This patch continues the work of making ACLE intrinsics use VNx16BI
for svbool_t results. It deals with the non-widening integer forms
of svcmp*. The handling of the PTEST patterns is similar to that
for the earlier svwhile* patch.
Unfortunately, on its own, this triggers a failure in the
pred_clobber_*.c tests. The problem is that, after the patch,
we have a comparison instruction followed by a move into p0.
Combine combines the instructions together, so that the destination
of the comparison is the hard register p0 rather than a pseudo.
This defeats IRA's make_early_clobber_and_input_conflicts, which
requires the source and destination to be pseudo registers.
Before the patch, there was a subreg move between the comparison
and the move into p0, so it was that subreg move that ended up
with a hard register destination.
Arguably the fix for PR87600 should be extended to destination
registers as well as source registers, but in the meantime,
the patch just disables combine for these tests. The tests are
really testing the constraints and register allocation.
gcc/
* config/aarch64/aarch64-sve.md (@aarch64_pred_cmp<cmp_op><mode>_acle)
(*aarch64_pred_cmp<cmp_op><mode>_acle, *cmp<cmp_op><mode>_acle_cc)
(*cmp<cmp_op><mode>_acle_and): New patterns that yield VNx16BI
results for all element types.
* config/aarch64/aarch64-sve-builtins-base.cc
(svcmp_impl::expand): Use them.
(svcmp_wide_impl::expand): Likewise when implementing an svcmp_wide
against an in-range constant.
gcc/testsuite/
* gcc.target/aarch64/sve/pred_clobber_1.c: Disable combine.
* gcc.target/aarch64/sve/pred_clobber_2.c: Likewise.
* gcc.target/aarch64/sve/pred_clobber_3.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpeq_2.c: Add more cases.
* gcc.target/aarch64/sve/acle/general/cmpeq_4.c: New test.
* gcc.target/aarch64/sve/acle/general/cmpge_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpge_2.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpge_3.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpge_4.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_2.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_3.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpgt_4.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_2.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_3.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmple_4.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_2.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_3.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmplt_4.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpne_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general/cmpne_2.c: Likewise.
|