aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-09-30Daily bump.GCC Administrator3-1/+60
2024-09-30RISC-V: Add testcases for form 1 of scalar signed SAT_SUBPan Li10-0/+267
Form 1: #define DEF_SAT_S_SUB_FMT_1(T, UT, MIN, MAX) \ T __attribute__((noinline)) \ sat_s_sub_##T##_fmt_1 (T x, T y) \ { \ T minus = (UT)x - (UT)y; \ return (x ^ y) >= 0 \ ? minus \ : (minus ^ x) >= 0 \ ? minus \ : x < 0 ? MIN : MAX; \ } DEF_SAT_S_SUB_FMT_1(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_arith_data.h: Add test data for SAT_SUB. * gcc.target/riscv/sat_s_sub-1-i16.c: New test. * gcc.target/riscv/sat_s_sub-1-i32.c: New test. * gcc.target/riscv/sat_s_sub-1-i64.c: New test. * gcc.target/riscv/sat_s_sub-1-i8.c: New test. * gcc.target/riscv/sat_s_sub-run-1-i16.c: New test. * gcc.target/riscv/sat_s_sub-run-1-i32.c: New test. * gcc.target/riscv/sat_s_sub-run-1-i64.c: New test. * gcc.target/riscv/sat_s_sub-run-1-i8.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-09-30RISC-V: Implement scalar SAT_SUB for signed integerPan Li3-0/+81
This patch would like to implement the sssub form 1. Aka: Form 1: #define DEF_SAT_S_SUB_FMT_1(T, UT, MIN, MAX) \ T __attribute__((noinline)) \ sat_s_sub_##T##_fmt_1 (T x, T y) \ { \ T minus = (UT)x - (UT)y; \ return (x ^ y) >= 0 \ ? minus \ : (minus ^ x) >= 0 \ ? minus \ : x < 0 ? MIN : MAX; \ } DEF_SAT_S_SUB_FMT_1(int8_t, uint8_t, INT8_MIN, INT8_MAX) Before this patch: 10 │ sat_s_sub_int8_t_fmt_1: 11 │ subw a5,a0,a1 12 │ slliw a5,a5,24 13 │ sraiw a5,a5,24 14 │ xor a1,a0,a1 15 │ xor a4,a0,a5 16 │ and a1,a1,a4 17 │ blt a1,zero,.L4 18 │ mv a0,a5 19 │ ret 20 │ .L4: 21 │ srai a0,a0,63 22 │ xori a5,a0,127 23 │ mv a0,a5 24 │ ret After this patch: 10 │ sat_s_sub_int8_t_fmt_1: 11 │ sub a4,a0,a1 12 │ xor a5,a0,a4 13 │ xor a1,a0,a1 14 │ and a5,a5,a1 15 │ srli a5,a5,7 16 │ andi a5,a5,1 17 │ srai a0,a0,63 18 │ xori a3,a0,127 19 │ neg a0,a5 20 │ addi a5,a5,-1 21 │ and a3,a3,a0 22 │ and a0,a4,a5 23 │ or a0,a0,a3 24 │ slliw a0,a0,24 25 │ sraiw a0,a0,24 26 │ ret The below test suites are passed for this patch. * The rv64gcv fully regression test. gcc/ChangeLog: * config/riscv/riscv-protos.h (riscv_expand_sssub): Add new func decl for expanding signed SAT_SUB. * config/riscv/riscv.cc (riscv_expand_sssub): Add new func impl for expanding signed SAT_SUB. * config/riscv/riscv.md (sssub<mode>3): Add new pattern sssub for scalar signed integer. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-09-29cselib: Discard useless locs of preserved VALUEs [PR116627]Jakub Jelinek1-0/+5
remove_useless_values iteratively discards useless locs (locs of cselib_val which refer to non-preserved VALUEs with no locations), which in turn can make further values useless until no further VALUEs are made useless and then discards the useless VALUEs. Preserved VALUEs (something done during var-tracking only I think) live in a different hash table, cselib_preserved_hash_table rather than cselib_hash_table. cselib_find_slot first looks up slot in cselib_preserved_hash_table and only if not found looks it up in cselib_hash_table (and INSERTs only into the latter), whereas preservation of a VALUE results in move of a cselib_val from the latter to the former hash table. The testcase in the PR (apparently too fragile, it only reproduces on 14 branch with various flags on a single arch, not on trunk) ICEs, because we have a preserved VALUE (QImode with (const_int 0) as one of the locs). In a different BB SImode r2 is looked up, a non-preserved VALUE is created for it, and the r13-2916 added code attempts to lookup also SUBREGs of that in narrower modes, among those QImode, so adds to that SImode r2 non-preserve VALUE a new loc of (subreg:QI (value:SI) 0). That SImode value is considered useless, so remove_useless_value discards it, but nothing discarded it from the preserved VALUE's loc_list, so when looking something up in the hash table we ICE trying to derevence CSELIB_VAL of the discarded VALUE. I think we need to discuard useless locs even from the preserved VALUEs. That IMHO shouldn't create any further useless VALUEs, the preserved VALUEs are never useless, so we don't need to iterate with it, can do it just once, but IMHO it needs to be done because actually discard_useless_values. The following patch does that. 2024-09-29 Jakub Jelinek <jakub@redhat.com> PR target/116627 * cselib.cc (remove_useless_values): Discard useless locs even from preserved cselib_vals in cselib_preserved_hash_table hash table.
2024-09-29testsuite: XFAIL gfortran.dg/initialization_25.f90 properly (again)Sam James1-1/+1
dg-error needs an argument for "why" / a comment. gcc/testsuite/ChangeLog: PR fortran/116858 * gfortran.dg/initialization_25.f90: Fix dg-error arguments.
2024-09-29[PATCH] SH: Document extended asm operand modifersPietro Monteiro1-0/+29
From: Pietro Monteiro <pietro@sociotechnical.xyz> SH: Document extended asm operand modifers Tested by running "make info pdf html" and looking at the pdf and html output. I used the comment on "gcc/config/sh.cc:sh_print_operand()", SH's TARGET_PRINT_OPERAND function, as a guide. gcc/ChangeLog: * doc/extend.texi (SH Operand Modifiers): New. Signed-off-by: Pietro Monteiro <pietro@sociotechnical.xyz>
2024-09-29[PATCH] [PATCH] Avoid integer overflow in gcc.dg/cpp/charconst-3.c (PR ↵Mikael Pettersson1-1/+1
testsuite/116806) The intermediate expression (unsigned char) '\234' * scale overflows int on int16 targets, causing the test case to fail there. Fixed by performing the arithmetic in unsigned type, as suggested by Andrew Pinski. Regression tested on x86_64-pc-linux-gnu, and on an out-of-tree 16-bit target with simulator. Manually checked the generated code for pdp11 and xstormy16. Ok for trunk? (I don't have commit rights so I'd need help committing it.) gcc/testsuite/ PR testsuite/116806 * gcc.dg/cpp/charconst-3.c: Perform arithmetic in unsigned type to avoid integer overflow.
2024-09-29[PATCH v2] RISC-V: Improve code generation for select of consecutive constantsJovan Vukic2-0/+71
Based on the valuable feedback I received, I decided to implement the patch in the RTL pipeline. Since a similar optimization already exists in simplify_binary_operation_1, I chose to generalize my original approach and place it directly below that code. The expression (X xor C1) + C2 is simplified to X xor (C1 xor C2) under the conditions described in the patch. This is a more general optimization, but it still applies to the RISC-V case, which was my initial goal: long f1(long x, long y) { return (x > y) ? 2 : 3; } Before the patch, the generated assembly is: f1(long, long): sgt a0,a0,a1 xori a0,a0,1 addi a0,a0,2 ret After the patch, the generated assembly is: f1(long, long): sgt a0,a0,a1 xori a0,a0,3 ret The patch optimizes cases like x LT/GT y ? 2 : 3 (and x GE/LE y ? 3 : 2), as initially intended. Since this optimization is more general, I noticed it also optimizes cases like x < CONST ? 3 : 2 when CONST < 0. I’ve added tests for these cases as well. A bit of logic behind the patch: The equality A + B == A ^ B + 2 * (A & B) always holds true. This can be simplified to A ^ B if 2 * (A & B) == 0. In our case, we have A == X ^ C1, B == C2 and X is either 0 or 1. PR target/108038 gcc/ChangeLog: * simplify-rtx.cc (simplify_context::simplify_binary_operation_1): New simplification. gcc/testsuite/ChangeLog: * gcc.target/riscv/slt-1.c: New test.
2024-09-29doc: Document struct-layout-1.exp for ABI checksDimitar Dimitrov1-1/+17
This test helped discover PR116621, so it is worth being documented. gcc/ChangeLog: * doc/sourcebuild.texi: Document struct-layout-1.exp. Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2024-09-29Daily bump.GCC Administrator4-1/+30
2024-09-28Implement FINDLOC for UNSIGNED.Thomas Koenig4-3/+90
gcc/fortran/ChangeLog: * check.cc (intrinsic_type_check): Handle unsigned. (gfc_check_findloc): Likewise. * gfortran.texi: Include FINDLOC in unsigned documentation. * iresolve.cc (gfc_resolve_findloc): Use INTEGER version for UNSIGNED. gcc/testsuite/ChangeLog: * gfortran.dg/unsigned_33.f90: New test.
2024-09-28Implement CSHIFT and EOSHIFT for unsigned.Thomas Koenig5-1/+66
gcc/fortran/ChangeLog: * check.cc (gfc_check_eoshift): Handle BT_UNSIGNED. * simplify.cc (gfc_simplify_eoshift): Likewise. * gfortran.texi: Document CSHIFT and EOSHIFT for UNSIGNED. gcc/testsuite/ChangeLog: * gfortran.dg/unsigned_31.f90: New test. * gfortran.dg/unsigned_32.f90: New test.
2024-09-28doc: Remove i?86-*-linux* installation note from 2003Gerald Pfeifer1-3/+0
gcc: PR target/69374 * doc/install.texi (Specific) <i?86-*-linux*>: Remove note from 2003.
2024-09-28Daily bump.GCC Administrator5-1/+228
2024-09-28c++: Implement resolution for DR 36 [PR116160]Nathaniel Shead4-7/+18
This implements part of P1787 to no longer complain about redeclaring an entity via using-decl other than in a class scope. PR c++/116160 gcc/cp/ChangeLog: * name-lookup.cc (supplement_binding): Allow redeclaration via USING_DECL if not in class scope. (do_nonmember_using_decl): Remove function-scope exemption. (push_using_decl_bindings): Remove outdated comment. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/using-enum-3.C: No longer expect an error. * g++.dg/lookup/using53.C: Remove XFAIL. * g++.dg/cpp2a/using-enum-11.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-28c++: Don't strip USING_DECLs when updating local bindings [PR116748]Nathaniel Shead3-7/+19
Currently update_binding strips USING_DECLs too eagerly, leading to ICEs in pop_local_decl as it can't find the decl it's popping in the binding list. Let's rather try to keep the original USING_DECL around. This also means that using59.C can point to the location of the using-decl rather than the underlying object directly; this is in the direction required to fix PR c++/106851 (though more work is needed to emit properly helpful diagnostics here). PR c++/116748 gcc/cp/ChangeLog: * name-lookup.cc (update_binding): Maintain USING_DECLs in the binding slots. gcc/testsuite/ChangeLog: * g++.dg/lookup/using59.C: Update location. * g++.dg/lookup/using69.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-28c++/modules: Propagate purview/import for templates in duplicate_decls ↵Nathaniel Shead4-0/+41
[PR116803] We need to ensure that for a declaration in the module purview, that the resulting declaration has PURVIEW_P set and IMPORT_P cleared so that we understand it might be something requiring exporting. This is normally handled for a declaration by set_instantiating_module, but when this declaration is a redeclaration duplicate_decls needs to propagate this to olddecl. This patch only changes the logic for template declarations, because in the non-template case the whole contents of olddecl's DECL_LANG_SPECIFIC is replaced with newdecl's (which includes these flags), so there's nothing to do. PR c++/116803 gcc/cp/ChangeLog: * decl.cc (duplicate_decls): Propagate DECL_MODULE_PURVIEW_P and DECL_MODULE_IMPORT_P for template redeclarations. gcc/testsuite/ChangeLog: * g++.dg/modules/merge-18_a.H: New test. * g++.dg/modules/merge-18_b.H: New test. * g++.dg/modules/merge-18_c.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-27c++: ICE with structured bindings and m-d array [PR102594]Marek Polacek2-1/+35
We ICE in decay_conversion with this test: struct S { S() {} }; S arr[1][1]; auto [m](arr3); But not when the last line is: auto [n] = arr3; Therefore the difference is between copy- and direct-init. In particular, in build_vec_init we have: if (direct_init) from = build_tree_list (NULL_TREE, from); and then we call build_vec_init again with init==from. Then decay_conversion gets the TREE_LIST and it crashes. build_aggr_init has: /* Wrap the initializer in a CONSTRUCTOR so that build_vec_init recognizes it as direct-initialization. */ init = build_constructor_single (init_list_type_node, NULL_TREE, init); CONSTRUCTOR_IS_DIRECT_INIT (init) = true; so I propose to do the same in build_vec_init. PR c++/102594 gcc/cp/ChangeLog: * init.cc (build_vec_init): Build up a CONSTRUCTOR to signal direct-initialization rather than a TREE_LIST. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/decomp61.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-27diagnostic: Save/restore diagnostic context history and push/pop state for ↵Jakub Jelinek5-1/+80
PCH [PR116847] The following patch on top of the just posted cleanup patch saves/restores the m_classification_history and m_push_list vectors for PCH. Without that as the testcase shows during parsing of the templates we don't report ignored diagnostics, but after loading PCH header when instantiating those templates those warnings can be emitted. This doesn't show up on x86_64-linux build because configure injects there -fcf-protection -mshstk flags during library build (and so also during PCH header creation), but make check doesn't use those flags and so the PCH header is ignored. 2024-09-26 Jakub Jelinek <jakub@redhat.com> PR libstdc++/116847 gcc/ * diagnostic.h (diagnostic_option_classifier): Add pch_save and pch_restore method declarations. (diagnostic_context): Add pch_save and pch_restore inline method definitions. * diagnostic.cc (diagnostic_option_classifier::pch_save): New method. (diagnostic_option_classifier::pch_restore): Likewise. gcc/c-family/ * c-pch.cc: Include diagnostic.h. (c_common_write_pch): Call global_dc->pch_save. (c_common_read_pch): Call global_dc->pch_restore. gcc/testsuite/ * g++.dg/pch/pr116847.C: New test. * g++.dg/pch/pr116847.Hs: New test.
2024-09-27diagnostic: Use vec instead of custom array reallocations for ↵Jakub Jelinek2-46/+30
m_classification_history/m_push_list [PR116847] diagnostic.h already relies on vec.h, it uses auto_vec in one spot. The following patch converts m_classification_history and m_push_list hand-managed arrays to vec templates. The main advantage is exponential rather than linear reallocation, e.g. with current libstdc++ headers if one includes all the standard headers there could be ~ 300 reallocations of the m_classification_history array (sure, not all of them will result in actually copying the data, but still). In addition to that it fixes some formatting issues in the code. 2024-09-26 Jakub Jelinek <jakub@redhat.com> PR libstdc++/116847 * diagnostic.h (diagnostic_option_classifier): Change type of m_classification_history from diagnostic_classification_change_t * to vec<diagnostic_classification_change_t>. Change type of m_push_list from int * to vec<int>. Remove m_n_classification_history and m_n_push members. * diagnostic.cc (diagnostic_option_classifier::init): Set m_push_list to vNULL rather than nullptr. Don't initialize m_n_push. Initialize m_classification_history to vNULL. (diagnostic_option_classifier::fini): Call release () method on m_push_list instead of free on it. Call release () on m_classification_history. Don't clear m_n_push. (diagnostic_option_classifier::push): Adjust for m_push_list and m_classification_history being vectors rather than custom allocated arrays with counter. (diagnostic_option_classifier::pop): Likewise. (classify_diagnostic): Adjust for m_classification_history being vector rather than custom allocated array with counter. (update_effective_level_from_pragmas): Likewise.
2024-09-27i386: Modernize AMD processor typesUros Bizjak2-41/+37
Use iterative PTA definitions for members of the same AMD processor family. Also, fix a couple of related M_CPU_TYPE/M_CPU_SUBTYPE inconsistencies. No functional changes intended. gcc/ChangeLog: * config/i386/i386.h: Add PTA_BDVER1, PTA_BDVER2, PTA_BDVER3, PTA_BDVER4, PTA_BTVER1 and PTA_BTVER2. * common/config/i386/i386-common.cc (processor_alias_table) <"bdver1">: Use PTA_BDVER1. <"bdver2">: Use PTA_BDVER2. <"bdver3">: Use PTA_BDVER3. <"bdver4">: Use PTA_BDVER4. <"btver1">: Use PTA_BTVER1. Use M_CPU_TYPE (AMD_BTVER1). <"btver2">: Use PTA_BTVER2. <"shanghai>: Use M_CPU_SUBTYPE (AMDFAM10H_SHANGHAI). <"istanbul>: Use M_CPU_SUBTYPE (AMDFAM10H_ISTANBUL).
2024-09-27Widening-Mul: Fix one ICE when iterate on phi nodePan Li2-2/+83
We iterate all phi node of bb to try to match the SAT_* pattern for scalar integer. We also remove the phi mode when the relevant pattern matched. Unfortunately the iterator may have no idea the phi node is removed and continue leverage the free data and then ICE similar as below. [0] psi ptr 0x75216340c000 [0] psi ptr 0x75216340c400 [1] psi ptr 0xa5a5a5a5a5a5a5a5 <=== GC freed pointer. during GIMPLE pass: widening_mul tmp.c: In function ‘f’: tmp.c:45:6: internal compiler error: Segmentation fault 45 | void f(int rows, int cols) { | ^ 0x36e2788 internal_error(char const*, ...) ../../gcc/diagnostic-global-context.cc:517 0x18005f0 crash_signal ../../gcc/toplev.cc:321 0x752163c4531f ??? ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0 0x103ae0e bool is_a_helper<gphi*>::test<gimple>(gimple*) ../../gcc/gimple.h:1256 0x103f9a5 bool is_a<gphi*, gimple>(gimple*) ../../gcc/is-a.h:232 0x103dc78 gphi* as_a<gphi*, gimple>(gimple*) ../../gcc/is-a.h:255 0x104f12e gphi_iterator::phi() const ../../gcc/gimple-iterator.h:47 0x1a57bef after_dom_children ../../gcc/tree-ssa-math-opts.cc:6140 0x3344482 dom_walker::walk(basic_block_def*) ../../gcc/domwalk.cc:354 0x1a58601 execute ../../gcc/tree-ssa-math-opts.cc:6312 This patch would like to fix the iterate on modified collection problem by backup the next phi in advance. The below test suites are passed for this patch. * The rv64gcv fully regression test. * The x86 bootstrap test. * The x86 fully regression test. PR middle-end/116861 gcc/ChangeLog: * tree-ssa-math-opts.cc (math_opts_dom_walker::after_dom_children): Backup the next psi iterator before remove the phi node. gcc/testsuite/ChangeLog: * gcc.dg/torture/pr116861-1.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
2024-09-27Fix sorting in Contributors.htmlRichard Biener1-4/+4
The following moves my entry to where it belongs alphabetically (it wasn't moved when s/Guenther/Biener/). * doc/contrib.texi (Richard Biener): Move entry.
2024-09-27c++/coro: ignore cleanup_point_exprs while expanding awaits [PR116793]Arsen Arsenović2-1/+29
If we reach a CLEANUP_POINT_EXPR while trying to walk statements, we actually care about the statement or statement list contained within it. Indeed, such a construction started happening with r15-3513-g964577c31df206, after temporary promotion. In the test case presented in PR116793, the compiler generated: <<cleanup_point { struct _cleanup_task Aw0 [value-expr: frame_ptr->Aw0_2_3]; int T002 [value-expr: frame_ptr->T002_2_3]; int T002 [value-expr: frame_ptr->T002_2_3]; <<cleanup_point <<< Unknown tree: expr_stmt (void) (T002 = TARGET_EXPR <D.20994, 3>) >>>>>; struct _cleanup_task Aw0 [value-expr: frame_ptr->Aw0_2_3]; <<cleanup_point <<< Unknown tree: expr_stmt (void) (Aw0 = TARGET_EXPR <D.20995, func ((int &) &T002)>) >>>>>; <<cleanup_point <<< Unknown tree: expr_stmt (void) (D.22450 = <<< Unknown tree: co_await TARGET_EXPR <D.20995, func ((int &) &T002)> Aw0 {_cleanup_task::await_ready (&Aw0), _cleanup_task::await_suspend<_task1::promise_type> (&Aw0, TARGET_EXPR <D.21078, _Coro_self_handle>), <<< Unknown tree: aggr_init_expr 4 await_resume D.22443 &Aw0 >>>} 0 >>>) >>>>>; <<cleanup_point <<< Unknown tree: expr_stmt (void) (D.20991 = (struct tuple &) &D.22450) >>>>>; } D.22467 = 1; int & i [value-expr: frame_ptr->i_1_2]; <<cleanup_point <<< Unknown tree: expr_stmt (void) (i = std::get<0, int&> (NON_LVALUE_EXPR <D.20991>)) >>>>>;>>; ... i.e. a statement list within a cleanup point. In such a case, we don't actually care about the cleanup point, but we do care about the statement inside, so, we can just walk down into the CLEANUP_POINT_EXPR. PR c++/116793 gcc/cp/ChangeLog: * coroutines.cc (await_statement_expander): Just process subtrees if encountering a CLEANUP_POINT_EXPR. gcc/testsuite/ChangeLog: * g++.dg/coroutines/pr116793-1.C: New test.
2024-09-27c++: simplify handling implicit INDIRECT_REF and co_await in convert_to_voidArsen Arsenović4-53/+132
convert_to_void has, so far, when converting a co_await expression to void altered the await_resume expression of a co_await so that it is also converted to void. This meant that the type of the await_resume expression, which is also supposed to be the type of the whole co_await expression, was not the same as the type of the CO_AWAIT_EXPR tree. While this has not caused problems so far, it is unexpected, I think. Also, convert_to_void had a special case when an INDIRECT_REF wrapped a CALL_EXPR. In this case, we also diagnosed maybe_warn_nodiscard. This was a duplication of logic related to converting call expressions to void. Instead, we can generalize a bit, and rather discard the expression that was implicitly dereferenced instead. This patch changes the diagnostic of: void f(struct S* x) { static_cast<volatile S&>(*x); } ... from: warning: indirection will not access object of incomplete type 'volatile S' in statement ... to: warning: implicit dereference will not access object of type ‘volatile S’ in statement ... but should have no impact in other cases. gcc/cp/ChangeLog: * coroutines.cc (co_await_get_resume_call): Return a tree directly, rather than a tree pointer. * cp-tree.h (co_await_get_resume_call): Adjust signature accordingly. * cvt.cc (convert_to_void): Do not alter CO_AWAIT_EXPRs when discarding them. Simplify handling implicit INDIRECT_REFs. gcc/testsuite/ChangeLog: * g++.dg/coroutines/nodiscard-1.C: New test.
2024-09-27c++/coro: prevent ICV_STATEMENT diagnostics in temp promotion [PR116502]Arsen Arsenović3-3/+75
If such a diagnostic is necessary, it has already been emitted, otherwise, it is not correct and emitting it here is inactionable by the user, and bogus. PR c++/116502 gcc/cp/ChangeLog: * coroutines.cc (maybe_promote_temps): Convert temporary initializers to void without complaining. gcc/testsuite/ChangeLog: * g++.dg/coroutines/maybe-unused-1.C: New test. * g++.dg/coroutines/pr116502.C: New test.
2024-09-27tree-optimization/116818 - try VMAT_GATHER_SCATTER also for SLPRichard Biener1-14/+15
When not doing SLP and we end up with VMAT_ELEMENTWISE we consider using strided loads, aka VMAT_GATHER_SCATTER. The following moves this logic down to also apply to SLP where we now can end up using VMAT_ELEMENTWISE as well. PR tree-optimization/116818 * tree-vect-stmts.cc (get_group_load_store_type): Consider VMAT_GATHER_SCATTER instead of VMAT_ELEMENTWISE also for SLP. (vectorizable_load): For single-lane VMAT_GATHER_SCATTER also ignore permutations.
2024-09-27Fix bogus SLP nvector compute in check_load_store_for_partial_vectorsRichard Biener1-7/+3
We have a new overload for vect_get_num_copies that handles both SLP and non-SLP. Use it and avoid the division by group_size for SLP when not using load-store lanes. * tree-vect-stmts.cc (check_load_store_for_partial_vectors): Use the new vect_get_num_copies overload. Only divide by group_size for SLP for load-store lanes.
2024-09-27unswitch: Replace manual ondemand maybe_undef with ↵Andrew Pinski1-59/+2
ssa_name_maybe_undef_p/mark_ssa_maybe_undefs [PR116848] The ondemand maybe_undef that follows phis was added in r7-6427-g8b670f93ab1136 but then later ssa_name_maybe_undef_p/mark_ssa_maybe_undefs was added in r13-972-gbe2861fe8c527a. This moves the ondemand one to use mark_ssa_maybe_undefs/ssa_name_maybe_undef_p instead. Which itself will be faster since the mark_ssa_maybe_undefs is a walk based on the uses of undefined names (and only once) rather than a walk based on the def of ones which are more likely defined (and on demand). Even though the ondemand maybe_undef had some extra special cases, those won't make a big difference in most code. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/116848 gcc/ChangeLog: * tree-ssa-loop-unswitch.cc (tree_ssa_unswitch_loops): Call mark_ssa_maybe_undefs. (is_maybe_undefined): Call ssa_name_maybe_undef_p instead of ondemand undef. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-09-27c++/modules: Allow imported references in constant expressionsNathaniel Shead3-1/+23
Currently the streaming code uses TREE_CONSTANT to determine whether an entity will have a definition that is interesting to stream out. This is not sufficient, however; we also need to write the definition of references, since although not TREE_CONSTANT they can still be usable in constant expressions. As such this patch uses the existing decl_maybe_constant_var function which correctly handles this case. gcc/cp/ChangeLog: * module.cc (has_definition): Use decl_maybe_constant_var instead of TREE_CONSTANT. gcc/testsuite/ChangeLog: * g++.dg/modules/cexpr-5_a.C: New test. * g++.dg/modules/cexpr-5_b.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-27c++/modules: Fix linkage checks for exported using-declsNathaniel Shead7-41/+154
This fixes some inconsistencies with what kinds of linkage various entities are assumed to have. This also fixes handling of exported using-decls binding to GM entities and type aliases to better align with the standard's requirements. gcc/cp/ChangeLog: * name-lookup.cc (check_can_export_using_decl): Handle internal linkage GM entities (but ignore in header units); use linkage of entity ultimately referred to by aliases. gcc/testsuite/ChangeLog: * g++.dg/modules/using-10.C: Add tests for no-linkage, fix expected linkage of aliases. * g++.dg/modules/using-12.C: Likewise. * g++.dg/modules/using-27.C: New test. * g++.dg/modules/using-28_a.C: New test. * g++.dg/modules/using-28_b.C: New test. * g++.dg/modules/using-29.H: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-27c++/modules: Use decl_linkage in maybe_record_mergeable_declNathaniel Shead1-8/+1
This avoids any possible inconsistencies (current or future) about whether a declaration is internal or not. gcc/cp/ChangeLog: * name-lookup.cc (maybe_record_mergeable_decl): Use decl_linkage instead of ad-hoc checks. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-27c++: Update decl_linkage for C++11Nathaniel Shead3-37/+60
Currently modules code uses a variety of ad-hoc methods to attempt to determine whether an entity has internal linkage, which leads to inconsistencies and some correctness issues as different edge cases are neglected. While investigating this I discovered 'decl_linkage', but it doesn't seem to have been updated to account for the C++11 clarification that all entities declared in an anonymous namespace are internal. I'm not convinced that even in C++98 it was intended that e.g. types in anonymous namespaces should be external, but some tests in the testsuite rely on this, so for compatibility I restricted those modifications to C++11 and later. This should have relatively minimal impact as not much seems to actually rely on decl_linkage, but does change the mangling of symbols in anonymous namespaces slightly. Previously, we had namespace { int x; // mangled as '_ZN12_GLOBAL__N_11xE' static int y; // mangled as '_ZN12_GLOBAL__N_1L1yE' } but with this patch the x is now mangled like y (with the extra 'L'). For contrast, Clang currently mangles neither x nor y with the 'L'. Since this only affects internal-linkage entities I don't believe this should break ABI in any observable fashion. gcc/cp/ChangeLog: * name-lookup.cc (do_namespace_alias): Propagate TREE_PUBLIC for namespace aliases. * tree.cc (decl_linkage): Update rules for C++11. gcc/testsuite/ChangeLog: * g++.dg/modules/mod-sym-4.C: Update test to account for non-static internal-linkage variables new mangling. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-27testsuite/gfortran.dg/open_errors_2.f90: Remove now-redundant file deletionHans-Peter Nilsson1-1/+0
Now that fort.N files are removed by the testsuite framework, remove this single "manual" file deletion. (Also, it should have been "remote_file target delete", since it's the target that creates the file, not the build framework, which might matter to some setups.) * gfortran.dg/open_errors_2.f90: Remove now-redundant file deletion.
2024-09-27Daily bump.GCC Administrator6-1/+130
2024-09-26c++: tweak for -Wrange-loop-construct [PR116731]Marek Polacek2-3/+62
This PR reports that the warning would be better off using a check for trivially constructible rather than trivially copyable. LLVM accepted a similar fix: https://github.com/llvm/llvm-project/issues/47355 PR c++/116731 gcc/cp/ChangeLog: * parser.cc (warn_for_range_copy): Check if TYPE is trivially constructible, not copyable. gcc/testsuite/ChangeLog: * g++.dg/warn/Wrange-loop-construct3.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2024-09-26testsuite: XFAIL gfortran.dg/initialization_25.f90 properlySam James1-2/+2
The test was disabled/XFAIL'd informally in r0-100012-gcdc6637d7c78ec, but r15-3890-g34bf6aa41ba539 didn't realize this, causing a FAIL. Fix that by marking it as XFAIL per the original intent. gcc/testsuite/ChangeLog: PR fortran/35779 PR fortran/116858 * gfortran.dg/initialization_25.f90: Mark as XFAIL.
2024-09-26doc: Remove index reference to removed documentation in fortran manualMikael Morin1-1/+0
Fortran option -M used to be an alias for -J. After some deprecation time, it was reused for another purpose at revision r0-100725-gd8ddea4044ee8212d5fe305e8e2a547700cd7b8f. That revision removed the documentation parts of -J mentioning -M, but left a reference to -M in the index. This change removes the remaining reference. gcc/fortran/ChangeLog: * invoke.texi (-M): Remove index reference to removed documentation.
2024-09-26Add virtual destructor to AbstractExprOwen Avery1-0/+2
gcc/rust/ChangeLog: * checks/errors/borrowck/rust-bir.h (class AbstractExpr): Add virtual destructor. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
2024-09-26tree-optimization/114855 - speed up dom_oracle::register_transitivesRichard Biener3-18/+44
dom_oracle::register_transitives contains an unbound dominator walk which for the testcase in PR114855 dominates the profile. The following fixes the unbound work done by assigning a constant work budget to the loop, bounding the number of dominators visited but also the number of relations processed. This gets both dom_oracle::register_transitives and get_immediate_dominator off the profile. I'll note that we're still doing an unbound dominator walk via equiv_set in find_equiv_dom at the start of the function and when we register a relation that also looks up the same way. At least for the testcase at hand this isn't an issue. I've also amended the guard to register_transitives with the per-basic-block limit for the number of relations registered not being exhausted. PR tree-optimization/114855 * params.opt (--param transitive-relations-work-bound): New. * doc/invoke.texi (--param transitive-relations-work-bound): Document. * value-relation.cc (dom_oracle::register_transitives): Assing an overall work budget, bounding the dominator walk and the number of relations processed. (dom_oracle::record): Only register_transitives when the number of already registered relations does not yet exceed the per-BB limit.
2024-09-26Fortran/OpenMP: Middle-end support for mapping of DT with allocatable componentsTobias Burnus5-26/+265
gcc/ChangeLog: * langhooks-def.h (lhd_omp_deep_mapping_p, lhd_omp_deep_mapping_cnt, lhd_omp_deep_mapping): New. (LANG_HOOKS_OMP_DEEP_MAPPING_P, LANG_HOOKS_OMP_DEEP_MAPPING_CNT, LANG_HOOKS_OMP_DEEP_MAPPING): Define. (LANG_HOOKS_DECLS): Use it. * langhooks.cc (lhd_omp_deep_mapping_p, lhd_omp_deep_mapping_cnt, lhd_omp_deep_mapping): New stubs. * langhooks.h (struct lang_hooks_for_decls): Add new hooks * omp-expand.cc (expand_omp_target): Handle dynamic-size addr/sizes/kinds arrays. * omp-low.cc (build_sender_ref, fixup_child_record_type, scan_sharing_clauses, lower_omp_target): Update to handle new hooks and dynamic-size addr/sizes/kinds arrays.
2024-09-26pretty-print: Fix up allocate_objectJakub Jelinek1-1/+1
On Thu, Aug 29, 2024 at 06:58:12PM -0400, David Malcolm wrote: > The following patch rewrites the internals of pp_format. > The tokens and token lists are allocated on the chunk_obstack, and so > there's no additional heap activity required, with the memory reclaimed > when the chunk_obstack is freed after phase 3 of formatting. > +static void * > +allocate_object (size_t sz, obstack &s) > +{ > + /* We must not be half-way through an object. */ > + gcc_assert (obstack_base (&s) == obstack_next_free (&s)); > + > + obstack_grow (&s, obstack_base (&s), sz); > + void *buf = obstack_finish (&s); > + return buf; > } I think this is wrong. I hoped it would be the reason of the unexpected libstdc++ warnings on certain architectures after seeing ==4027220== Source and destination overlap in memcpy(0x4627154, 0x4627154, 12) ==4027220== at 0x404B93E: memcpy (vg_replace_strmem.c:1123) ==4027220== by 0xAAD5618: allocate_object(unsigned int, obstack&) (pretty-print.cc:1183) ==4027220== by 0xAAD8C0E: operator new (pretty-print.cc:1210) ==4027220== by 0xAAD8C0E: make (pretty-print-format-impl.h:305) ==4027220== by 0xAAD8C0E: format_phase_1 (pretty-print.cc:1659) ==4027220== by 0xAAD8C0E: pretty_printer::format(text_info&) (pretty-print.cc:1618) ==4027220== by 0xAAA840E: pp_format (pretty-print.h:583) ==4027220== by 0xAAA840E: diagnostic_context::report_diagnostic(diagnostic_info*) (diagnostic.cc:1260) ==4027220== by 0xAAA8703: diagnostic_context::diagnostic_impl(rich_location*, diagnostic_metadata const*, diagnostic_option_id, char const*, char**, diagnostic_t) (diagnostic.cc:1404) ==4027220== by 0xAAB8682: warning(diagnostic_option_id, char const*, ...) (diagnostic-global-context.cc:166) ==4027220== by 0x97725F5: warn_deprecated_use(tree_node*, tree_node*) (tree.cc:12485) ==4027220== by 0x8B6694B: mark_used(tree_node*, int) (decl2.cc:6121) ==4027220== by 0x8C9E25E: tsubst_expr(tree_node*, tree_node*, int, tree_node*) [clone .part.0] (pt.cc:21626) ==4027220== by 0x8C9E5E6: tsubst_expr(tree_node*, tree_node*, int, tree_node*) [clone .part.0] (pt.cc:20935) ==4027220== by 0x8C9E1D7: tsubst_expr(tree_node*, tree_node*, int, tree_node*) [clone .part.0] (pt.cc:20424) ==4027220== by 0x8C9DF2E: tsubst_expr(tree_node*, tree_node*, int, tree_node*) [clone .part.0] (pt.cc:20496) ==4027220== etc. valgrind warnings, unfortunately it is not, but still I think this is a bug. If the obstack has enough space in it, i.e. if obstack_room (&s) >= sz, then obstack_grow from obstack_base will copy uninitialized bytes through memcpy (obstack_base (&s), obstack_base (&s), sz); (which pedantically isn't valid due to the overlap, and so the reason why valgrind complains, but in reality I think most implementations can handle it fine, after all, we also use it for structure assignments which could have full or no overlap but never partial). If obstack_room (&s) < sz, then obstack_grow will first _obstack_newchunk (&s, sz); which will allocate new memory and copy the existing data of the object (but the above assertion guartantees it will copy 0 bytes) and then the memcpy copies sz bytes from the old base to the new (if unlucky, that could crash as there could be end of page and unmapped next page in between). I think we should use obstack_blank instead of obstack_grow, which does everything obstack_grow does, except for the memcpy of the uninitialized data. 2024-09-25 Jakub Jelinek <jakub@redhat.com> * pretty-print.cc (allocate_object): Use obstack_blank rather than obstack_grow.
2024-09-26testsuite: fix hyphen typosSam James2-3/+3
gcc/testsuite/ChangeLog: * g++.dg/modules/reparent-1_c.C: Fix whitespace around '-' in dg directive. * gfortran.dg/initialization_25.f90: Ditto.
2024-09-26testsuite: fix comment-only directive typosSam James4-4/+4
Doing this to avoid FPs from grepping but also to avoid the potential for people learning bad habits. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/caf.exp: Fix 'dg-do-run' typo. * lib/gfortran-dg.exp: Ditto. * lib/gm2-dg.exp: Ditto. * lib/go-dg.exp: Ditto.
2024-09-26doc: Remove MinGW note on binutils 2.16Gerald Pfeifer1-4/+0
Binutils 2.16 is 13 years old; no need to specifically refer to it as a requirement. gcc: PR target/69374 * doc/install.texi (Specific) <*-*-mingw32>: Remove note regarding binutils 2.16.
2024-09-26[match.pd] Handle abs pattern with convertKugan Vivekanandarajah3-21/+61
gcc/ChangeLog: * match.pd: Extend A CMP 0 ? A : -A into (type)A CMP 0 ? A : -A. Extend A CMP 0 ? A : -A into (type) A CMP 0 ? A : -A. gcc/testsuite/ChangeLog: * g++.dg/absvect.C: New test. * gcc.dg/tree-ssa/absfloat16.c: New test. Signed-off-by: Kugan Vivekanandarajah <kvivekananda@nvidia.com>
2024-09-26x86: Extend AVX512 Vectorization for Popcount in Various ModesLevy Hsu2-0/+73
This patch enables vectorization of the popcount operation for V2QI, V4QI, V8QI, V2HI, V4HI, and V2SI modes. gcc/ChangeLog: * config/i386/mmx.md: (VQI_16_32_64): New mode iterator for 8-byte, 4-byte, and 2-byte QImode. (popcount<mode>2): New pattern for popcount of V2QI/V4QI/V8QI mode. (popcount<mode>2): New pattern for popcount of V2HI/V4HI mode. (popcountv2si2): New pattern for popcount of V2SI mode. gcc/testsuite/ChangeLog: * gcc.target/i386/part-vect-popcount-1.c: New test.
2024-09-26Define VECTOR_STORE_FLAG_VALUEliuhongt2-1/+30
gcc/ChangeLog: * config/i386/i386.h (VECTOR_STORE_FLAG_VALUE): New macro. gcc/testsuite/ChangeLog: * gcc.dg/rtl/x86_64/vector_eq.c: New test.
2024-09-26testsuite: Fix testcase g++.dg/modules/indirect-1_b.C [PR116846]Nathaniel Shead1-5/+2
r15-3878 exposed a mistake in the testcase, probably from an older version of the dumping logic. Apart from the slightly different syntax for the dump line, also check for importing the type_decl rather than the const_decl (we need the type anyway and importing the type also brings along the enumerators so it would be unnecessary to seed an import for them as well). PR c++/116846 gcc/testsuite/ChangeLog: * g++.dg/modules/indirect-1_b.C: Fix testcase. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2024-09-26RISC-V: Add testcases for form 3 of signed vector SAT_ADDPan Li9-0/+126
Form 3: #define DEF_VEC_SAT_S_ADD_FMT_3(T, UT, MIN, MAX) \ void __attribute__((noinline)) \ vec_sat_s_add_##T##_fmt_3 (T *out, T *op_1, T *op_2, unsigned limit) \ { \ unsigned i; \ for (i = 0; i < limit; i++) \ { \ T x = op_1[i]; \ T y = op_2[i]; \ T sum; \ bool overflow = __builtin_add_overflow (x, y, &sum); \ out[i] = overflow ? x < 0 ? MIN : MAX : sum; \ } \ } DEF_VEC_SAT_S_ADD_FMT_3 (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/rvv/autovec/vec_sat_arith.h: Add test helper macros. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-10.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-11.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-12.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-9.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-10.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-11.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-12.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-9.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>