aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-08-10testsuite: Fix up sse3-addsubps.cJakub Jelinek1-1/+1
The testcase uses sizeof (vals) / sizeof (vals) as the number of vals to handle (though, handles 8 vals at a time). That is an obvious typo, all similar testcases use sizeof (vals) / sizeof (vals[0]) properly. 2024-08-10 Jakub Jelinek <jakub@redhat.com> * gcc.target/powerpc/sse3-addsubps.c (TEST): Divide by sizeof (vals[0]) rather than sizeof (vals).
2024-08-10AVR: ad target/113934 - Add option -mlra to enable LRA.Georg-Johann Lay2-2/+17
PR target/113934 gcc/ * config/avr/avr.opt (-mlra): New target option. * config/avr/avr.cc (avr_use_lra_p): New function. (TARGET_LRA_P): Use it. (avr_hard_regno_mode_ok) [lra]: Don't disallow 4-byte modes for X.
2024-08-09c++: inherited CTAD fixes [PR116276]Patrick Palka6-14/+139
This implements the overlooked inherited vs non-inherited guide tiebreaker from P2582R1. This requires tracking inherited-ness of a guide, for which it seems natural to reuse the lang_decl_fn::context field which for a constructor tracks its inherited-ness. This patch also works around CLASSTYPE_CONSTRUCTORS not reliably returning all inherited constructors (due to some using-decl handling quirks in in push_class_level_binding) by iterating over TYPE_FIELDS instead. This patch also makes us recognize another written form of inherited constructor, 'using Base<T>::Base::Base' whose USING_DECL_SCOPE is a TYPENAME_TYPE. PR c++/116276 gcc/cp/ChangeLog: * call.cc (joust): Implement P2582R1 inherited vs non-inherited guide tiebreaker. * cp-tree.h (lang_decl_fn::context): Document usage in deduction_guide_p FUNCTION_DECLs. (inherited_guide_p): Declare. * pt.cc (inherited_guide_p): Define. (set_inherited_guide_context): Define. (alias_ctad_tweaks): Use set_inherited_guide_context. (inherited_ctad_tweaks): Recognize some inherited constructors whose scope is a TYPENAME_TYPE. (ctor_deduction_guides_for): For C++23 inherited CTAD, iterate over TYPE_FIELDS instead of CLASSTYPE_CONSTRUCTORS to recognize all inherited constructors. gcc/testsuite/ChangeLog: * g++.dg/cpp23/class-deduction-inherited4.C: Remove an xfail. * g++.dg/cpp23/class-deduction-inherited5.C: New test. * g++.dg/cpp23/class-deduction-inherited6.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-08-09c++: DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P tweaksPatrick Palka1-4/+2
DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P templates can only appear as part of a template friend declaration, and in turn get partially instantiated only from tsubst_friend_function or tsubst_friend_class. So rather than having tsubst_template_decl clear the flag, let's leave it up to the tsubst friend routines to clear it so that template friend handling stays localized (note that tsubst_friend_function was already clearing it). Also the template depth comparison test within tsubst_friend_function is equivalent to DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P since such templates belong to the class context (and so always have more levels than the context), and conversely and it isn't possible to directly refer to an existing template that has more levels than the class context. gcc/cp/ChangeLog: * pt.cc (tsubst_friend_class): Simplify depth comparison test in the redeclaration code path to DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P. Clear the flag after partial instantiation here ... (tsubst_template_decl): ... instead of here. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-08-09c++: clean up cp_identifier_kind checksPatrick Palka2-21/+23
The predicates for checking an IDENTIFIER node's cp_identifier_kind currently directly test the three flag bits that encode the kind. This patch instead makes the checks first reconstruct the cp_identifier_kind in its entirety and then compare that. gcc/cp/ChangeLog: * cp-tree.h (get_identifier_kind): Define. (IDENTIFIER_KEYWORD_P): Redefine in terms of get_identifier_kind. (IDENTIFIER_CDTOR_P): Likewise. (IDENTIFIER_CTOR_P): Likewise. (IDENTIFIER_DTOR_P): Likewise. (IDENTIFIER_ANY_OP_P): Likewise. (IDENTIFIER_OVL_OP_P): Likewise. (IDENTIFIER_ASSIGN_OP_P): Likewise. (IDENTIFIER_CONV_OP_P): Likewise. (IDENTIFIER_TRAIT_P): Likewise. * parser.cc (cp_lexer_peek_trait): Mark IDENTIFIER_TRAIT_P check UNLIKELY. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-08-10Daily bump.GCC Administrator5-1/+201
2024-08-09[RISC-V][PR target/116283] Fix split code for recent Zbs improvements with ↵Jeff Law2-6/+33
masked bit positions So Patrick's fuzzer found an interesting little buglet in the Zbs improvements I added a couple months back. Specifically when we have masked bit position for a Zbs instruction. If the mask has extraneous bits set we'll generate an unrecognizable insn due to an invalid constant. More concretely, let's take this pattern: > (define_insn_and_split "" > [(set (match_operand:DI 0 "register_operand" "=r") > (any_extend:DI > (ashift:SI (const_int 1) > (subreg:QI (and:DI (match_operand:DI 1 "register_operand" "r") > (match_operand 2 "const_int_operand")) 0))))] What we need to know to transform this into bset for rv64. After masking the shift count we want to know the low 5 bits aren't 0x1f. If they were 0x1f, then the constant generated would be 0x80000000 which would then need sign extension out to 64bits, which the bset instruction will not do for us. We can ignore anything outside the low 5 bits. The mode of the shift is SI, so shifting by 32+ bits is undefined behavior. It's also worth explicitly mentioning that the hardware is going to mask the count against 0x3f. The net is if (operands[2] & 0x1f) != 0x1f, then this transformation is safe. So onto the generated split code... > [(set (match_dup 0) (and:DI (match_dup 1) (match_dup 2))) > (set (match_dup 0) (zero_extend:DI (ashift:SI > (const_int 1) > (subreg:QI (match_dup 0) 0))))] Which would seemingly do exactly what we want. The problem is the first split insn. If the constant does not fit into a simm12, that insn won't be recognized resulting in the ICE. The fix is simple, we just need to mask the constant before generating RTL. We can just mask it against 0x1f since we only care about the low 5 bits. This affects multiple patterns. I've added the appropriate fix to all of them. Tested in my tester. Waiting for the pre-commit bits to run before pushing. PR target/116283 gcc/ * config/riscv/bitmanip.md (Zbs combiner patterns/splitters): Mask the bit position in the split code appropriately. gcc/testsuite/ * gcc.target/riscv/pr116283.c: New test
2024-08-09Revert "lra: emit caller-save register spills before call insn [PR116028]"Kyrylo Tkachov3-26/+6
This reverts commit 3c67a0fa1dd39a3378deb854a7fef0ff7fe38004.
2024-08-09Adjust rangers recomputation depth based on the number of BBs.Andrew MacLeod2-4/+9
As the number of block increase, recomputations can become more expensive. Adjust the depth limit to avoid excessive compile time. PR tree-optimization/114855 * gimple-range-gori.cc (gori_compute::gori_compute): Adjust ranger_recompute_depth limit based on the number of BBs. (gori_compute::may_recompute_p): Use previosuly calculated value. * gimple-range-gori.h (gori_compute::m_recompute_depth): New.
2024-08-09Limit equivalency processing in rangers cache.Andrew MacLeod1-0/+8
When the number of block exceed VRP's sparse threshold, do not query all equivalencies during cache filling. This can be expensive for unknown benefit. PR tree-optimization/114855 * gimple-range-cache.cc (ranger_cache::fill_block_cache): Do not process equivalencies if the number of blocks is too high.
2024-08-09c++: Don't accept multiple enum definitions within template class [PR115806]Simon Martin2-10/+21
We have been accepting the following invalid code since revision 557831a91df === cut here === template <typename T> struct S { enum E { a }; enum E { b }; }; S<int> s; === cut here === The problem is that start_enum will set OPAQUE_ENUM_P to true even if it retrieves an existing definition for the enum, which causes the redefinition check in cp_parser_enum_specifier to be bypassed. This patch only sets OPAQUE_ENUM_P and ENUM_FIXED_UNDERLYING_TYPE_P when actually pushing a new tag for the enum. PR c++/115806 gcc/cp/ChangeLog: * decl.cc (start_enum): Only set OPAQUE_ENUM_P and ENUM_FIXED_UNDERLYING_TYPE_P when pushing a new tag. gcc/testsuite/ChangeLog: * g++.dg/parse/enum15.C: New test.
2024-08-09RISC-V: Enable stack clash in allocaRaphael Moreira Zinsly15-0/+219
Add the TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE to riscv in order to enable stack clash protection when using alloca. The code and tests are the same used by aarch64. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_compute_frame_info): Update outgoing args size. (riscv_stack_clash_protection_alloca_probe_range): New. (TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE): New. * config/riscv/riscv.h (STACK_CLASH_MIN_BYTES_OUTGOING_ARGS): New. (STACK_DYNAMIC_OFFSET): New. gcc/testsuite/ChangeLog: * gcc.target/riscv/stack-check-14.c: New test. * gcc.target/riscv/stack-check-15.c: New test. * gcc.target/riscv/stack-check-alloca-1.c: New test. * gcc.target/riscv/stack-check-alloca-2.c: New test. * gcc.target/riscv/stack-check-alloca-3.c: New test. * gcc.target/riscv/stack-check-alloca-4.c: New test. * gcc.target/riscv/stack-check-alloca-5.c: New test. * gcc.target/riscv/stack-check-alloca-6.c: New test. * gcc.target/riscv/stack-check-alloca-7.c: New test. * gcc.target/riscv/stack-check-alloca-8.c: New test. * gcc.target/riscv/stack-check-alloca-9.c: New test. * gcc.target/riscv/stack-check-alloca-10.c: New test. * gcc.target/riscv/stack-check-alloca.h: New.
2024-08-09RISC-V: Add support to vector stack-clash protectionRaphael Moreira Zinsly5-21/+173
Adds basic support to vector stack-clash protection using a loop to do the probing and stack adjustments. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_allocate_and_probe_stack_loop): New function. (riscv_v_adjust_scalable_frame): Add stack-clash protection support. (riscv_allocate_and_probe_stack_space): Move the probe loop implementation to riscv_allocate_and_probe_stack_loop. * config/riscv/riscv.h: Define RISCV_STACK_CLASH_VECTOR_CFA_REGNUM. gcc/testsuite/ChangeLog: * gcc.target/riscv/stack-check-cfa-3.c: New test. * gcc.target/riscv/stack-check-prologue-16.c: New test. * gcc.target/riscv/struct_vect_24.c: New test.
2024-08-09RISC-V: Stack-clash protection implementionRaphael Moreira Zinsly27-40/+504
This implements stack-clash protection for riscv, with riscv_allocate_and_probe_stack_space being based of aarch64_allocate_and_probe_stack_space from aarch64's implementation. We enforce the probing interval and the guard size to always be equal, their default value is 4Kb which is riscv page size. We also probe up by 1024 bytes in the general case when a probe is required. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_option_override): Enforce that interval is the same size as guard size. (riscv_allocate_and_probe_stack_space): New function. (riscv_expand_prologue): Call riscv_allocate_and_probe_stack_space to the final allocation of the stack and add stack-clash dump information. * config/riscv/riscv.h: Define STACK_CLASH_CALLER_GUARD and STACK_CLASH_MAX_UNROLL_PAGES. gcc/testsuite/ChangeLog: * gcc.dg/params/blocksort-part.c: Skip riscv for stack-clash protection intervals. * gcc.dg/pr82788.c: Skip riscv. * gcc.dg/stack-check-6.c: Skip residual check for riscv. * gcc.dg/stack-check-6a.c: Skip riscv. * gcc.target/riscv/stack-check-12.c: New test. * gcc.target/riscv/stack-check-13.c: New test. * gcc.target/riscv/stack-check-cfa-1.c: New test. * gcc.target/riscv/stack-check-cfa-2.c: New test. * gcc.target/riscv/stack-check-prologue-1.c: New test. * gcc.target/riscv/stack-check-prologue-10.c: New test. * gcc.target/riscv/stack-check-prologue-11.c: New test. * gcc.target/riscv/stack-check-prologue-12.c: New test. * gcc.target/riscv/stack-check-prologue-13.c: New test. * gcc.target/riscv/stack-check-prologue-14.c: New test. * gcc.target/riscv/stack-check-prologue-15.c: New test. * gcc.target/riscv/stack-check-prologue-2.c: New test. * gcc.target/riscv/stack-check-prologue-3.c: New test. * gcc.target/riscv/stack-check-prologue-4.c: New test. * gcc.target/riscv/stack-check-prologue-5.c: New test. * gcc.target/riscv/stack-check-prologue-6.c: New test. * gcc.target/riscv/stack-check-prologue-7.c: New test. * gcc.target/riscv/stack-check-prologue-8.c: New test. * gcc.target/riscv/stack-check-prologue-9.c: New test. * gcc.target/riscv/stack-check-prologue.h: New file. * lib/target-supports.exp (check_effective_target_supports_stack_clash_protection): Add riscv. (check_effective_target_caller_implicit_probes): Likewise.
2024-08-09RISC-V: Move riscv_v_adjust_scalable_frameRaphael Moreira Zinsly1-31/+31
Move riscv_v_adjust_scalable_frame () in preparation for the stack clash protection support. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_v_adjust_scalable_frame): Move closer to riscv_expand_prologue.
2024-08-09RISC-V: Small stack tie changesRaphael Moreira Zinsly2-10/+10
Enable the register used by riscv_emit_stack_tie () to be passed as an argument so we can tie the stack with other registers besides hard_frame_pointer_rtx. Also don't allow operand 1 of stack_tie<mode> to be optimized to sp in preparation for the stack clash protection support. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_emit_stack_tie): Pass the register to be tied to the stack pointer as argument. * config/riscv/riscv.md (stack_tie<mode>): Don't match equal operands.
2024-08-09c-family: regenerate c.opt.urlsPatrick Palka1-0/+3
The addition of -Wtemplate-body in r15-2774-g596d1ed9d40b10 means we need to regenerate c.opt.urls. gcc/c-family/ChangeLog: * c.opt.urls: Regenerate.
2024-08-09c++: add fixed testcase [PR116289]Patrick Palka1-0/+16
Fully fixed since r14-6724-gfced59166f95e9. PR c++/116289 PR c++/113063 gcc/testsuite/ChangeLog: * g++.dg/cpp2a/spaceship-synth16a.C: New test.
2024-08-09i386: Fix up __builtin_ia32_b{extr{,i}_u{32,64},zhi_{s,d}i} folding [PR116287]Jakub Jelinek4-4/+89
The GENERIC folding of these builtins have cases where it folds to a constant regardless of the value of the first operand. If so, we need to use omit_one_operand to avoid throwing away side-effects in the first operand if any. The cases which verify the first argument is INTEGER_CST don't need that, INTEGER_CST doesn't have side-effects. 2024-08-09 Jakub Jelinek <jakub@redhat.com> PR target/116287 * config/i386/i386.cc (ix86_fold_builtin) <case IX86_BUILTIN_BEXTR32>: When folding into zero without checking whether first argument is constant, use omit_one_operand. (ix86_fold_builtin) <case IX86_BUILTIN_BZHI32>: Likewise. * gcc.target/i386/bmi-pr116287.c: New test. * gcc.target/i386/bmi2-pr116287.c: New test. * gcc.target/i386/tbm-pr116287.c: New test.
2024-08-09amdgcn: Add padding to trampolineAndrew Stubbs2-1/+2
This avoids a -Wpadded warning (testcase gcc.dg/20050607-1.c). gcc/ChangeLog: * config/gcn/gcn.cc (gcn_asm_trampoline_template): Add .align. * config/gcn/gcn.h (TRAMPOLINE_SIZE): Increase to 40.
2024-08-09AVR: Tidy up code for __[x]load insns.Georg-Johann Lay1-21/+9
gcc/ * config/avr/avr.md (*load_<mode>_libgcc, *xload_<mode>_libgcc): Tidy up code.
2024-08-09c-family: Add some more ARRAY_SIZE usesJakub Jelinek1-4/+2
These two spots were just non-standard, because they divided sizeof (omp_pragmas_simd) by sizeof (*omp_pragmas) and not the expected sizeof (*omp_pragmas_simd) and so weren't converted into ARRAY_SIZE. Both of the latter sizes are the same though, as both arrays have the same type, so this patch doesn't change anything but readability. 2024-08-09 Jakub Jelinek <jakub@redhat.com> * c-pragma.cc (c_pp_lookup_pragma): Use ARRAY_SIZE in n_omp_pragmas_simd initializer. (init_pragmas): Likewise.
2024-08-09aarch64: Check CONSTM1_RTX in definition of Dm constraintKyrylo Tkachov1-1/+1
The constraint Dm is intended to match vectors of minus 1, but actually checks for CONST1_RTX. This doesn't have a bad effect in practice as its only use in the aarch64_wrffr pattern for the setffr instruction which is a VNx16BI operation and -1 and 1 are the same there. That pattern can only be currently generated through intrinsics anyway that create it with a CONSTM1_RTX constant. Fix the constraint definition so that it doesn't become a footgun if its used in some other pattern. Bootstrapped and tested on aarch64-none-linux-gnu. Signed-off-by: Kyrylo Tkachov <ktkachov@nvidia.com> gcc/ChangeLog: * config/aarch64/constraints.md (Dm): Match CONSTM1_RTX rather CONST1_RTX.
2024-08-09Daily bump.GCC Administrator6-1/+323
2024-08-08aarch64/testsuite: Fix if-compare_2.c for removing vcond{,u,eq} patterns ↵Andrew Pinski1-2/+7
[PR116041] For bar1 and bar2, we currently is expecting to use the bsl instruction but with slightly different register allocation inside the loop (which happens after the removal of the vcond{,u,eq} patterns), we get the bit instruction. The pattern that outputs bsl instruction will output bit and bif too depending register allocation. So let's check for bsl, bit or bif instructions instead of just bsl instruction. Tested on aarch64 both with an unmodified compiler and one which has the patch to disable these optabs. gcc/testsuite/ChangeLog: PR testsuite/116041 * gcc.target/aarch64/if-compare_2.c: Support bit and bif for both bar1 and bar2; add comment on why too. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-08-08AArch64: Fix signbit mask creation after late combine [PR116229]Tamar Christina4-2/+32
The optimization to generate a Di signbit constant by using fneg was relying on nothing being able to push the constant into the negate. It's run quite late for this reason. However late combine now runs after it and triggers RTL simplification based on the neg. When -fno-signed-zeros this ends up dropping the - from the -0.0 and thus producing incorrect code. This change adds a new unspec FNEG on DI mode which prevents this simplication. gcc/ChangeLog: PR target/116229 * config/aarch64/aarch64-simd.md (aarch64_fnegv2di2<vczle><vczbe>): New. * config/aarch64/aarch64.cc (aarch64_maybe_generate_simd_constant): Update call to gen_aarch64_fnegv2di2. * config/aarch64/iterators.md: New UNSPEC_FNEG. gcc/testsuite/ChangeLog: PR target/116229 * gcc.target/aarch64/pr116229.c: New test.
2024-08-08AVR: target/116295 - Fix unrecognizable insn with __flash read.Georg-Johann Lay2-0/+26
Some loads from non-generic address-spaces are performed by libgcc calls, and they don't have a POST_INC form. Don't consider such insns when running -mfuse-add. PR target/116295 gcc/ * config/avr/avr.cc (Mem_Insn::Mem_Insn): Don't consider MEMs that are avr_mem_memx_p or avr_load_libgcc_p. gcc/testsuite/ * gcc.target/avr/torture/pr116295.c: New test.
2024-08-08AVR: Fix a typo in __builtin_avr_mask1 documentation.Georg-Johann Lay1-1/+1
gcc/ * doc/extend.texi (AVR Built-in Functions) <mask1>: Fix a typo.
2024-08-08AVR: Improve POST_INC output in some rare cases.Georg-Johann Lay1-1/+31
gcc/ * config/avr/avr.cc (avr_insn_has_reg_unused_note_p): New function. (_reg_unused_after): Use it to recognize more cases. (avr_out_lpm_no_lpmx) [POST_INC]: Use reg_unused_after.
2024-08-08amdgcn: Fix VGPR max countAndrew Stubbs1-0/+7
The metadata for RDNA3 kernels allocates VGPRs in blocks of 12, which means the maximum usable number of registers is 252. This patch prevents the compiler from exceeding this artifical limit. gcc/ChangeLog: * config/gcn/gcn.cc (gcn_conditional_register_usage): Fix registers remaining after maximum allocation using TARGET_VGPR_GRANULARITY.
2024-08-08ada: Missing legality check when type completedSteve Baird2-0/+25
An access discriminant is allowed to have a default value only if the discriminated type is immutably limited. In the case of a discriminated limited private type declaration, this rule needs to be checked when the completion of the type is seen. gcc/ada/ * sem_ch6.adb (Check_Discriminant_Conformance): Perform check for illegal access discriminant default values when the completion of a limited private type is analyzed. * sem_aux.adb (Is_Immutably_Limited): If passed the not-yet-analyzed entity for the full view of a record type, test the Limited_Present flag (which is set by the parser).
2024-08-08ada: Etype missing for raise expressionSteve Baird1-2/+5
If the primitive equality operator of the component type of an array type is abstract, then a call to that abstract function raises Program_Error (when such a call is legal). The FE generates a raise expression to implement this. That raise expression is an expression so it should have a valid Etype. gcc/ada/ * exp_ch4.adb (Build_Eq_Call): In the abstract callee case, copy the Etype of the callee onto the Make_Raise_Program_Error result.
2024-08-08ada: Run-time error with GNAT-LLVM on container aggregate with finalizationGary Dismukes1-1/+2
When unnesting is enabled, the compiler was failing to copy the At_End_Proc field from a block statement to the procedure created to replace it when unnesting of top-level blocks is done. At run time this could lead to exceptions due to missing finalization calls. gcc/ada/ * exp_ch7.adb (Unnest_Block): Copy the At_End_Proc from the block statement to the newly created subprogram body.
2024-08-08ada: Futher refinements to mutably tagged typesJustin Squirek5-21/+71
This patch further enhances the mutably tagged type implementation by fixing several oversights relating to generic instantiations, attributes, and type conversions. gcc/ada/ * exp_put_image.adb (Append_Component_Attr): Obtain the mutably tagged type for the component type. * mutably_tagged.adb (Make_Mutably_Tagged_Conversion): Add more cases to avoid conversion generation. * sem_attr.adb (Check_Put_Image_Attribute): Add mutably tagged type conversion. * sem_ch12.adb (Analyze_One_Association): Add rewrite for formal type declarations which are mutably tagged type to their equivalent type. (Instantiate_Type): Add condition to obtain class wide equivalent types. (Validate_Private_Type_Instance): Add check for class wide equivalent types which are considered "definite". * sem_util.adb (Is_Variable): Add condition to handle selected components of view conversions. Add missing check for selected components. (Is_View_Conversion): Add condition to handle class wide equivalent types.
2024-08-08ada: Spurious maximum nesting level warningsJustin Squirek1-1/+2
This patch fixes an issue in the compiler whereby disabling style checks via pragma Style_Checks ("-L") resulted in the minimum nesting level being zero but the style still being enabled - leading to spurious maximum nesting level exceeded warnings. gcc/ada/ * stylesw.adb (Set_Style_Check_Options): Disable max nesting level when unspecified
2024-08-08ada: Finalization_Size raises Constraint_ErrorJavier Miranda1-1/+24
When the attribute Finalization_Size is applied to an interface type object, the compiler-generated code fails at runtime, raising a Constraint_Error exception. gcc/ada/ * exp_attr.adb (Expand_N_Attribute_Reference) <Finalization_Size>: If the prefix is an interface type, generate code to obtain its address and displace it to reference the base of the object.
2024-08-08RISC-V: rv32/DF: Prevent 2 SImode loads using XTheadMemIdxChristoph Müllner4-4/+15
When enabling XTheadFmv/Zfa and XThead(F)MemIdx, we might end up with the following insn (registers are examples, but of correct class): (set (reg:DF a4) (mem:DF (plus:SI (mult:SI (reg:SI a0) (const_int 8)) (reg:SI a5)))) This is a result of an attempt to load the DF register via two SI register loads followed by XTheadFmv/Zfa instructions to move the contents of the two SI registers into the DF register. The two loads are generated in riscv_split_doubleword_move(), where the second load adds an offset of 4 to load address. While this works fine for RVI loads, this can't be handled for XTheadMemIdx addresses. Coming back to the example above, we would end up with the following insn, which can't be simplified or matched: (set (reg:SI a4) (mem:SI (plus:SI (plus:SI (mult:SI (reg:SI a0) (const_int 8)) (reg:SI a5)) (const_int 4)))) This triggered an ICE in the past, which was resolved in b79cd204c780, which also added the test xtheadfmemidx-medany.c, where the examples are from. The patch postponed the optimization insn_and_split pattern for XThead(F)MemIdx, so that the situation could effectively be avoided. Since we don't want to rely on these optimization pattern in the future, we need a different solution. Therefore, this patch restricts the movdf_hardfloat_rv32 insn to not match for split-double-word-moves with XThead(F)MemIdx operands. This ensures we don't need to split them up later. When looking at the code generation of the test file, we can see that we have less GP<->FP conversions, but cannot use the indexed loads. The new sequence is identical to rv32gc_xtheadfmv (similar to rv32gc_zfa). Old: [...] lla a5,.LANCHOR0 th.flrd fa5,a5,a0,3 fmv.x.w a4,fa5 th.fmv.x.hw a5,fa5 .L1: fmv.w.x fa0,a4 th.fmv.hw.x fa0,a5 ret [...] New: [...] lla a5,.LANCHOR0 slli a4,a0,3 add a4,a4,a5 lw a5,4(a4) lw a4,0(a4) .L1: fmv.w.x fa0,a4 th.fmv.hw.x fa0,a5 ret [...] This was tested (together with the patch that eliminates the XTheadMemIdx optimization patterns) with SPEC CPU 2017 intrate on QEMU (RV64/lp64d). gcc/ChangeLog: * config/riscv/constraints.md (th_m_noi): New constraint. * config/riscv/riscv.md: Adjust movdf_hardfloat_rv32 for XTheadMemIdx. gcc/testsuite/ChangeLog: * gcc.target/riscv/xtheadfmemidx-xtheadfmv-medany.c: Adjust. * gcc.target/riscv/xtheadfmemidx-zfa-medany.c: Likewise. Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
2024-08-08RISC-V: xthead(f)memidx: Eliminate optimization patternsChristoph Müllner3-430/+90
We have a huge amount of optimization patterns (insn_and_split) for XTheadMemIdx and XTheadFMemIdx that attempt to do something, that can be done more efficient by generic GCC passes, if we have proper support code. A key function in eliminating the optimization patterns is th_memidx_classify_address_index(), which needs to identify each possible memory expression that can be lowered into a XTheadMemIdx/XTheadFMemIdx instruction. This patch adds all memory expressions that were previously only recognized by the optimization patterns. Now, that the address classification is complete, we can finally remove all optimization patterns with the side-effect or getting rid of the non-canonical memory expression they produced: (plus (reg) (ashift (reg) (imm))). A positive side-effect of this change is, that we address an RV32 ICE, that was caused by the th_memidx_I_c pattern, which did not properly handle SUBREGs (more details are in PR116131). A temporary negative side-effect of this change is, that we cause a regression of the xtheadfmemidx + xtheadfmv/zfa tests (initially introduced as part of b79cd204c780 to address an ICE). As this issue cannot be addressed in the code parts that are adjusted in this patch, we just accept the regression for now. PR target/116131 gcc/ChangeLog: * config/riscv/thead.cc (th_memidx_classify_address_index): Recognize all possible XTheadMemIdx memory operand structures. (th_fmemidx_output_index): Do strict classification. * config/riscv/thead.md (*th_memidx_operand): Remove. (TARGET_XTHEADMEMIDX): Likewise. (TARGET_HARD_FLOAT && TARGET_XTHEADFMEMIDX): Likewise. (!TARGET_64BIT && TARGET_XTHEADMEMIDX): Likewise. (*th_memidx_I_a): Likewise. (*th_memidx_I_b): Likewise. (*th_memidx_I_c): Likewise. (*th_memidx_US_a): Likewise. (*th_memidx_US_b): Likewise. (*th_memidx_US_c): Likewise. (*th_memidx_UZ_a): Likewise. (*th_memidx_UZ_b): Likewise. (*th_memidx_UZ_c): Likewise. (*th_fmemidx_movsf_hardfloat): Likewise. (*th_fmemidx_movdf_hardfloat_rv64): Likewise. (*th_fmemidx_I_a): Likewise. (*th_fmemidx_I_c): Likewise. (*th_fmemidx_US_a): Likewise. (*th_fmemidx_US_c): Likewise. (*th_fmemidx_UZ_a): Likewise. (*th_fmemidx_UZ_c): Likewise. gcc/testsuite/ChangeLog: * gcc.target/riscv/pr116131.c: New test. Reported-by: Patrick O'Neill <patrick@rivosinc.com> Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
2024-08-08RISC-V: testsuite: xtheadfmemidx: Rename test and add similar Zfa testChristoph Müllner2-2/+42
Test file xtheadfmemidx-medany.c has been added in b79cd204c780 as a test case that provoked an ICE when loading DFmode registers via two SImode register loads followed by a SI->DF[63:32] move from XTheadFmv. Since Zfa is affected in the same way as XTheadFmv, even if both have slightly different instructions, let's add a test for Zfa as well and give the tests proper names. Let's also add a test into the test files that counts the SI->DF moves from XTheadFmv/Zfa. gcc/testsuite/ChangeLog: * gcc.target/riscv/xtheadfmemidx-medany.c: Move to... * gcc.target/riscv/xtheadfmemidx-xtheadfmv-medany.c: ...here. * gcc.target/riscv/xtheadfmemidx-zfa-medany.c: New test. Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
2024-08-08vect: Small C++11-ification of vect_vect_recog_func_ptrsAndrew Pinski1-7/+5
This is a small C++11-ificiation for the use of vect_vect_recog_func_ptrs. Changes the loop into a range based loop which then we can remove the variable definition of NUM_PATTERNS. Also uses const reference instead of a pointer. Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: * tree-vect-patterns.cc (NUM_PATTERNS): Delete. (vect_pattern_recog_1): Constify and change recog_func to a reference. (vect_pattern_recog): Use range-based loop over vect_vect_recog_func_ptrs. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-08-08RISC-V: Delete duplicate '#define RISCV_DWARF_VLENB'Jin Ma1-2/+0
gcc/ChangeLog: * config/riscv/riscv.h (RISCV_DWARF_VLENB): Delete.
2024-08-08amdgcn: Re-enable trampolinesAndrew Stubbs1-5/+0
The stacks are executable since the reverse-offload features were added, so trampolines actually do work. gcc/ChangeLog: * config/gcn/gcn.cc (gcn_trampoline_init): Re-enable trampolines.
2024-08-08[RISC-V][PR target/116240] Ensure object is a comparison before extracting ↵Jeff Law2-2/+16
arguments This was supposed to go out the door yesterday, but I kept getting interrupted. The target bits for rtx costing can't assume the rtl they're given actually matches a target pattern. It's just kind of inherent in how the costing routines get called in various places. In this particular case we're trying to cost a conditional move: (set (dest) (if_then_else (cond) (true) (false)) On the RISC-V port the backend only allows actual conditionals for COND. So something like (eq (reg) (const_int 0)). In the costing code for if-then-else we did something like (XEXP (XEXP (cond, 0), 0))) Which fails miserably if COND is a terminal node like (reg) rather than (ne (reg) (const_int 0) So this patch tightens up the RTL scanning to ensure that we have a comparison before we start looking at the comparison's arguments. Run through my tester without incident, but I'll wait for the pre-commit tester to run through a cycle before pushing to the trunk. Jeff ps. We probably could support a naked REG for the condition and internally convert it to (ne (reg) (const_int 0)), but I don't think it likely happens with any regularity. PR target/116240 gcc/ * config/riscv/riscv.cc (riscv_rtx_costs): Ensure object is a comparison before looking at its arguments. gcc/testsuite * gcc.target/riscv/pr116240.c: New test.
2024-08-08Rearrange SLP nodes with duplicate statements [PR98138]Manolis Tsamis2-0/+150
This change checks when a two_operators SLP node has multiple occurrences of the same statement (e.g. {A, B, A, B, ...}) and tries to rearrange the operands so that there are no duplicates. Two vec_perm expressions are then introduced to recreate the original ordering. These duplicates can appear due to how two_operators nodes are handled, and they prevent vectorization in some cases. This targets the vectorization of the SPEC2017 x264 pixel_satd functions. In some processors a larger than 10% improvement on x264 has been observed. PR tree-optimization/98138 gcc/ChangeLog: * tree-vect-slp.cc: Avoid duplicates in two_operators nodes. gcc/testsuite/ChangeLog: * gcc.target/aarch64/vect-slp-two-operator.c: New test.
2024-08-08c++: Propagate TREE_ADDRESSABLE in fixup_type_variants [PR115062]Nathaniel Shead4-17/+43
This has caused issues with modules when an import fills in the definition of a type already created with a typedef. PR c++/115062 gcc/cp/ChangeLog: * class.cc (fixup_type_variants): Propagate TREE_ADDRESSABLE. (finish_struct_bits): Cleanup now that TREE_ADDRESSABLE is propagated by fixup_type_variants. gcc/testsuite/ChangeLog: * g++.dg/modules/pr115062_a.H: New test. * g++.dg/modules/pr115062_b.H: New test. * g++.dg/modules/pr115062_c.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2024-08-08c++/modules: Assume header bindings are global moduleNathaniel Shead1-1/+1
While stepping through some code I noticed that we do some extra work (finding the originating module decl, stripping the template, and inspecting the attached-ness) for every declaration taken from a header unit. This doesn't seem necessary though since no declaration in a header unit can be attached to anything but the global module, so we can just assume that global_p will be true. This was the original behaviour before I removed this assumption while refactoring for r15-2807-gc592310d5275e0. gcc/cp/ChangeLog: * module.cc (module_state::read_cluster): Assume header module declarations will require GM merging. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2024-08-08i386: Tweak ix86_mode_can_transfer_bits to restore bootstrap on RHEL.Roger Sayle1-2/+2
This minor patch, very similar to one posted and approved previously at https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657229.html is required to restore builds on systems using gcc 4.8 as a host compiler. Using the enumeration constants E_SFmode and E_DFmode avoids issues with SFmode and DFmode being "non-literal types in constant expressions". 2024-08-08 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * config/i386/i386.cc (ix86_mode_can_transfer_bits): Use E_?Fmode enumeration constants in switch statement.
2024-08-08c++, libstdc++: Implement C++26 P2747R2 - constexpr placement new [PR115744]Jakub Jelinek6-4/+203
With the PR115754 fix in, constexpr placement new mostly just works, so this patch just adds constexpr keyword to the placement new operators in <new>, adds FTMs and testsuite coverage. There is one accepts-invalid though, the new (p + 1) int[]{2, 3}; // error (in this paper) case from the paper. Can we handle that incrementally? The problem with that is I think calling operator new now that it is constexpr should be fine even in that case in constant expressions, so int *p = std::allocator<int>{}.allocate(3); int *q = operator new[] (sizeof (int) * 2, p + 1); should be ok, so it can't be easily the placement new operator call itself on whose constexpr evaluation we try something special, it should be on the new expression, but constexpr.cc actually sees only <<< Unknown tree: expr_stmt (void) (TARGET_EXPR <D.2640, (void *) TARGET_EXPR <D.2641, VIEW_CONVERT_EXPR<int *>(b) + 4>>, TARGET_EXPR <D.2642, operator new [] (8, NON_LVALUE_EXPR <D.2640>)>, int * D.2643; <<< Unknown tree: expr_stmt (void) (D.2643 = (int *) D.2642) >>>; and that is just fine by the preexisting constexpr evaluation rules. Should build_new_1 emit some extra cast for the array cases with placement new in maybe_constexpr_fn (current_function_decl) that the existing P2738 code would catch? 2024-08-08 Jakub Jelinek <jakub@redhat.com> PR c++/115744 gcc/c-family/ * c-cppbuiltin.cc (c_cpp_builtins): Change __cpp_constexpr from 202306L to 202406L for C++26. gcc/testsuite/ * g++.dg/cpp2a/construct_at.h (operator new, operator new[]): Use constexpr instead of inline if __cpp_constexpr >= 202406L. * g++.dg/cpp26/constexpr-new1.C: New test. * g++.dg/cpp26/constexpr-new2.C: New test. * g++.dg/cpp26/constexpr-new3.C: New test. * g++.dg/cpp26/feat-cxx26.C (__cpp_constexpr): Adjust expected value. libstdc++-v3/ * libsupc++/new (__glibcxx_want_constexpr_new): Define before including bits/version.h. (_GLIBCXX_PLACEMENT_CONSTEXPR): Define. (operator new, operator new[]): Use it for placement new instead of inline. * include/bits/version.def (constexpr_new): New FTM. * include/bits/version.h: Regenerate.
2024-08-08Ada, libgnarl: Fix s-taprop__posix.adb compilation.Iain Sandoe1-1/+1
Bootstrap on Darwin, and likely any other targets using the posix implementation of s-taprop was broken by commits between r15-2743 and r15-2747: s-taprop.adb:297:15: error: "size_t" is not visible s-taprop.adb:297:15: error: multiple use clauses cause hiding s-taprop.adb:297:15: error: hidden declaration at s-osinte.ads:58 s-taprop.adb:297:15: error: hidden declaration at i-c.ads:9 This seems to be caused by an omitted change to use Interfaces.C.size_t instead of just size_t. Fixed thus. gcc/ada/ChangeLog: * libgnarl/s-taprop__posix.adb (Stack_Guard): Use Interfaces.C.size_t for the type of Page_Size. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
2024-08-08ada: Fix s-taprop__solaris.adb compilationRainer Orth1-1/+1
Solaris Ada bootstrap is broken as of 2024-08-06 with s-taprop.adb:1971:23: error: "int" is not visible s-taprop.adb:1971:23: error: multiple use clauses cause hiding s-taprop.adb:1971:23: error: hidden declaration at s-osinte.ads:51 s-taprop.adb:1971:23: error: hidden declaration at i-c.ads:62 because one instance of int isn't qualified. This patch fixes this. Bootstrapped without regressions on i386-pc-solaris2.11 and sparc-sun-solaris2.11. 2024-08-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> gcc/ada: * libgnarl/s-taprop__solaris.adb (Set_Task_Affinity): Fully quality int.