aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2023-12-17i386: Fix up signbit<mode>2 expander [PR112816]Jakub Jelinek2-1/+20
The following testcase ICEs, because the signbit<mode>2 expander uses an explicit SUBREG in the pattern around match_operand with register_operand predicate. If we are unlucky enough that expansion tries to expand it with some SUBREG as operands[1], we have two nested SUBREGs in the IL, which is not valid and causes ICE later. 2023-12-04 Jakub Jelinek <jakub@redhat.com> PR target/112816 * config/i386/sse.md (signbit<mode>2): Force operands[1] into a REG. * gcc.target/i386/sse2-pr112816.c: New test. (cherry picked from commit 994d6dc64435d6b7c50accca9941ee7decd92a22)
2023-12-17c++: #pragma GCC unroll C++ fixes [PR112795]Jakub Jelinek2-1/+24
foo in the unroll-5.C testcase ICEs because cp_parser_pragma_unroll during parsing calls maybe_constant_value unconditionally, which is fine if !processing_template_decl, but can ICE otherwise. While just calling fold_non_dependent_expr there instead could be enough to fix the ICE (and I guess the right thing to do for backports if any), I don't see a reason why we couldn't handle a dependent #pragma GCC unroll argument as well, the unrolling isn't done in the FE and all the middle-end cares about is that ANNOTATE_EXPR has a 1..65534 last operand when it is annot_expr_unroll_kind. So, the following patch changes all the unsigned short unroll arguments to tree unroll (and thus avoids the tree -> unsigned short -> tree conversions), does the type and value checking during parsing only if the argument isn't dependent and repeats it during instantiation. 2023-12-04 Jakub Jelinek <jakub@redhat.com> PR c++/112795 gcc/cp/ * parser.c (cp_parser_pragma_unroll): Use fold_non_dependent_expr instead of maybe_constant_value. gcc/testsuite/ * g++.dg/ext/unroll-5.C: New test. (cherry picked from commit b6c78feea08c36e5754818c6a3d7536b3f8913dc)
2023-12-17i386: Fix up *jcc_bt*_mask{,_1} [PR111408]Jakub Jelinek2-1/+28
The following testcase is miscompiled in GCC 14 because the *jcc_bt<mode>_mask and *jcc_bt<SWI48:mode>_mask_1 patterns have just one argument in (match_operator 0 "bt_comparison_operator" [...]) but as bt_comparison_operator is eq,ne, we need two. The md readers don't warn about it, after all, some checks can be done in the predicate rather than specified explicitly, and the behavior is that anything is accepted as the second argument. I went through all other i386.md match_operator uses and all others looked right (extract_operator using 3 operands, all others 2). I think we'll want to fix this at different spots in older releases because I think the bug was introduced already in 2008, though most likely just latent. 2023-11-25 Jakub Jelinek <jakub@redhat.com> PR target/111408 * config/i386/i386.md (*jcc_bt<mode>_mask): Add (const_int 0) as expected second operand of bt_comparison_operator. * gcc.c-torture/execute/pr111408.c: New test. (cherry picked from commit 9866c98e1015d98b8fc346d7cf73a0070cce5f69)
2023-12-17wide-int: Fix up wi::divmod_internal [PR110731]Jakub Jelinek2-2/+19
As the following testcase shows, wi::divmod_internal doesn't handle correctly signed division with precision > 64 when the dividend (and likely divisor as well) is the type's minimum and the precision isn't divisible by 64. A few lines above what the patch hunk changes is: /* Make the divisor and dividend positive and remember what we did. */ if (sgn == SIGNED) { if (wi::neg_p (dividend)) { neg_dividend = -dividend; dividend = neg_dividend; dividend_neg = true; } if (wi::neg_p (divisor)) { neg_divisor = -divisor; divisor = neg_divisor; divisor_neg = true; } } i.e. we negate negative dividend or divisor and remember those. But, after we do that, when unpacking those values into b_dividend and b_divisor we need to always treat the wide_ints as UNSIGNED, because divmod_internal_2 performs an unsigned division only. Now, if precision <= 64, we don't reach here at all, earlier code handles it. If dividend or divisor aren't the most negative values, the negation clears their most significant bit, so it doesn't really matter if we unpack SIGNED or UNSIGNED. And if precision is multiple of HOST_BITS_PER_WIDE_INT, there is no difference in behavior, while -0x80000000000000000000000000000000 negates to -0x80000000000000000000000000000000 the unpacking of it as SIGNED or UNSIGNED works the same. In the testcase, we have signed precision 119 and the dividend is val = { 0, 0xffc0000000000000 }, len = 2, precision = 119 both before and after negation. Divisor is val = { 2 }, len = 1, precision = 119 But we really want to divide 0x400000000000000000000000000000 by 2 unsigned and then negate at the end. If it is unsigned precision 119 division 0x400000000000000000000000000000 by 2 dividend is val = { 0, 0xffc0000000000000 }, len = 2, precision = 119 but as we unpack it UNSIGNED, it is unpacked into 0, 0, 0, 0x00400000 The following patch fixes it by always using UNSIGNED unpacking because we've already negated negative values at that point if sgn == SIGNED and so most negative constants should be treated as positive. 2023-07-19 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/110731 * wide-int.cc (wi::divmod_internal): Always unpack dividend and divisor as UNSIGNED regardless of sgn. * gcc.dg/pr110731.c: New test. (cherry picked from commit ece799607c841676f4e00c2fea98bbec6976da3f)
2023-12-17Daily bump.GCC Administrator1-1/+1
2023-12-16Daily bump.GCC Administrator3-1/+112
2023-12-15tree-optimization/111917 - bougs IL after guard hoistingRichard Biener2-4/+24
The unswitching code to hoist guards inserts conditions in wrong places. The following fixes this, simplifying code. PR tree-optimization/111917 * tree-ssa-loop-unswitch.c (hoist_guard): Always insert new conditional after last stmt. * gcc.dg/torture/pr111917.c: New testcase. (cherry picked from commit d96bd4aade170fcd86f5f09b68b770dde798e631)
2023-12-15tree-optimization/111614 - missing convert in undistribute_bitref_for_vectorRichard Biener2-12/+38
The following adjusts a flawed guard for converting the first vector of the sum we create in undistribute_bitref_for_vector. PR tree-optimization/111614 * tree-ssa-reassoc.c (undistribute_bitref_for_vector): Properly convert the first vector when required. * gcc.dg/torture/pr111614.c: New testcase. (cherry picked from commit 88d79b9b03eccf39921d13c2cbd1acc50aeda126)
2023-12-15tree-optimization/111764 - wrong reduction vectorizationRichard Biener2-12/+19
The following removes a misguided attempt to allow x + x in a reduction path, also allowing x * x which isn't valid. x + x actually never arrives this way but instead is canonicalized to 2 * x. This makes reduction path handling consistent with how we handle the single-stmt reduction case. PR tree-optimization/111764 * tree-vect-loop.c (check_reduction_path): Remove the attempt to allow x + x via special-casing of assigns. * gcc.dg/vect/pr111764.c: New testcase. (cherry picked from commit 05f98310b54da95e468d799f4a910174320cccbb)
2023-12-15middle-end/111818 - failed DECL_NOT_GIMPLE_REG_P setting of volatileRichard Biener2-6/+22
The following addresses a missed DECL_NOT_GIMPLE_REG_P setting of a volatile declared parameter which causes inlining to substitute a constant parameter into a context where its address is required. The main issue is in update_address_taken which clears DECL_NOT_GIMPLE_REG_P from the parameter but fails to rewrite it because is_gimple_reg returns false for volatiles. The following changes maybe_optimize_var to make the 1:1 correspondence between clearing DECL_NOT_GIMPLE_REG_P of a register typed decl and actually rewriting it to SSA. PR middle-end/111818 * tree-ssa.c (maybe_optimize_var): When clearing DECL_NOT_GIMPLE_REG_P always rewrite into SSA. * gcc.dg/torture/pr111818.c: New testcase. (cherry picked from commit ce55521bcd149fdc431f1d78e706b66d470210ae)
2023-12-15tree-optimization/110298 - CFG cleanup and stale nb_iterationsRichard Biener2-3/+24
When unrolling we eventually kill nb_iterations info since it may refer to removed SSA names. But we do this only after cleaning up the CFG which in turn can end up accessing it. Fixed by swapping the two. PR tree-optimization/110298 * tree-ssa-loop-ivcanon.c (tree_unroll_loops_completely): Clear number of iterations info before cleaning up the CFG. * gcc.dg/torture/pr110298.c: New testcase. (cherry picked from commit 916add3bf6e46467e4391e358b11ecfbc4daa275)
2023-12-15debug/110295 - mixed up early/late debug for member DIEsRichard Biener2-1/+21
When we process a scope typedef during early debug creation and we have already created a DIE for the type when the decl is TYPE_DECL_IS_STUB and this DIE is still in limbo we end up just re-parenting that type DIE instead of properly creating a DIE for the decl, eventually picking up the now completed type and creating DIEs for the members. Instead this is currently defered to the second time we come here, when we annotate the DIEs with locations late where now the type DIE is no longer in limbo and we fall through doing the job for the decl. The following makes sure we perform the necessary early tasks for this by continuing with the decl DIE creation after setting a parent for the limbo type DIE. PR debug/110295 * dwarf2out.c (process_scope_var): Continue processing the decl after setting a parent in case the existing DIE was in limbo. * g++.dg/debug/pr110295.C: New testcase. (cherry picked from commit 963f87f8a65ec82f503ac4334a3da83b0a8a43b2)
2023-12-15middle-end/110182 - TYPE_PRECISION on VECTOR_TYPE causes wrong-codeRichard Biener1-3/+3
When folding two conversions in a row we use TYPE_PRECISION but that's invalid for VECTOR_TYPE. The following fixes this by using element_precision instead. * match.pd (two conversions in a row): Use element_precision to DTRT for VECTOR_TYPE. (cherry picked from commit 3e12669a0eb968cfcbe9242b382fd8020935edf8)
2023-12-15Daily bump.GCC Administrator1-1/+1
2023-12-14Daily bump.GCC Administrator1-1/+1
2023-12-13Daily bump.GCC Administrator3-1/+21
2023-12-12Don't assume it's AVX_U128_CLEAN after call_insn whose ↵liuhongt3-3/+78
abi.mode_clobber(V4DImode) deosn't contains all SSE_REGS. If the function desn't clobber any sse registers or only clobber 128-bit part, then vzeroupper isn't issued before the function exit. the status not CLEAN but ANY after the function. Also for sibling_call, it's safe to issue an vzeroupper. Also there could be missing vzeroupper since there's no mode_exit for sibling_call_p. gcc/ChangeLog: PR target/112891 * config/i386/i386.c (ix86_avx_u128_mode_after): Return AVX_U128_ANY if callee_abi doesn't clobber all_sse_regs to align with ix86_avx_u128_mode_needed. (ix86_avx_u128_mode_needed): Return AVX_U128_ClEAN for sibling_call. gcc/testsuite/ChangeLog: * gcc.target/i386/pr112891.c: New test. * gcc.target/i386/pr112891-2.c: New test. (cherry picked from commit fc189a08f5b7ad5889bd4c6b320c1dd99dd5d642)
2023-12-12Daily bump.GCC Administrator1-1/+1
2023-12-11Daily bump.GCC Administrator1-1/+1
2023-12-10Daily bump.GCC Administrator1-1/+1
2023-12-09Daily bump.GCC Administrator1-1/+1
2023-12-08Daily bump.GCC Administrator1-1/+1
2023-12-07Daily bump.GCC Administrator1-1/+1
2023-12-06Daily bump.GCC Administrator1-1/+1
2023-12-05Daily bump.GCC Administrator1-1/+1
2023-12-04Daily bump.GCC Administrator1-1/+1
2023-12-03Daily bump.GCC Administrator1-1/+1
2023-12-02Daily bump.GCC Administrator3-1/+18
2023-12-01Fortran: avoid obsolescence warning for COMMON with submodule [PR111880]Harald Anlauf2-2/+24
gcc/fortran/ChangeLog: PR fortran/111880 * resolve.c (resolve_common_vars): Do not call gfc_add_in_common for symbols that are USE associated or used in a submodule. gcc/testsuite/ChangeLog: PR fortran/111880 * gfortran.dg/pr111880.f90: New test. (cherry picked from commit c9d029ba2ceb435e31492c1f3f0fd3edf0e386be)
2023-12-01Daily bump.GCC Administrator1-1/+1
2023-11-30Daily bump.GCC Administrator1-1/+1
2023-11-29Daily bump.GCC Administrator1-1/+1
2023-11-28Daily bump.GCC Administrator1-1/+1
2023-11-27Daily bump.GCC Administrator1-1/+1
2023-11-26Daily bump.GCC Administrator1-1/+1
2023-11-25Daily bump.GCC Administrator3-1/+18
2023-11-24i386: Wrong code with __builtin_parityl [PR112672]Uros Bizjak2-1/+26
gen_parityhi2_cmp instruction clobbers its input operand, so use a temporary register in the call to gen_parityhi2_cmp. PR target/112672 gcc/ChangeLog: * config/i386/i386.md (parityhi2): Use temporary register in the call to gen_parityhi2_cmp. gcc/testsuite/ChangeLog: * gcc.target/i386/pr112672.c: New test. (cherry picked from commit b2d17bdd45b582b93e89c00b04763a45f97d7a34)
2023-11-24Daily bump.GCC Administrator1-1/+1
2023-11-23Daily bump.GCC Administrator3-1/+18
2023-11-22PR target/111815: VAX: Only accept the index scaler as the RHS operand to ASHIFTMaciej W. Rozycki2-3/+32
As from commit 9df1ba9a35b8 ("libbacktrace: support zstd decompression") GCC for the `vax-netbsdelf' target fails to complete building, with an ICE: during RTL pass: final .../libbacktrace/elf.c: In function 'elf_zstd_decompress': .../libbacktrace/elf.c:5006:1: internal compiler error: in print_operand_address, at config/vax/vax.cc:514 5006 | } | ^ 0x1113df97 print_operand_address(_IO_FILE*, rtx_def*) .../gcc/config/vax/vax.cc:514 0x10c2489b default_print_operand_address(_IO_FILE*, machine_mode, rtx_def*) .../gcc/targhooks.cc:373 0x106ddd0b output_address(machine_mode, rtx_def*) .../gcc/final.cc:3648 0x106ddd0b output_asm_insn(char const*, rtx_def**) .../gcc/final.cc:3505 0x106e2143 output_asm_insn(char const*, rtx_def**) .../gcc/final.cc:3421 0x106e2143 final_scan_insn_1 .../gcc/final.cc:2841 0x106e28e3 final_scan_insn(rtx_insn*, _IO_FILE*, int, int, int*) .../gcc/final.cc:2887 0x106e2bf7 final_1 .../gcc/final.cc:1979 0x106e3c67 rest_of_handle_final .../gcc/final.cc:4240 0x106e3c67 execute .../gcc/final.cc:4318 Please submit a full bug report, with preprocessed source (by using -freport-bug). Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. This is due to combine producing an invalid address RTX: (plus:SI (ashift:SI (const_int 1 [0x1]) (reg:QI 3 %r3 [1232])) (reg/v:SI 10 %r10 [orig:736 weight_mask ] [736])) where the expression is ((1 << R3) + R10), which does not match a valid machine addressing mode. Consequently `print_operand_address' chokes. This can be reduced to the testcase included, where it triggers the same ICE in `p'. Preincrements are required so that their results land in registers and consequently an indexed addressing mode is tried or otherwise doing operations piecemeal on stack-based function arguments as direct input operands turns out more profitable in terms of RTX costs and the ICE is avoided. The ultimate cause has been commit c605a8bf9270 ("VAX: Accept ASHIFT in address expressions"), where a shift of an immediate value by a register has been mistakenly allowed as an index expression as if the shift operation was commutative such as multiplication is. So with ASHIFT the scaler in an index expression has to be the right-hand operand, and the backend has to enforce that, whereas with MULT the scaler can be either operand. Fix this by only accepting the index scaler as the RHS operand to ASHIFT. gcc/ PR target/111815 * config/vax/vax.c (index_term_p): Only accept the index scaler as the RHS operand to ASHIFT. gcc/testsuite/ PR target/111815 * gcc.dg/torture/pr111815.c: New test. (cherry picked from commit 56ff988e6be3fdba70cad86d73ec0038bc3b6b5a)
2023-11-22Daily bump.GCC Administrator1-1/+1
2023-11-21Daily bump.GCC Administrator1-1/+1
2023-11-20Daily bump.GCC Administrator1-1/+1
2023-11-19Daily bump.GCC Administrator1-1/+1
2023-11-18Daily bump.GCC Administrator1-1/+1
2023-11-17Daily bump.GCC Administrator1-1/+1
2023-11-16Daily bump.GCC Administrator1-1/+1
2023-11-15Daily bump.GCC Administrator1-1/+1
2023-11-14Daily bump.GCC Administrator1-1/+1
2023-11-10Daily bump.GCC Administrator1-1/+1