aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2024-10-24Record nonzero bits in the irange_bitmask of POLY_INT_CSTsRichard Sandiford2-0/+82
At the moment, ranger punts entirely on POLY_INT_CSTs. Numerical ranges are a bit difficult, unless we do start modelling bounds on the indeterminates. But we can at least track the nonzero bits. gcc/ * value-query.cc (range_query::get_tree_range): Use get_nonzero_bits to populate the irange_bitmask of a POLY_INT_CST. gcc/testsuite/ * gcc.target/aarch64/sve/cnt_fold_6.c: New test.
2024-10-24Try to simplify (X >> C1) * (C2 << C1) -> X * C2Richard Sandiford4-0/+139
This patch adds a rule to simplify (X >> C1) * (C2 << C1) -> X * C2 when the low C1 bits of X are known to be zero. As with the earlier X >> C1 << (C2 + C1) patch, any single conversion is allowed between the shift and the multiplication. gcc/ * match.pd: Simplify (X >> C1) * (C2 << C1) -> X * C2 if the low C1 bits of X are zero. gcc/testsuite/ * gcc.dg/tree-ssa/shifts-3.c: New test. * gcc.dg/tree-ssa/shifts-4.c: Likewise. * gcc.target/aarch64/sve/cnt_fold_5.c: Likewise.
2024-10-24Handle POLY_INT_CSTs in get_nonzero_bitsRichard Sandiford3-0/+66
This patch extends get_nonzero_bits to handle POLY_INT_CSTs, The easiest (but also most useful) case is that the number of trailing zeros in the runtime value is at least the number of trailing zeros in each individual component. In principle, we could do this for coeffs 1 and above only, and then OR in ceoff 0. This would give ~0x11 for [14, 32], say. But that's future work. gcc/ * tree-ssanames.cc (get_nonzero_bits): Handle POLY_INT_CSTs. * match.pd (with_possible_nonzero_bits): Likewise. gcc/testsuite/ * gcc.target/aarch64/sve/cnt_fold_4.c: New test.
2024-10-24Try to simplify (X >> C1) << (C1 + C2) -> X << C2Richard Sandiford3-0/+95
This patch adds a rule to simplify (X >> C1) << (C1 + C2) -> X << C2 when the low C1 bits of X are known to be zero. Any single conversion can take place between the shifts. E.g. for a truncating conversion, any extra bits of X that are preserved by truncating after the shift are immediately lost by the shift left. And the sign bits used for an extending conversion are the same as the sign bits used for the rshift. (A double conversion of say int->unsigned->uint64_t would be wrong though.) gcc/ * match.pd: Simplify (X >> C1) << (C1 + C2) -> X << C2 if the low C1 bits of X are zero. gcc/testsuite/ * gcc.dg/tree-ssa/shifts-1.c: New test. * gcc.dg/tree-ssa/shifts-2.c: Likewise.
2024-10-24Generalise ((X /[ex] A) +- B) * A -> X +- A * B ruleRichard Sandiford6-14/+194
match.pd had a rule to simplify ((X /[ex] A) +- B) * A -> X +- A * B when A and B are INTEGER_CSTs. This patch extends it to handle the case where the outer multiplication is by a factor of A, not just A itself. It also handles addition and multiplication of poly_ints. (Exact division by a poly_int seems unlikely.) gcc/ * match.pd: Generalise ((X /[ex] A) +- B) * A -> X +- A * B rule to ((X /[ex] C1) +- C2) * (C1 * C3) -> (X * C3) +- (C1 * C2 * C3). gcc/testsuite/ * gcc.dg/tree-ssa/mulexactdiv-5.c: New test. * gcc.dg/tree-ssa/mulexactdiv-6.c: Likewise. * gcc.dg/tree-ssa/mulexactdiv-7.c: Likewise. * gcc.dg/tree-ssa/mulexactdiv-8.c: Likewise. * gcc.target/aarch64/sve/cnt_fold_3.c: Likewise.
2024-10-24Simplify (X /[ex] C1) * (C1 * C2) -> X * C2Richard Sandiford7-0/+250
gcc/ * match.pd: Simplify (X /[ex] C1) * (C1 * C2) -> X * C2. gcc/testsuite/ * gcc.dg/tree-ssa/mulexactdiv-1.c: New test. * gcc.dg/tree-ssa/mulexactdiv-2.c: Likewise. * gcc.dg/tree-ssa/mulexactdiv-3.c: Likewise. * gcc.dg/tree-ssa/mulexactdiv-4.c: Likewise. * gcc.target/aarch64/sve/cnt_fold_1.c: Likewise. * gcc.target/aarch64/sve/cnt_fold_2.c: Likewise.
2024-10-24Use get_nonzero_bits to simplify trunc_div to exact_divRichard Sandiford2-0/+38
There are a limited number of existing rules that benefit from knowing that a division is exact. Later patches will add more. gcc/ * match.pd: Simplify X / (1 << C) to X /[ex] (1 << C) if the low C bits of X are clear gcc/testsuite/ * gcc.dg/tree-ssa/cmpexactdiv-6.c: New test.
2024-10-24Make more places handle exact_div like trunc_divRichard Sandiford4-30/+47
I tried to look for places where we were handling TRUNC_DIV_EXPR more favourably than EXACT_DIV_EXPR. Most of the places that I looked at but didn't change were handling div/mod pairs. But there's bound to be others I missed... gcc/ * match.pd: Extend some rules to handle exact_div like trunc_div. * tree.h (trunc_or_exact_div_p): New function. * tree-ssa-loop-niter.cc (is_rshift_by_1): Use it. * tree-ssa-loop-ivopts.cc (force_expr_to_var_cost): Handle EXACT_DIV_EXPR.
2024-10-24Implement pointer_or_operator.Andrew MacLeod2-53/+16
The class pointer_or is no longer used, and can be removed. Its functionality was never moved to the new dispatch system. This implements operator_bitwise_or::fold_range() for prange operands. * range-op-mixed.h (operator_bitwise_or::fold_range): Add prange variant. * range-op-ptr.cc (class pointer_or_operator): Remove. (pointer_or_operator::op1_range): Remove. (pointer_or_operator::op2_range): Remove. (pointer_or_operator::wi_fold): Remove. (operator_bitwise_or::fold_range): New prange variant.
2024-10-24Remove pointer_and_operator.Andrew MacLeod1-23/+0
This operator class predates the dispatch system, and is no longer used. The functionality of wi_fold has been replaced by operator_bitwise_and::fold_range with prange operaands. * range-op-ptr.cc (class pointer_and_operator): Remove. (pointer_and_operator::wi_fold): Remove.
2024-10-24Remove pointer_min_max_operator.Andrew MacLeod1-28/+0
The pointer_min_max_operator class was used before the current dispatch system was created. These operations have been transferred to operator_min::fold_range () and operator_max::fold_range () with prange operands. This class is no longer used for anything, delete it. * range-op-ptr.cc (class pointer_min_max_operator): Remove. (pointer_min_max_operator::wi_fold): Remove.
2024-10-24Cleanup pointer_plus_operator.Andrew MacLeod1-73/+1
The POINTER_PLUS operator still carries some remnamts of the old irange interface, which is now dead code with prange. * range-op-ptr.cc (pointer_plus_operator::wi_fold): Remove. (pointer_plus_operator::op2_range): Remove irange variant. (pointer_plus_operator::update_bitmask): Likewise.
2024-10-24c++: Further fix for get_member_function_from_ptrfunc [PR117259]Jakub Jelinek2-14/+30
The following testcase shows that the previous get_member_function_from_ptrfunc changes weren't sufficient and we still have cases where -fsanitize=undefined with pointers to member functions can cause wrong code being generated and related false positive warnings. The problem is that save_expr doesn't always create SAVE_EXPR, it can skip some invariant arithmetics and in the end it could be really large expressions which would be evaluated several times (and what is worse, with -fsanitize=undefined those expressions then can have SAVE_EXPRs added to their subparts for -fsanitize=bounds or -fsanitize=null or -fsanitize=alignment instrumentation). Tried to just build1 a SAVE_EXPR + add TREE_SIDE_EFFECTS instead of save_expr, but that doesn't work either, because cp_fold happily optimizes those SAVE_EXPRs away when it sees SAVE_EXPR operand is tree_invariant_p. So, the following patch instead of using save_expr or building SAVE_EXPR manually builds a TARGET_EXPR. Both types are pointers, so it doesn't need to be destroyed in any way, but TARGET_EXPR is what doesn't get optimized away immediately. 2024-10-24 Jakub Jelinek <jakub@redhat.com> PR c++/117259 * typeck.cc (get_member_function_from_ptrfunc): Use force_target_expr rather than save_expr for instance_ptr and function. Don't call it for TREE_CONSTANT. * g++.dg/ubsan/pr117259.C: New test.
2024-10-24asan: Fix up build_check_stmt gsi handling [PR117209]Jakub Jelinek2-9/+20
gsi_safe_insert_before properly updates gsi_bb in gimple_stmt_iterator in case it splits objects, but unfortunately build_check_stmt was in some places (but not others) using a copy of the iterator rather than the iterator passed from callers and so didn't propagate that to callers. I guess it didn't matter much before when it was just using gsi_insert_before as that really didn't change the iterator. The !before_p case is apparently dead code, nothing is calling it with before_p=false since around 4.9. 2024-10-24 Jakub Jelinek <jakub@redhat.com> PR sanitizer/117209 * asan.cc (maybe_cast_to_ptrmode): Formatting fix. (build_check_stmt): Don't copy *iter into gsi, perform all the updates on iter directly. * gcc.dg/asan/pr117209.c: New test.
2024-10-24SVE intrinsics: Fold svsra with op1 all zeros to svlsr/svasr.Jennifer Schmitz5-0/+64
A common idiom in intrinsics loops is to have accumulator intrinsics in an unrolled loop with an accumulator initialized to zero at the beginning. Propagating the initial zero accumulator into the first iteration of the loop and simplifying the first accumulate instruction is a desirable transformation that we should teach GCC. Therefore, this patch folds svsra to svlsr/svasr if op1 is all zeros, producing the lower latency instructions LSR/ASR instead of USRA/SSRA. We implemented this optimization in svsra_impl::fold. Tests were added to check the produced assembly for use of LSR/ASR. The patch was bootstrapped and regtested on aarch64-linux-gnu, no regression. OK for mainline? Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com> gcc/ * config/aarch64/aarch64-sve-builtins-sve2.cc (svsra_impl::fold): Fold svsra to svlsr/svasr if op1 is all zeros. gcc/testsuite/ * gcc.target/aarch64/sve2/acle/asm/sra_s32.c: New test. * gcc.target/aarch64/sve2/acle/asm/sra_s64.c: Likewise. * gcc.target/aarch64/sve2/acle/asm/sra_u32.c: Likewise. * gcc.target/aarch64/sve2/acle/asm/sra_u64.c: Likewise.
2024-10-24SVE intrinsics: Fold constant operands for svlsl.Soumya AR3-2/+160
This patch implements constant folding for svlsl. Test cases have been added to check for the following cases: Zero, merge, and don't care predication. Shift by 0. Shift by register width. Overflow shift on signed and unsigned integers. Shift on a negative integer. Maximum possible shift, eg. shift by 7 on an 8-bit integer. The patch was bootstrapped and regtested on aarch64-linux-gnu, no regression. OK for mainline? Signed-off-by: Soumya AR <soumyaa@nvidia.com> gcc/ChangeLog: * config/aarch64/aarch64-sve-builtins-base.cc (svlsl_impl::fold): Try constant folding. * config/aarch64/aarch64-sve-builtins.cc (aarch64_const_binop): Return 0 if shift is out of range. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sve/const_fold_lsl_1.c: New test.
2024-10-24SVE intrinsics: Fold division and multiplication by -1 to negJennifer Schmitz8-28/+187
Because a neg instruction has lower latency and higher throughput than sdiv and mul, svdiv and svmul by -1 can be folded to svneg. For svdiv, this is already implemented on the RTL level; for svmul, the optimization was still missing. This patch implements folding to svneg for both operations using the gimple_folder. For svdiv, the transform is applied if the divisor is -1. Svmul is folded if either of the operands is -1. A case distinction of the predication is made to account for the fact that svneg_m has 3 arguments (argument 0 holds the values for the inactive lanes), while svneg_x and svneg_z have only 2 arguments. Tests were added or adjusted to check the produced assembly and runtime tests were added to check correctness. The patch was bootstrapped and regtested on aarch64-linux-gnu, no regression. OK for mainline? Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com> gcc/ * config/aarch64/aarch64-sve-builtins-base.cc (svdiv_impl::fold): Fold division by -1 to svneg. (svmul_impl::fold): Fold multiplication by -1 to svneg. gcc/testsuite/ * gcc.target/aarch64/sve/acle/asm/div_s32.c: New test. * gcc.target/aarch64/sve/acle/asm/mul_s16.c: Adjust expected outcome. * gcc.target/aarch64/sve/acle/asm/mul_s32.c: New test. * gcc.target/aarch64/sve/acle/asm/mul_s64.c: Adjust expected outcome. * gcc.target/aarch64/sve/acle/asm/mul_s8.c: Likewise. * gcc.target/aarch64/sve/div_const_run.c: New test. * gcc.target/aarch64/sve/mul_const_run.c: Likewise.
2024-10-24SVE intrinsics: Add constant folding for svindex.Jennifer Schmitz2-0/+49
This patch folds svindex with constant arguments into a vector series. We implemented this in svindex_impl::fold using the function build_vec_series. For example, svuint64_t f1 () { return svindex_u642 (10, 3); } compiled with -O2 -march=armv8.2-a+sve, is folded to {10, 13, 16, ...} in the gimple pass lower. This optimization benefits cases where svindex is used in combination with other gimple-level optimizations. For example, svuint64_t f2 () { return svmul_x (svptrue_b64 (), svindex_u64 (10, 3), 5); } has previously been compiled to f2: index z0.d, #10, #3 mul z0.d, z0.d, #5 ret Now, it is compiled to f2: mov x0, 50 index z0.d, x0, #15 ret We added test cases checking - the application of the transform during gimple for constant arguments, - the interaction with another gimple-level optimization. The patch was bootstrapped and regtested on aarch64-linux-gnu, no regression. OK for mainline? Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com> gcc/ * config/aarch64/aarch64-sve-builtins-base.cc (svindex_impl::fold): Add constant folding. gcc/testsuite/ * gcc.target/aarch64/sve/index_const_fold.c: New test.
2024-10-23[PATCH] RISC-V: override alignment of function/jump/loopWang Pengcheng1-0/+15
Just like what AArch64 has done. Signed-off-by: Wang Pengcheng <wangpengcheng.pp@bytedance.com> gcc/ChangeLog: * config/riscv/riscv.cc (struct riscv_tune_param): Add new tune options. (riscv_override_options_internal): Override the default alignment when not optimizing for size.
2024-10-23testsuite: Fix up pr116488.c and pr117226.c tests [PR116488]Jakub Jelinek2-2/+2
Hi! On Mon, Oct 21, 2024 at 01:39:52PM -0600, Jeff Law wrote: > * gcc.dg/torture/pr116488.c: New test. > * gcc.dg/torture/pr117226.c: New test. These two tests FAIL on powerpc64le-linux (and I assume on all other -funsigned-char defaulting targets). The following patch fixes that, tested on powerpc64le-linux and x86_64-linux (-m32/-m64); on x86_64 also tested before/after with -funsigned-char. Ok for trunk? 2024-10-22 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/116488 PR rtl-optimization/117226 * gcc.dg/torture/pr116488.c (c, e): Change type from char to signed char. * gcc.dg/torture/pr117226.c (main): Change f type from char to signed char.
2024-10-24RISC-V: Add testcases for form 4 of signed vector SAT_ADDPan Li9-0/+126
Form 4: #define DEF_VEC_SAT_S_ADD_FMT_4(T, UT, MIN, MAX) \ void __attribute__((noinline)) \ vec_sat_s_add_##T##_fmt_4 (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 ? sum : x < 0 ? MIN : MAX; \ } \ } DEF_VEC_SAT_S_ADD_FMT_4 (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-13.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-14.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-15.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-16.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-13.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-14.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-15.c: New test. * gcc.target/riscv/rvv/autovec/binop/vec_sat_s_add-run-16.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com> Signed-off-by: Pan Li <pan2.li@intel.com>
2024-10-24Daily bump.GCC Administrator5-1/+478
2024-10-23aarch64: Fix warning in aarch64_ptrue_regAndrew Pinski1-2/+2
After r15-4579-g9ffcf1f193b477, we get the following warning/error while bootstrapping on aarch64: ``` ../../gcc/gcc/config/aarch64/aarch64.cc: In function ‘rtx_def* aarch64_ptrue_reg(machine_mode, unsigned int)’: ../../gcc/gcc/config/aarch64/aarch64.cc:3643:21: error: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Werror=sign-compare] 3643 | for (int i = 0; i < vl; i++) | ~~^~~~ ``` This changes the type of i to unsigned to match the type of vl. Pushed as obvious after a bootstrap/test on aarch64-linux-gnu. gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_ptrue_reg): Fix type of induction variable i. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-23match: Reject non-const internal functions [PR117260]Andrew Pinski1-0/+5
When internal functions support was added to match (r6-4979-gc9e926ce2bdc8b), the check for ECF_CONST was the builtin function side. Though before r15-4503-g8d6d6d537fdc, there was no use of maybe_push_res_to_seq with non-const internal functions so the check would not make a difference. This adds the check for internal functions just as there is a check for builtins. Note I didn't add a testcase because there was no non-const internal function which could be used on x86_64 in a decent manor. Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: PR tree-optimization/117260 * gimple-match-exports.cc (maybe_push_res_to_seq): Reject non-const internal functions. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-10-23ginclude: stdalign.h should define __xxx_is_defined macros for C++Jonathan Wakely1-2/+4
The __alignas_is_defined macro has been required by C++ since C++11, and C++ Library DR 4036 clarified that __alignof_is_defined should be defined too. The whole <stdalign.h> header was deprecated for C++23 (see LWG 3827) and is likely to be removed for C++26 (see P3348), but we can deal with that later. The macros alignas and alignof should not be defined, as they're keywords in C++. gcc/ChangeLog: * ginclude/stdalign.h (__alignas_is_defined): Define for C++. (__alignof_is_defined): Likewise. libstdc++-v3/ChangeLog: * testsuite/18_support/headers/cstdalign/macros.cc: New test.
2024-10-23jit: reset state in varasm.cc [PR117275]David Malcolm3-0/+56
PR jit/117275 reports various jit test failures seen on powerpc64le-unknown-linux-gnu due to hitting this assertion in varasm.cc on the 2nd compilation in a process: #2 0x00007ffff63e67d0 in assemble_external_libcall (fun=0x7ffff2a4b1d8) at ../../src/gcc/varasm.cc:2650 2650 gcc_assert (!pending_assemble_externals_processed); (gdb) p pending_assemble_externals_processed $1 = true We're not properly resetting state in varasm.cc after a compile for libgccjit. Fixed thusly. gcc/ChangeLog: PR jit/117275 * toplev.cc (toplev::finalize): Call varasm_cc_finalize. * varasm.cc (varasm_cc_finalize): New. * varasm.h (varasm_cc_finalize): New decl. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-10-23aarch64: Improve scalar mode popcount expansion by using SVE [PR113860]Pengxuan Zheng8-11/+139
This is similar to the recent improvements to the Advanced SIMD popcount expansion by using SVE. We can utilize SVE to generate more efficient code for scalar mode popcount too. Changes since v1: * v2: Add a new VNx1BI mode and a new test case for V1DI. * v3: Abandon VNx1BI changes and add a new variant of aarch64_ptrue_reg. PR target/113860 gcc/ChangeLog: * config/aarch64/aarch64-protos.h (aarch64_ptrue_reg): New function. * config/aarch64/aarch64-simd.md (popcount<mode>2): Update pattern to also support V1DI mode. * config/aarch64/aarch64.cc (aarch64_ptrue_reg): New function. * config/aarch64/aarch64.md (popcount<mode>2): Add TARGET_SVE support. * config/aarch64/iterators.md (VDQHSD_V1DI): New mode iterator. (SVE_VDQ_I): Add V1DI. (bitsize): Likewise. (VPRED): Likewise. (VEC_POP_MODE): New mode attribute. (vec_pop_mode): Likewise. gcc/testsuite/ChangeLog: * gcc.target/aarch64/popcnt-sve.c: Update test. * gcc.target/aarch64/popcnt11.c: New test. * gcc.target/aarch64/popcnt12.c: New test. Signed-off-by: Pengxuan Zheng <quic_pzheng@quicinc.com>
2024-10-23Implement operator_pointer_diff::fold_rangeAndrew MacLeod2-17/+36
prange has no default fold_range processing like irange does, so each pointer specific operator needs to implement its own fold routine. PR tree-optimization/117222 gcc/ * range-op-ptr.cc (operator_pointer_diff::fold_range): New. (operator_pointer_diff::op1_op2_relation_effect): Remove irange variant. (operator_pointer_diff::update_bitmask): Likewise. gcc/testsuite * g++.dg/pr117222.C: New.
2024-10-23diagnostics: implement buffering for non-textual formats [PR105916]David Malcolm15-191/+1069
PR fortran/105916 reports stray diagnostics appearing in JSON and SARIF output from gfortran. In order to handle various awkard parsing issues, the Fortran frontend implements buffering of diagnostics, so that diagnostics reported to global_dc can be either: (a) immediately issued, or (b) speculatively reported to global_dc, and stored in a buffer, to either be issued later or discarded. This buffering code in gcc/fortran/error.cc directly manipulates implementation details of the diagnostic_context such as the pretty_printer's buffer, and the counts of how many diagnostics have been issued. The issue is that this manipulation of pretty_printer's buffer doesn't work for formats such as JSON and SARIF where diagnostics are handled in a different way (such as by accumulating json::object instances in an array). This patch moves responsibility for such buffering of diagnostics from fortran's error.cc to the diagnostic subsystem. It introduces a new class diagnostic_buffer representing a particular buffer of diagnostics that have been reported but not yet issued. Each diagnostic output format implements buffering in a different way, and so there is a new class hierarchy, diagnostic_per_format_buffer, representing the various format-specific ways that buffering is to be implemented. This is hidden as an implementation detail of diagnostic_buffer. The patch also updates how diagnostics of each kind (e.g. warnings vs errors) are counted, so that if buffering is enabled, the count is incremented within the buffer, and the counts in the diagnostic_context are only updated if and when the buffer is flushed; checking for max_errors is similarly updated to support both buffered and unbuffered cases. For ease of debugging, the patch extends the "dump" functions within the diagnostics subsystem, so that e.g. global_dc->dump () now prints the buffering status, e.g.: (gdb) call global_dc->dump() diagnostic_context: counts: (none) output format: sarif_output_format printer: m_show_color: false m_url_format: bel m_buffer: m_formatted_obstack current object: length 0: m_chunk_obstack current object: length 0: diagnostic buffer: m_per_format_buffer: counts: error: 1 diagnostic_sarif_format_buffer: result[0]: {"ruleId": "error", "level": "error", "message": {"text": "Function ‘program’ requires an argument list at (1)"}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "../../src/gcc/testsuite/gfortran.dg/pr105954.f90", "uriBaseId": "PWD"}, "region": {"startLine": 6, "startColumn": 8, "endColumn": 9}, "contextRegion": {"startLine": 6, "snippet": {"text": "program p\n"}}}}]} which shows that no diagnostics have been issued yet, but the active diagnostic_buffer has a single error buffered within it, in SARIF form. Similarly, it's possible to use "dump" on a diagnostic_buffer to directly query its contents; here's the same example, this time with the text output format: (gdb) call error_buffer.buffer.dump() m_per_format_buffer: counts: error: 1 diagnostic_text_format_buffer: m_formatted_obstack current object: length 232: 00000000: 1b 5b 30 31 6d 1b 5b 4b 2e 2e 2f 2e 2e 2f 73 72 | .[01m.[K../../sr 00000010: 63 2f 67 63 63 2f 74 65 73 74 73 75 69 74 65 2f | c/gcc/testsuite/ 00000020: 67 66 6f 72 74 72 61 6e 2e 64 67 2f 70 72 31 30 | gfortran.dg/pr10 00000030: 35 39 35 34 2e 66 39 30 3a 36 3a 38 3a 1b 5b 6d | 5954.f90:6:8:.[m 00000040: 1b 5b 4b 0a 0a 20 20 20 20 36 20 7c 20 70 72 6f | .[K.. 6 | pro 00000050: 67 72 61 6d 20 70 0a 20 20 20 20 20 20 7c 20 20 | gram p. | 00000060: 20 20 20 20 20 20 1b 5b 30 31 3b 33 31 6d 1b 5b | .[01;31m.[ 00000070: 4b 31 1b 5b 6d 1b 5b 4b 0a 1b 5b 30 31 3b 33 31 | K1.[m.[K..[01;31 00000080: 6d 1b 5b 4b 45 72 72 6f 72 3a 1b 5b 6d 1b 5b 4b | m.[KError:.[m.[K 00000090: 20 46 75 6e 63 74 69 6f 6e 20 e2 80 98 1b 5b 30 | Function ....[0 000000a0: 31 6d 1b 5b 4b 70 72 6f 67 72 61 6d 1b 5b 6d 1b | 1m.[Kprogram.[m. 000000b0: 5b 4b e2 80 99 20 72 65 71 75 69 72 65 73 20 61 | [K... requires a 000000c0: 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 | n argument list 000000d0: 61 74 20 1b 5b 30 31 3b 33 31 6d 1b 5b 4b 28 31 | at .[01;31m.[K(1 000000e0: 29 1b 5b 6d 1b 5b 4b 0a | ).[m.[K. m_chunk_obstack current object: length 0: showing that we have an error in error_buffer, with colorized text. gcc/ChangeLog: PR fortran/105916 * diagnostic-buffer.h: New file. * diagnostic-format-json.cc: Define INCLUDE_VECTOR. Include "diagnostic-buffer.h". (class diagnostic_json_format_buffer): New subclass. (class json_output_format): Add friend class diagnostic_json_format_buffer. (json_output_format::make_per_format_buffer): New vfunc implementation. (json_output_format::set_buffer): New vfunc implementation. (json_output_format::json_output_format): Initialize m_buffer. (json_output_format::m_buffer): New field. (diagnostic_json_format_buffer::dump): New. (diagnostic_json_format_buffer::empty_p): New. (diagnostic_json_format_buffer::move_to): New. (diagnostic_json_format_buffer::clear): New. (diagnostic_json_format_buffer::flush): New. (json_output_format::on_report_diagnostic): Implement optional buffering. * diagnostic-format-sarif.cc: Include "diagnostic-buffer.h". (class diagnostic_sarif_format_buffer): New subclass. (class sarif_builder): Add friend class diagnostic_sarif_format_buffer. (sarif_builder::num_results): New accessor. (sarif_builder::get_result): New accessor. (sarif_builder::on_report_diagnostic): Add param "buffer"; use it to implement optional buffering. (diagnostic_sarif_format_buffer::dump): New. (diagnostic_sarif_format_buffer::empty_p): New. (diagnostic_sarif_format_buffer::move_to): New. (diagnostic_sarif_format_buffer::clear): New. (diagnostic_sarif_format_buffer::flush): New. (sarif_output_format::make_per_format_buffer): New vfunc implementation. (sarif_output_format::set_buffer): New vfunc implementation. (sarif_output_format::on_report_diagnostic): Pass m_buffer to sarif_builder::on_report_diagnostic. (sarif_output_format::num_results): New accessor. (sarif_output_format::get_result): New accessor. (diagnostic_output_format::diagnostic_output_format): Initialize m_buffer. (diagnostic_output_format::m_buffer): New field. (diagnostic_output_format::num_results): Get accessor. (diagnostic_output_format::get_result): Get accessor. (selftest::get_message_from_result): New. (selftest::test_buffering): New. (selftest::diagnostic_format_sarif_cc_tests): Call it. * diagnostic-format-text.cc: Include "diagnostic-client-data-hooks.h". (class diagnostic_text_format_buffer): New subclass. (diagnostic_text_format_buffer::diagnostic_text_format_buffer): New. (diagnostic_text_format_buffer::dump): New. (diagnostic_text_format_buffer::empty_p): New. (diagnostic_text_format_buffer::move_to): New. (diagnostic_text_format_buffer::clear): New. (diagnostic_text_format_buffer::flush): New. (diagnostic_text_output_format::dump): Dump m_saved_output_buffer. (diagnostic_text_output_format::set_buffer): New. (diagnostic_text_output_format::make_per_format_buffer): New. * diagnostic-format-text.h (diagnostic_text_output_format::diagnostic_text_output_format): Initialize m_saved_output_buffer. (diagnostic_text_output_format::set_buffer): New decl. (diagnostic_text_output_format::make_per_format_buffer): New decl. (diagnostic_text_output_format::m_saved_output_buffer): New field. * diagnostic-format.h (class diagnostic_per_format_buffer): New forward decl. (diagnostic_output_format::make_per_format_buffer): New vfunc. (diagnostic_output_format::set_buffer): New vfunc. * diagnostic.cc: Include "diagnostic-buffer.h". (diagnostic_context::initialize): Replace memset with call to "clear" on m_diagnostic_counters. Initializer m_diagnostic_buffer. (diagnostic_context::finish): Call set_diagnostic_buffer with nullptr. (diagnostic_context::dump): Update for encapsulation of counts into m_diagnostic_counters. Dump m_diagnostic_buffer. (diagnostic_context::execution_failed_p): Update for encapsulation of counts into m_diagnostic_counters. (diagnostic_context::check_max_errors): Likewise. (diagnostic_context::report_diagnostic): Likewise. Eliminate diagnostic_check_max_errors in favor of check_max_errors. Update increment of counter to support buffering. Eliminate diagnostic_action_after_output in favor of action_after_output. Only add fixits to m_edit_context_ptr if buffering is disabled. Only call diagnostic_output_format::after_diagnostic if buffering is disabled. (diagnostic_context::error_recursion): Eliminate diagnostic_action_after_output in favor of action_after_output. (diagnostic_context::set_diagnostic_buffer): New. (diagnostic_context::clear_diagnostic_buffer): New. (diagnostic_context::flush_diagnostic_buffer): New. (diagnostic_counters::diagnostic_counters): New. (diagnostic_counters::dump): New. (diagnostic_counters::move_to): New. (diagnostic_counters::clear): New. (diagnostic_buffer::diagnostic_buffer): New. (diagnostic_buffer::~diagnostic_buffer): New. (diagnostic_buffer::dump): New. (diagnostic_buffer::empty_p): New. (diagnostic_buffer::move_to): New. (diagnostic_buffer::ensure_per_format_buffer): New. (c_diagnostic_cc_tests): Remove stray newline. * diagnostic.h (class diagnostic_buffer): New forward decl. (struct diagnostic_counters): New. (diagnostic_context::check_max_errors): Make private. (diagnostic_context::action_after_output): Make private. (diagnostic_context::get_output_format): Make non-const. (diagnostic_context::diagnostic_count): Update for change to m_diagnostic_counters. (diagnostic_context::set_diagnostic_buffer): New decl. (diagnostic_context::get_diagnostic_buffer): New decl. (diagnostic_context::clear_diagnostic_buffer): New decl. (diagnostic_context::flush_diagnostic_buffer): New decl. (diagnostic_context::m_diagnostic_count): Replace array with... (diagnostic_context::m_diagnostic_counters): ...this. (diagnostic_context::m_diagnostic_buffer): New field. (diagnostic_action_after_output): Delete. (diagnostic_check_max_errors): Delete. gcc/fortran/ChangeLog: PR fortran/105916 * error.cc (pp_error_buffer, pp_warning_buffer): Convert from output_buffer * to diagnostic_buffer *. (warningcount_buffered, werrorcount_buffered): Eliminate. (gfc_error_buffer::gfc_error_buffer): Move constructor definition here, and initialize "buffer" using *global_dc. (gfc_output_buffer_empty_p): Delete in favor of diagnostic_buffer::empty_p. (gfc_clear_pp_buffer): Replace with... (gfc_clear_diagnostic_buffer): ...this, moving implementation details to diagnostic_context::clear_diagnostic_buffer. (gfc_warning): Replace buffering implementation with calls to global_dc->get_diagnostic_buffer and global_dc->set_diagnostic_buffer. (gfc_clear_warning): Update for renaming of gfc_clear_pp_buffer and elimination of warningcount_buffered and werrorcount_buffered. (gfc_warning_check): Replace buffering implementation with calls to pp_warning_buffer->empty_p and global_dc->flush_diagnostic_buffer. (gfc_error_opt): Replace buffering implementation with calls to global_dc->get_diagnostic_buffer and set_diagnostic_buffer. (gfc_clear_error): Update for renaming of gfc_clear_pp_buffer. (gfc_error_flag_test): Replace call to gfc_output_buffer_empty_p with call to diagnostic_buffer::empty_p. (gfc_error_check): Replace buffering implementation with calls to pp_error_buffer->empty_p and global_dc->flush_diagnostic_buffer. (gfc_move_error_buffer_from_to): Replace buffering implementation with usage of diagnostic_buffer. (gfc_free_error): Update for renaming of gfc_clear_pp_buffer. (gfc_diagnostics_init): Use "new" directly when creating pp_warning_buffer. Remove setting of m_flush_p on the two buffers, as this is handled by diagnostic_buffer and by diagnostic_text_format_buffer's constructor. * gfortran.h: Replace #include "pretty-print.h" for output_buffer with #include "diagnostic-buffer.h" for diagnostic_buffer. (struct gfc_error_buffer): Change type of field "buffer" from output_buffer to diagnostic_buffer. Move definition of constructor into error.cc so that it can use global_dc. gcc/testsuite/ChangeLog: PR fortran/105916 * gcc.dg/plugin/diagnostic_plugin_xhtml_format.c: Include "diagnostic-buffer.h". (class diagnostic_xhtml_format_buffer): New subclass. (class xhtml_builder): Add friend class diagnostic_xhtml_format_buffer. (diagnostic_xhtml_format_buffer::dump): New. (diagnostic_xhtml_format_buffer::empty_p): New. (diagnostic_xhtml_format_buffer::move_to): New. (diagnostic_xhtml_format_buffer::clear): New. (diagnostic_xhtml_format_buffer::flush): New. (xhtml_builder::on_report_diagnostic): Add "buffer" param, and use it. (xhtml_output_format::dump): Fix typo. (xhtml_output_format::make_per_format_buffer): New. (xhtml_output_format::set_buffer): New. (xhtml_output_format::on_report_diagnostic): Fix whitespace. Pass m_buffer to xhtml_builder::on_report_diagnostic. (xhtml_output_format::xhtml_output_format): Initialize m_buffer. (xhtml_output_format::m_buffer): New field. * gfortran.dg/diagnostic-format-json-pr105916.F90: New test. * gfortran.dg/diagnostic-format-sarif-1.F90: New test. * gfortran.dg/diagnostic-format-sarif-1.py: New support script. * gfortran.dg/diagnostic-format-sarif-pr105916.f90: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2024-10-23Fortran: Generic processing of assumed rank objects (f202y) [PR116733]Paul Thomas22-65/+581
2024-10-23 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/116733 * array.cc : White space corrections. * expr.cc (gfc_check_pointer_assign): Permit assumed rank target with -std=f202y. Add constraints that the data pointer object must have rank remapping specified and the that the data target be contiguous. * gfortran.h : Add a gfc_array_ref field 'ar' to the structure 'gfc_association_list'. * interface.cc (gfc_compare_actual_formal): If -Wsurprising is set, emit a warning if an assumed size array is passed to an assumed rank dummy. * intrinsic.cc (do_ts29113_check): Permit an assumed rank arg. for reshape if -std=f202y and the argument is contiguous. * invoke.texi : Introduce -std=f202y. Whitespace errors. * lang.opt : Accept -std=f202y. * libgfortran.h : Define GFC_STD_F202Y. * match.cc (gfc_match_associate): If -std=f202y an assumed rank selector is allowed if it is contiguous and the associate name has rank remapping specified. * options.cc (gfc_init_options): -std=f202y is equivalent to -std=f2023 with experimental f202y features. White space issues * parse.cc (parse_associate): If the selector is assumed rank, use the 'ar' field of the association list to build an array specification. * primary.cc (gfc_match_varspec): Do not resolve the assumed rank selector of a class associate name at this stage to avoid the rank change. * resolve.cc (find_array_spec): If an array_ref dimension is -1 reset it with the rank in the object's array_spec. (gfc_expression_rank): Do not check dimen types for an assumed rank variable expression. (resolve_variable): Do not emit the assumed rank context error if the context is pointer assignment and the variable is a target. (resolve_assoc_var): Resolve the bounds and check for missing bounds in the rank remap of an associate name with an assumed rank selector. Do not correct the rank of an associate name with an assumed rank selector. (resolve_symbol): Allow the reference to an assumed rank object if -std-f202y is enabled and the current operation is EXEC_BLOCK. * st.cc (gfc_free_association_list): Free bounds expressions of the 'ar' field, if present. * trans-array.cc (gfc_conv_ss_startstride): If -std=f202y and bounds checking activated, do not apply the assertion. * trans-expr.cc (gfc_trans_pointer_assignment): An assumed rank target has its offset set to zero. * trans-stmt.cc (trans_associate_var): If the selector is assumed rank, call gfc_trans_pointer_assignment using the 'ar' field in the association list as the array reference for expr1. The data target, expr2, is a copy of the selector expression. gcc/testsuite/ PR fortran/116733 * gfortran.dg/associate_3.f03: Change error message. * gfortran.dg/f202y/f202y.exp: Enable tests of f202y features. * gfortran.dg/f202y/generic_assumed_rank_1.f90: New test. * gfortran.dg/f202y/generic_assumed_rank_2.f90: New test. * gfortran.dg/f202y/generic_assumed_rank_3.f90: New test.
2024-10-23AArch64: Remove redundant check in aarch64_simd_movWilco Dijkstra1-1/+0
The split condition in aarch64_simd_mov uses aarch64_simd_special_constant_p. While doing the split, it checks the mode before calling aarch64_maybe_generate_simd_constant. This risky since it may result in unexpectedly calling aarch64_split_simd_move instead of aarch64_maybe_generate_simd_constant. Since the mode is already checked, remove the spurious explicit mode check. gcc/ChangeLog: * config/aarch64/aarch64-simd.md (aarch64_simd_mov<VQMOV:mode>): Remove redundant mode check.
2024-10-23AArch64: Fix copysign patternsWilco Dijkstra6-31/+62
The current copysign pattern has a mismatch in the predicates and constraints - operand[2] is a register_operand but also has an alternative X which allows any operand. Since it is a floating point operation, having an integer alternative makes no sense. Change the expander to always use vector immediates which results in better code and sharing of immediates between copysign and xorsign. gcc/ChangeLog: * config/aarch64/aarch64.md (copysign<GPF:mode>3): Widen immediate to vector. (copysign<GPF:mode>3_insn): Use VQ_INT_EQUIV in operand 3. * config/aarch64/iterators.md (VQ_INT_EQUIV): New iterator. (vq_int_equiv): Likewise. gcc/testsuite/ChangeLog: * gcc.target/aarch64/copysign_3.c: New test. * gcc.target/aarch64/copysign_4.c: New test. * gcc.target/aarch64/fneg-abs_2.c: Fixup test. * gcc.target/aarch64/sve/fneg-abs_2.c: Likewise.
2024-10-23doc: remove obsolete deprecated infoJason Merrill1-10/+0
These formerly deprecated features eventually made it into the C++ standard. gcc/ChangeLog: * doc/extend.texi (Deprecated Features): Remove text about some no-longer-deprecated features.
2024-10-23AArch64: Add support for SIMD xor immediate (3/3)Wilco Dijkstra5-6/+70
Add support for SVE xor immediate when generating AdvSIMD code and SVE is available. gcc/ChangeLog: * config/aarch64/aarch64.cc (enum simd_immediate_check): Add AARCH64_CHECK_XOR. (aarch64_simd_valid_xor_imm): New function. (aarch64_output_simd_imm): Add AARCH64_CHECK_XOR support. (aarch64_output_simd_xor_imm): New function. * config/aarch64/aarch64-protos.h (aarch64_output_simd_xor_imm): New prototype. (aarch64_simd_valid_xor_imm): New prototype. * config/aarch64/aarch64-simd.md (xor<mode>3<vczle><vczbe>): Use aarch64_reg_or_xor_imm predicate and add an immediate alternative. * config/aarch64/predicates.md (aarch64_reg_or_xor_imm): Add new predicate. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sve/simd_imm.c: New test.
2024-10-23AArch64: Improve SIMD immediate generation (2/3)Wilco Dijkstra8-28/+85
Allow use of SVE immediates when generating AdvSIMD code and SVE is available. First check for a valid AdvSIMD immediate, and if SVE is available, try using an SVE move or bitmask immediate. gcc/ChangeLog: * config/aarch64/aarch64-simd.md (ior<mode>3<vczle><vczbe>): Use aarch64_reg_or_orr_imm predicate. Combine SVE/AdvSIMD immediates and use aarch64_output_simd_orr_imm. * config/aarch64/aarch64.cc (struct simd_immediate_info): Add SVE_MOV. (aarch64_sve_valid_immediate): Use SVE_MOV for SVE move immediates. (aarch64_simd_valid_imm): Enable SVE SIMD immediates when possible. (aarch64_output_simd_imm): Support emitting SVE SIMD immediates. * config/aarch64/predicates.md (aarch64_orr_imm_sve_advsimd): Remove. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sve/acle/asm/insr_s64.c: Allow SVE MOV imm. * gcc.target/aarch64/sve/acle/asm/insr_u64.c: Likewise. * gcc.target/aarch64/sve/fneg-abs_1.c: Update to check for ORRI. * gcc.target/aarch64/sve/fneg-abs_2.c: Likewise. * gcc.target/aarch64/sve/simd_imm_mov.c: New test.
2024-10-23AArch64: Improve SIMD immediate generation (1/3)Wilco Dijkstra5-76/+118
Cleanup the various interfaces related to SIMD immediate generation. Introduce new functions that make it clear which operation (AND, OR, MOV) we are testing for rather than guessing the final instruction. Reduce the use of overly long names, unused and default parameters for clarity. No changes to internals or generated code. gcc/ChangeLog: * config/aarch64/aarch64-protos.h (enum simd_immediate_check): Move to aarch64.cc. (aarch64_output_simd_mov_immediate): Remove. (aarch64_output_simd_mov_imm): New prototype. (aarch64_output_simd_orr_imm): Likewise. (aarch64_output_simd_and_imm): Likewise. (aarch64_simd_valid_immediate): Remove. (aarch64_simd_valid_and_imm): New prototype. (aarch64_simd_valid_mov_imm): Likewise. (aarch64_simd_valid_orr_imm): Likewise. * config/aarch64/aarch64-simd.md: Use aarch64_output_simd_mov_imm. * config/aarch64/aarch64.cc (enum simd_immediate_check): Moved from aarch64-protos.h. Use AARCH64_CHECK_AND rather than AARCH64_CHECk_BIC. (aarch64_expand_sve_const_vector): Use aarch64_simd_valid_mov_imm. (aarch64_expand_mov_immediate): Likewise. (aarch64_can_const_movi_rtx_p): Likewise. (aarch64_secondary_reload): Likewise. (aarch64_legitimate_constant_p): Likewise. (aarch64_advsimd_valid_immediate): Simplify checks on 'which' param. (aarch64_sve_valid_immediate): Add extra param for move vs logical. (aarch64_simd_valid_immediate): Rename to aarch64_simd_valid_imm. (aarch64_simd_valid_mov_imm): New function. (aarch64_simd_valid_orr_imm): Likewise. (aarch64_simd_valid_and_imm): Likewise. (aarch64_mov_operand_p): Use aarch64_simd_valid_mov_imm. (aarch64_simd_scalar_immediate_valid_for_move): Likewise. (aarch64_simd_make_constant): Likewise. (aarch64_expand_vector_init_fallback): Likewise. (aarch64_output_simd_mov_immediate): Rename to aarch64_output_simd_imm. (aarch64_output_simd_orr_imm): New function. (aarch64_output_simd_and_imm): Likewise. (aarch64_output_simd_mov_imm): Likewise. (aarch64_output_scalar_simd_mov_immediate): Use aarch64_output_simd_mov_imm. (aarch64_output_sve_mov_immediate): Use aarch64_simd_valid_imm. (aarch64_output_sve_ptrues): Likewise. * config/aarch64/constraints.md (Do): Use aarch64_simd_valid_orr_imm. (Db): Use aarch64_simd_valid_and_imm. * config/aarch64/predicates.md (aarch64_reg_or_bic_imm): Use aarch64_simd_valid_orr_imm. (aarch64_reg_or_and_imm): Use aarch64_simd_valid_and_imm.
2024-10-23Fix ICE due to isa mismatch for the builtins.liuhongt3-8/+28
gcc/ChangeLog: PR target/117240 * config/i386/i386-builtin.def: Add avx/avx512f to vaes ymm/zmm builtins. gcc/testsuite/ChangeLog: * gcc.target/i386/pr117240_avx.c: New test. * gcc.target/i386/pr117240_avx512f.c: New test.
2024-10-23Fortran: Minor follow-up cleanup to error.ccTobias Burnus1-12/+0
Follow up to r15-4268-g459c6018d2308d, which removed dead code, but missing that terminal_width was only set but not used. gcc/fortran/ChangeLog: * error.cc (terminal_width, gfc_get_terminal_width): Remove. (gfc_error_init_1): Do not call one to set the other.
2024-10-23tree-sra: Avoid SRAing arguments to a function returning_twice (PR 117142)Martin Jambor2-0/+23
PR 117142 shows that the current SRA probably never worked reliably with arguments passed to a function returning twice, because it then creates statements before the call which however needs to be at the beginning of a basic block. While it should be possible to make at least the case of passing arguments by value work with SRA (the statements would need to be put just on the non-abnormal edges leading to the BB), this would mean large surgery of function sra_modify_expr and I guess the time would better be spent re-organizing the whole pass. gcc/ChangeLog: 2024-10-21 Martin Jambor <mjambor@suse.cz> PR tree-optimization/117142 * tree-sra.cc (build_access_from_call_arg): Disqualify any candidate passed to a function returning twice. gcc/testsuite/ChangeLog: 2024-10-21 Martin Jambor <mjambor@suse.cz> PR tree-optimization/117142 * gcc.dg/tree-ssa/pr117142.c: New test.
2024-10-23c-family: Regenerate c.opt.urlsJakub Jelinek1-0/+3
Forgot to regenerate urls after -Wleading-whitespace addition. 2024-10-23 Jakub Jelinek <jakub@redhat.com> * c.opt.urls: Regenerate.
2024-10-23libcpp: Add -Wleading-whitespace= warningJakub Jelinek7-1/+269
The following patch on top of the r15-4346 patch adds -Wleading-whitespace= warning option. This warning doesn't care how much one actually indents which line in the source (that is something that can't be easily done in the preprocessor without doing syntactic analysis), but just simple checks on what kind of whitespace is used in the indentation. I think it is still useful to get warnings about such issues early, while git diagnoses some of it in patches (e.g. the tab after space case), getting the warnings earlier might help avoiding such issues sooner. There are projects which ban use of tabs and require just spaces, others which require indentation just with horizontal tabs, and finally projects which want indentation with tabs for multiples of tabstop size followed by spaces (fewer than tabstop size), like GCC. For all 3 kinds the warning diagnoses indentation with '\v' or '\f' characters (unless line contains just whitespace), and for the last one also cases where a space in the indentation is followed by horizontal tab or where there are N or more consecutive spaces in the indentation (for -ftabstop=N). BTW, for additional testing I've enabled the warnings (without -Werror for them) in stage3. There are many warnings (both trailing and leading whitespace), some of them something that can be easily fixed in the headers or source files, but others with whitespace issues in generated sources, so if we enable the warnings, either we'd need to adjust the generators or disable the warnings in (some of the) generated files. 2024-10-23 Jakub Jelinek <jakub@redhat.com> libcpp/ * include/cpplib.h (struct cpp_options): Add cpp_warn_leading_whitespace and cpp_tabstop members. (enum cpp_warning_reason): Add CPP_W_LEADING_WHITESPACE. * internal.h (struct _cpp_line_note): Document new line note kinds. * init.cc (cpp_create_reader): Set cpp_tabstop to 8. * lex.cc (find_leading_whitespace_issues): New function. (_cpp_clean_line): Use it. (_cpp_process_line_notes): Handle 'L', 'S' and 'T' line notes. (lex_raw_string): Clear type on 'L', 'S' and 'T' line notes inside of raw string literals. gcc/ * doc/invoke.texi (Wleading-whitespace=): Document. gcc/c-family/ * c.opt (Wleading-whitespace=): New option. * c-opts.cc (c_common_post_options): Set cpp_opts->cpp_tabstop to global_dc->m_tabstop. gcc/testsuite/ * c-c++-common/cpp/Wleading-whitespace-1.c: New test. * c-c++-common/cpp/Wleading-whitespace-2.c: New test. * c-c++-common/cpp/Wleading-whitespace-3.c: New test. * c-c++-common/cpp/Wleading-whitespace-4.c: New test.
2024-10-22i386: Optimize EQ/NE comparison between avx512 kmask and -1.liuhongt3-0/+180
r15-974-gbf7745f887c765e06f2e75508f263debb60aeb2e has optimized for jcc/setcc, but missed movcc. The patch supports movcc. gcc/ChangeLog: PR target/117232 * config/i386/sse.md (*kortest_cmp<SWI1248_AVX512BWDQ_64:mode>_movqicc): New define_insn_and_split. (*kortest_cmp<SWI1248_AVX512BWDQ_64:mode>_mov<SWI248:mode>cc): Ditto. gcc/testsuite/ChangeLog: * gcc.target/i386/pr117232-1.c: New test. * gcc.target/i386/pr117232-apx-1.c: New test.
2024-10-23Daily bump.GCC Administrator6-1/+267
2024-10-23c: Restore "originally defined" struct redefinition messages for C23Joseph Myers3-3/+40
One failure with a -std=gnu23 default that indicates a quality-of-implementation regression in C23 mode is gcc.dg/pr39084.c, which loses the expected "originally defined here" message on struct redefinition errors (which occur in a different place in the front end for C23 because it is necessary to see the members of the struct to determine whether the redefinition is valid). That message seems a good thing to have both in and out of C23 mode, so add logic to restore it in the C23 case. Bootstrapped with no regressions for x86-64-pc-linux-gnu. gcc/c/ * c-decl.cc (c_struct_parse_info): Add member refloc. (start_struct): Store refloc in struct_parse_info. (finish_struct): Give "originally defined" message for C23 struct redefinition errors. gcc/testsuite/ * gcc.dg/gnu17-tag-1.c, gcc.dg/gnu23-tag-5.c: New tests.
2024-10-22c++: non-dep structured binding decltype again [PR117107]Jason Merrill2-2/+24
The patch for PR92687 handled the usual case of a decomp variable not being in the table, but missed the case of there being nothing in the table yet. PR c++/117107 PR c++/92687 gcc/cp/ChangeLog: * decl.cc (lookup_decomp_type): Handle null table. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/decomp10.C: New test.
2024-10-22c++: add testcase [PR116929]Jason Merrill1-0/+6
This testcase was fixed by r15-822-g0173dcce92baa6 . PR c++/116929 gcc/testsuite/ChangeLog: * g++.dg/modules/enum-14.C: New test.
2024-10-22c: Better fix for speed up compilation of large char array initializers when ↵Jakub Jelinek2-26/+35
not using #embed [PR117190] On Wed, Oct 16, 2024 at 11:09:32PM +0200, Jakub Jelinek wrote: > Apparently my > c: Speed up compilation of large char array initializers when not using #embed > patch broke building glibc. > > The issue is that when using CPP_EMBED, we are guaranteed by the > preprocessor that there is CPP_NUMBER CPP_COMMA before it and > CPP_COMMA CPP_NUMBER after it (or CPP_COMMA CPP_EMBED), so RAW_DATA_CST > never ends up at the end of arrays of unknown length. > Now, the c_parser_initval optimization attempted to preserve that property > rather than changing everything that e.g. inferes array number of elements > from the initializer etc. to deal with RAW_DATA_CST at the end, but > it didn't take into account the possibility that there could be > CPP_COMMA followed by CPP_CLOSE_BRACE (where the CPP_COMMA is redundant). > > As we are peaking already at 4 tokens in that code, peeking more would > require using raw tokens and that seems to be expensive doing it for > every pair of tokens due to vec_free done when we are out of raw tokens. Sorry for rushing the previous patch too much, turns out I was wrong, given that the c_parser_peek_nth_token numbering is 1 based, we can peek also with c_parser_peek_nth_token (parser, 4) and the loop actually peeked just at 3 tokens, not 4. So, I think it is better to revert the previous patch (but keep the new test) and instead peek the 4th non-raw token, which is what the following patch does. Additionally, PR117190 shows one further spot which missed the peek of the token after CPP_COMMA, in case it is incomplete array with exactly 65 elements with redundant comma after it, which this patch handles too. 2024-10-22 Jakub Jelinek <jakub@redhat.com> PR c/117190 gcc/c/ * c-parser.cc (c_parser_initval): Revert 2024-10-17 changes. Instead peek the 4th token and if it is not CPP_NUMBER, handle it like 3rd token CPP_CLOSE_BRACE for orig_len == INT_MAX. Also, check (2 + 2 * i)th raw token for the orig_len == INT_MAX case and punt if it is not CPP_NUMBER. gcc/testsuite/ * c-c++-common/init-5.c: New test.
2024-10-22c-family: Fix up -Wsizeof-pointer-memaccess ICEs [PR117230]Jakub Jelinek2-8/+41
In the following testcases, we ICE on all 4 function calls. The problem is using TYPE_PRECISION on vector types (but guess it would be similarly problematic on structures/unions/arrays). The test only differentiates between suggestion what to do, whether to supply explicit size because sizeof (*p) for {,{,un}signed }char *p is not very likely what the user want, or dereferencing the pointer, so I think limiting that suggestion to integral types is ok. 2024-10-22 Jakub Jelinek <jakub@redhat.com> PR c/117230 * c-warn.cc (sizeof_pointer_memaccess_warning): Only compare TYPE_PRECISION of TREE_TYPE (type) to precision of char if TREE_TYPE (type) is integral type. * c-c++-common/Wsizeof-pointer-memaccess5.c: New test.
2024-10-22varasm: Handle RAW_DATA_CST in compare_constant [PR117199]Jakub Jelinek2-1/+51
On the following testcase without LTO we unnecessarily don't merge two identical .LC* constants (constant hashing computes the same hash, but as compare_constant returned false for the RAW_DATA_CST in it, it never compares equal), and with LTO fails to link because LTO assumes such constants have to be merged and so doesn't emit the other constant. 2024-10-22 Jakub Jelinek <jakub@redhat.com> PR middle-end/117199 * varasm.cc (compare_constant): Handle RAW_DATA_CST. Formatting fix in the STRING_CST case. * gcc.dg/lto/pr117199_0.c: New test.
2024-10-22varasm: Fix up RAW_DATA_CST handling in array_size_for_constructor [PR117190]Jakub Jelinek1-1/+1
CONSTRUCTOR indices for arrays have bitsize type, and the r15-4375 patch actually got it right in 6 other spots, but not in this function, where it used size_int rather than bitsize_int and so size_binop can ICE on type mismatch. This is covered by the init-5.c testcase I've just posted, though the ICE goes away when the C FE is fixed (and when it is not, there is another ICE). 2024-10-22 Jakub Jelinek <jakub@redhat.com> PR c/117190 * varasm.cc (array_size_for_constructor): For RAW_DATA_CST, use bitsize_int rather than size_int.