aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2022-04-26reassoc: Don't call fold_convert if !fold_convertible_p [PR105374]Jakub Jelinek1-1/+5
As mentioned in the PR, we ICE because maybe_fold_*_comparisons returns an expression with V4SImode type and we try to fold_convert it to V4BImode, which isn't allowed. IMHO no matter whether we change maybe_fold_*_comparisons we should play safe on the reassoc side and punt if we can't convert like we punt for many other reasons. This fixes the testcase on ARM. Testcase not included, not exactly sure where and what directives it should have in gcc.target/arm/ testsuite. Christophe, do you think you could handle that incrementally? 2022-04-26 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/105374 * tree-ssa-reassoc.cc (eliminate_redundant_comparison): Punt if !fold_convertible_p rather than assuming fold_convert must succeed.
2022-04-26testsuite: Fix up g++.target/i386/vec-tmpl1.C testcase [PR65211]Jakub Jelinek1-0/+1
This test fails on i686-linux: Excess errors: .../gcc/testsuite/g++.target/i386/vec-tmpl1.C:13:27: warning: SSE vector return without SSE enabled changes the ABI [-Wpsabi] 2022-04-26 Jakub Jelinek <jakub@redhat.com> PR c++/65211 * g++.target/i386/vec-tmpl1.C: Add -Wno-psabi as dg-additional-options.
2022-04-26i386: Fix up ICE with -mveclibabi={acml,svml} [PR105367]Jakub Jelinek2-2/+16
The following testcase ICEs, because conversion between scalar float types which have the same mode are useless in GIMPLE, but for mathfn_built_in the exact type matters (it treats say double and _Float64 or float and _Float32 differently, using different suffixes and for the _Float* sometimes returning NULL when float/double do have a builtin). In ix86_veclibabi_{svml,acml} we are using mathfn_built_in just so that we don't have to translate the combined_fn and SFmode vs. DFmode into strings ourselfs, and we already earlier punt on anything but SFmode and DFmode. So, this patch just uses the double or float types depending on the modes, rather than the types we actually got and which might be _Float64 or _Float32 etc. 2022-04-26 Jakub Jelinek <jakub@redhat.com> PR target/105367 * config/i386/i386.cc (ix86_veclibabi_svml, ix86_veclibabi_acml): Pass el_mode == DFmode ? double_type_node : float_type_node instead of TREE_TYPE (type_in) as first arguments to mathfn_built_in. * gcc.target/i386/pr105367.c: New test.
2022-04-26testsuite: Improve unlimited_polymorphic_3.f03 [PR103662]Jakub Jelinek2-3/+5
On Mon, Apr 25, 2022 at 01:38:25PM +0200, Mikael Morin wrote: > I have just pushed the attached fix for two UNRESOLVED checks at -O0 that I > hadn’t seen. I don't like forcing of DSE in -O0 compilation, wouldn't it be better to just not check the dse dump at -O0 like in the following patch? Even better would be to check that the z._data = stores are both present in *.optimized dump, but that doesn't really work at -O2 or above because we inline the functions and optimize it completely away (both the stores and corresponding reads). The first hunk is needed so that __OPTIMIZE__ effective target works in Fortran testsuite, otherwise one gets a pedantic error and __OPTIMIZE__ is considered not to match at all. 2022-04-26 Jakub Jelinek <jakub@redhat.com> PR fortran/103662 * lib/target-supports.exp (check_effective_target___OPTIMIZE__): Add a var definition to avoid pedwarn about empty translation unit. * gfortran.dg/unlimited_polymorphic_3.f03: Remove -ftree-dse from dg-additional-options, guard scan-tree-dump-not directives on __OPTIMIZE__ target.
2022-04-26libgomp: Fix up two non-GOMP_USE_ALIGNED_WORK_SHARES related issues [PR105358]Jakub Jelinek4-7/+18
Last fall I've changed struct gomp_work_share, so that it doesn't have __attribute__((aligned (64))) lock member in the middle unless the target has non-emulated aligned allocator, otherwise it just makes sure the first and second halves are 64 bytes appart for cache line reasons, but doesn't make the struct 64-byte aligned itself and so we can use normal allocators for it. When the struct isn't 64-byte aligned, the amount of tail padding significantly decreases, to 0 or 4 bytes or so. The library uses that tail padding when the ordered_teams_ids array (array of uints) and/or the memory for lastprivate conditional temporaries (the latter wants to guarantee long long alignment). The problem with it on ia32 darwin9 is that while the struct contains long long members, long long is just 4 byte aligned while __alignof__(long long) is 8. That causes problems in gomp_init_work_share, where we currently rely on if offsetof (struct gomp_work_share, inline_ordered_team_ids) is long long aligned, then that tail array will be aligned at runtime and so no extra memory for dynamic realignment will be needed (that is false when the whole struct doesn't have long long alignment). And also in the remaining hunks causes another problem, where we compute INLINE_ORDERED_TEAM_IDS_OFF as the above offsetof aligned up to long long boundary and subtract sizeof (struct gomp_work_share) and INLINE_ORDERED_TEAM_IDS_OFF. When unlucky, the former isn't multiple of 8 and the latter is 4 bigger than that and as the subtraction is done in size_t, we end up with (size_t) -4, so the comparison doesn't really work. The fixes add additional conditions to make it work properly, but all of them should be evaluated at compile time when optimizing and so shouldn't slow anything. 2022-04-26 Jakub Jelinek <jakub@redhat.com> PR libgomp/105358 * work.c (gomp_init_work_share): Don't mask of adjustment for dynamic long long realignment if struct gomp_work_share has smaller alignof than long long. * loop.c (GOMP_loop_start): Don't use inline_ordered_team_ids if struct gomp_work_share has smaller alignof than long long or if sizeof (struct gomp_work_share) is smaller than INLINE_ORDERED_TEAM_IDS_OFF. * loop_ull.c (GOMP_loop_ull_start): Likewise. * sections.c (GOMP_sections2_start): Likewise.
2022-04-25c++: generic lambda fn parm pack [PR104624]Jason Merrill2-1/+18
Parameter packs from the enclosing context can be used unexpanded in a lambda that is itself part of a pack expansion, but not packs that are part of the lambda itself. We already check for capture packs; we also need to check for function parameter packs of the lambda call operator. PR c++/104624 gcc/cp/ChangeLog: * pt.cc (check_for_bare_parameter_packs): Check for lambda function parameter pack. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/lambda-generic-variadic22.C: New test.
2022-04-25c++: ICE with requires-expr and -Wsequence-point [PR105304]Patrick Palka2-1/+11
Here we're crashing from verify_sequence_points for this requires-expr condition because it contains a templated CAST_EXPR with empty operand, and verify_tree doesn't ignore this empty operand only because the manual tail recursion that it performs for unary expression trees skips the NULL test. PR c++/105304 gcc/c-family/ChangeLog: * c-common.cc (verify_tree) [restart]: Move up to before the NULL test. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-requires30.C: New test.
2022-04-25c++: partial ordering with dependent NTTP type [PR105289]Patrick Palka3-3/+27
Here ever since r11-6483-ge2e2f3f2c9400f we're rejecting and crashing on (respectively) two testcases that we used to accept in C++17 mode since r8-1437-g3da557ec145823. Both testcases declare a partial specialization of a primary template that has an NTTP with dependent type, and the validity of these partial specializations is unclear and the subject of PR86193 / CWG 455. So for now, this minimal patch just aims to fix the crash in the second testcase. During deduction, when checking whether the type of an NTTP uses still-undeduced parameters, we were incorrectly substituting into the previously substituted type instead of into its original type. In passing this patch also downgrades the "not more specialized" diagnostic from a permerror to a pedwarn. PR c++/105289 PR c++/86193 gcc/cp/ChangeLog: * pt.cc (process_partial_specialization): Downgrade "partial specialization isn't more specialized" diagnostic from permerror to an on-by-default pedwarn. (unify) <case TEMPLATE_PARM_INDEX>: When substituting into the NTTP type a second time, use the original type not the substituted type. gcc/testsuite/ChangeLog: * g++.dg/template/partial-specialization11.C: New test. * g++.dg/template/partial-specialization12.C: New test.
2022-04-26Daily bump.GCC Administrator9-1/+196
2022-04-25analyzer: fix ICEs on complex constants [PR105365,105366]David Malcolm3-9/+57
gcc/analyzer/ChangeLog: PR analyzer/105365 PR analyzer/105366 * svalue.cc (cmp_cst): Rename to... (cmp_csts_same_type): ...this. Convert all recursive calls to calls to... (cmp_csts_and_types): ....this new function. (svalue::cmp_ptr): Update for renaming of cmp_cst gcc/testsuite/ChangeLog: PR analyzer/105365 PR analyzer/105366 * gcc.dg/analyzer/pr105365.c: New test. * gcc.dg/analyzer/pr105366.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-25gimple-fold: fix further missing stmt locations [PR104308]David Malcolm2-1/+15
PR analyzer/104308 initially reported about a -Wanalyzer-use-of-uninitialized-value diagnostic using UNKNOWN_LOCATION when complaining about certain memmove operations where the source is uninitialized. In r12-7856-g875342766d4298 I fixed the missing location for a stmt generated by gimple_fold_builtin_memory_op, but the reporter then found another way to generate such a stmt with UNKNOWN_LOCATION. I've now gone through gimple_fold_builtin_memory_op looking at all statement creation, and found three places in which a new statement doesn't have a location set on it (either directly via gimple_set_location, or indirectly via gsi_replace), one of which is the new reproducer. This patch adds a gimple_set_location to these three cases, and adds test coverage for one of them (the third hunk within the patch), fixing the new reproducer for PR analyzer/104308. gcc/ChangeLog: PR analyzer/104308 * gimple-fold.cc (gimple_fold_builtin_memory_op): Explicitly set the location of new_stmt in all places that don't already set it, whether explicitly, or via a call to gsi_replace. gcc/testsuite/ChangeLog: PR analyzer/104308 * gcc.dg/analyzer/pr104308.c: Add test coverage. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-25fortran: Fix up gfc_trans_oacc_construct [PR104717]Jakub Jelinek4-3/+35
So that move_sese_region_to_fn works properly, OpenMP/OpenACC constructs for which that function is invoked need an extra artificial BIND_EXPR around their body so that we move all variables of the bodies. The C/C++ FEs do that both for OpenMP constructs like OMP_PARALLEL, OMP_TASK or OMP_TARGET and for OpenACC constructs that behave similarly to OMP_TARGET, but the Fortran FE only does that for OpenMP constructs. The following patch does that for OpenACC constructs too. PR fortran/104717 gcc/fortran/ * trans-openmp.cc (gfc_trans_oacc_construct): Wrap construct body in an extra BIND_EXPR. gcc/testsuite/ * gfortran.dg/goacc/pr104717.f90: New test. * gfortran.dg/goacc/privatization-1-compute-loop.f90: Adjust. libgomp/ * testsuite/libgomp.oacc-fortran/privatized-ref-2.f90: Adjust. Co-authored-by: Thomas Schwinge <thomas@codesourcery.com>
2022-04-25contrib: filter out a new Clang warningMartin Liska1-1/+2
Filter out: libcpp/lex.cc:1289:7: warning: use of the 'likely' attribute is a C++20 extension [-Wc++20-attribute-extensions] contrib/ChangeLog: * filter-clang-warnings.py: Filter out -Wc++20-attribute-extensions in lex.cc.
2022-04-25libstdc++: Implement constexpr std::unique_ptr for C++23 (P2273R3)Jonathan Wakely9-21/+466
libstdc++-v3/ChangeLog: * include/bits/ptr_traits.h (__cpp_lib_constexpr_memory): Define conditionally. * include/bits/unique_ptr.h (__cpp_lib_constexpr_memory): Define for C++23. (default_delete, default_delete<T[]>, __uniq_ptr_impl) (unique_ptr, unique_ptr<T[], D>): Add constexpr to all member functions. * include/std/version (__cpp_lib_constexpr_memory): Define new value for C++23. * testsuite/20_util/unique_ptr/assign/constexpr.cc: New test. * testsuite/20_util/unique_ptr/comparison/constexpr.cc: New test. * testsuite/20_util/unique_ptr/cons/constexpr_c++20.cc: New test. * testsuite/20_util/unique_ptr/creation/constexpr.cc: New test. * testsuite/20_util/unique_ptr/modifiers/constexpr.cc: New test. * testsuite/20_util/unique_ptr/specialized_algorithms/constexpr.cc: New test.
2022-04-25libstdc++: Add deduction guides for std::packaged_task [PR105375]Jonathan Wakely2-0/+96
This change was LWG 3117. The test is copied from 20_util/function/cons/deduction.cc libstdc++-v3/ChangeLog: PR libstdc++/105375 * include/std/future (packaged_task): Add deduction guides. * testsuite/30_threads/packaged_task/cons/deduction.cc: New test.
2022-04-25c++: __builtin_shufflevector with value-dep expr [PR105353]Marek Polacek2-1/+26
Here we issue an error from c_build_shufflevector while parsing a template because it got a TEMPLATE_PARM_INDEX, but this function expects INTEGER_CSTs (except the first two arguments). It checks if any of the arguments are type-dependent, if so, we leave the processing for later, but it should also check value-dependency for the 3rd+ arguments, so as to avoid the problem above. This is not a regression -- __builtin_shufflevector was introduced in GCC 12, but it looks safe enough. PR c++/105353 gcc/cp/ChangeLog: * typeck.cc (build_x_shufflevector): Use instantiation_dependent_expression_p except for the first two arguments. gcc/testsuite/ChangeLog: * g++.dg/ext/builtin-shufflevector-3.C: New test.
2022-04-25docs: Fix 'modff' reference in extend.texiPaul A. Clarke1-1/+1
In commit a2a919aa501e3 (2003), built-ins for modf and modff were added. In extend.texi, section "Other Builtins", "modf" was added to the paragraph "There are also built-in versions of the ISO C99 functions [...]" and "modf" was also added to the paragraph "The ISO C90 functions [...]". "modff" was not added to either paragraph. Based on the context clues about where "modfl" and other similar function pairs like "powf/powl" appear, I believe the reference to "modf" in the first paragraph (C99) should instead be "modff". 2022-04-25 Paul A. Clarke <pc@us.ibm.com> gcc * doc/extend.texi (Other Builtins): Correct reference to 'modff'.
2022-04-25Retain existing range knowledge when prefilling statements.Andrew MacLeod2-0/+22
When range_of_stmt was adjusted to avoid large recursion depth, we need to intersect the calculated range whth the any known range to avoid losing info. Range_of_stmt does this, but the new prefill code missed it. PR tree-optimization/105276 gcc/ * gimple-range.cc (gimple_ranger::prefill_stmt_dependencies): Include existing global range with calculated value. gcc/testsuite/ * g++.dg/pr105276.C: New.
2022-04-25contrib: filter out a new Clang warningMartin Liska1-1/+2
contrib/ChangeLog: * filter-clang-warnings.py: Filter out -Wbitwise-instead-of-logical.
2022-04-25libstdc++: Add pretty printer for std::initializer_listPhilipp Fent2-2/+28
Re-using the std::span printer, this now shows the contents of the initializer list instead of the pointer and length members. Signed-off-by: Philipp Fent <fent@in.tum.de> libstdc++-v3/ChangeLog: * python/libstdcxx/v6/printers.py (StdSpanPrinter._iterator): Rename as iterator. (StdInitializerListPrinter): Define new printer. (build_libstdcxx_dictionary): Register new printer. * testsuite/libstdc++-prettyprinters/cxx11.cc: Check printer for initializer_list.
2022-04-25testsuite: add additional option to force DSE execution [PR103662]Mikael Morin1-1/+1
This fixes a dump tree match check that is UNRESOLVED with the -O0 optimization option, as the optimization pass corresponding to the dump file is not run at -O0, and the dump is not generated. PR fortran/103662 gcc/testsuite/ChangeLog: * gfortran.dg/unlimited_polymorphic_3.f03: Force execution of the DSE optimization pass.
2022-04-25tree-optimization/105368 - avoid overflow in powi_costRichard Biener1-1/+1
The following avoids undefined signed overflow when computing the absolute of the exponent in powi_cost. 2022-04-25 Richard Biener <rguenther@suse.de> PR tree-optimization/105368 * tree-ssa-math-opts.cc (powi_cost): Use absu_hwi.
2022-04-25tree-optimization/100810 - avoid undefs in IVOPT rewritesRichard Biener3-0/+96
The following attempts to avoid IVOPTs rewriting uses using IV candidates that involve undefined behavior by using uninitialized SSA names. First we restrict the set of candidates we produce for such IVs to the original ones and mark them as not important. Second we try to only allow expressing uses with such IV if they originally use them. That is to avoid rewriting all such uses in terms of other IVs. Since cand->iv and use->iv seem to never exactly match up we resort to comparing the IV bases. The approach ends up similar to the one posted by Roger at https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578441.html but it marks IV candidates rather than use groups and the cases we allow in determine_group_iv_cost_generic are slightly different. 2022-01-04 Richard Biener <rguenther@suse.de> PR tree-optimization/100810 * tree-ssa-loop-ivopts.cc (struct iv_cand): Add involves_undefs flag. (find_ssa_undef): New function. (add_candidate_1): Avoid adding derived candidates with undefined SSA names and mark the original ones. (determine_group_iv_cost_generic): Reject rewriting uses with a different IV when that involves undefined SSA names. * gcc.dg/torture/pr100810.c: New testcase. * gcc.dg/torture/pr105337.c: Likewise.
2022-04-25target/89125 - BSD and math functionsSteve Kargl3-1/+16
Back story: When GCC is configured and built on non-glibc platforms, it seems very little to no effort is made to enumerate the available C99 libm functions. It is all or nothing for C99 libm. The patch introduces a new function, used on only FreeBSD, to inform gcc that it has C99 libm functions (minus a few which clearly GCC does not check nor test). 2022-04-15 Steven G. Kargl <kargl@gcc.gnu.org> PR target/89125 * config/freebsd.h: Define TARGET_LIBC_HAS_FUNCTION to be bsd_libc_has_function. * targhooks.cc (bsd_libc_has_function): New function. Expand the supported math functions to inclue C99 libm. * targhooks.h (bsd_libc_has_function): New Prototype.
2022-04-25rtl-optimization/105231 - distribute_notes and REG_EH_REGIONRichard Biener2-18/+78
The following mitigates a problem in combine distribute_notes which places an original REG_EH_REGION based on only may_trap_p which is good to test whether a non-call insn can possibly throw but not if actually it does or we care. That's something we decided at RTL expansion time where we possibly still know the insn evaluates to a constant. In fact, the REG_EH_REGION note with lp > 0 can only come from the original i3 and an assert is added to that effect. That means we only need to retain the note on i3 or, if that cannot trap, drop it but we should never move it to i2. The following places constraints on the insns to combine with non-call exceptions since we cannot handle the case where we have more than one EH side-effect in the IL. The patch also makes sure we can accumulate that on i3 and do not split a possible exception raising part of it to i2. As a special case we do not place any restriction on all externally throwing insns when there is no REG_EH_REGION present. 2022-04-22 Richard Biener <rguenther@suse.de> PR rtl-optimization/105231 * combine.cc (distribute_notes): Assert that a REG_EH_REGION with landing pad > 0 is from i3. Put any REG_EH_REGION note on i3 or drop it if the insn can not trap. (try_combine): Ensure that we can merge REG_EH_REGION notes with non-call exceptions. Ensure we are not splitting a trapping part of an insn with non-call exceptions when there is any REG_EH_REGION note to preserve. * gcc.dg/torture/pr105231.c: New testcase.
2022-04-25AVX512F: Add missing macro for mask(z?)_scalf_s[sd] [PR 105339]Hongyu Wang2-20/+60
Add missing macro under O0 and adjust macro format for scalf intrinsics. gcc/ChangeLog: PR target/105339 * config/i386/avx512fintrin.h (_mm512_scalef_round_pd): Add parentheses for parameters and djust format. (_mm512_mask_scalef_round_pd): Ditto. (_mm512_maskz_scalef_round_pd): Ditto. (_mm512_scalef_round_ps): Ditto. (_mm512_mask_scalef_round_ps): Ditto. (_mm512_maskz_scalef_round_ps): Ditto. (_mm_scalef_round_sd): Use _mm_undefined_pd. (_mm_scalef_round_ss): Use _mm_undefined_ps. (_mm_mask_scalef_round_sd): New macro. (_mm_mask_scalef_round_ss): Ditto. (_mm_maskz_scalef_round_sd): Ditto. (_mm_maskz_scalef_round_ss): Ditto. gcc/testsuite/ChangeLog: PR target/105339 * gcc.target/i386/sse-14.c: Add tests for new macro.
2022-04-25Daily bump.GCC Administrator3-1/+29
2022-04-24[committed] exec-stack warning for test which wants executable stacksJeff Law1-1/+1
gcc/testsuite * gcc.dg/lto/pr94157_0.c: Also request executable stack from the linker.
2022-04-24fortran: Detect duplicate unlimited polymorphic types [PR103662]Mikael Morin3-22/+58
This fixes a type-based alias analysis issue with unlimited polymorphic class descriptors (types behind class(*)) causing data initialisation to be removed by optimization. The fortran front-end may create multiple declarations for types, for example if a type is redeclared in each program unit it is used in. To avoid optimization seeing them as non-aliasing, a list of derived types is created at resolution time, and used at translation to set the same TYPE_CANONICAL type for each duplicate type declaration. This mechanism didn’t work for unlimited polymorphic descriptors types, as there is a short-circuit return skipping all the resolution handling for them, including the type registration. This change adds type registration at the short-circuit return, and updates type comparison to handle specifically unlimited polymorphic fake symbols, class descriptor types and virtual table types. The test, which exhibited mismatching dynamic types had to be fixed as well. PR fortran/103662 gcc/fortran/ChangeLog: * interface.cc (gfc_compare_derived_types): Support comparing unlimited polymorphic fake symbols. Recursively compare class descriptor types and virtual table types. * resolve.cc (resolve_fl_derived): Add type to the types list on unlimited polymorphic short-circuit return. gcc/testsuite/ChangeLog: * gfortran.dg/unlimited_polymorphic_3.f03 (foo): Separate bind(c) and sequence checks to... (foo_bc, foo_sq): ... two different procedures. (main, foo*): Change type declarations so that type name, component name, and either bind(c) or sequence attribute match between the main type declarations and the procedure type declarations. (toplevel): Add optimization dump checks. Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
2022-04-24Daily bump.GCC Administrator3-1/+13
2022-04-23i386: Improve ix86_expand_int_movcc [PR105338]Jakub Jelinek2-4/+47
The following testcase regressed on x86_64 on the trunk, due to some GIMPLE pass changes (r12-7687) we end up an *.optimized dump difference of: @@ -8,14 +8,14 @@ int foo (int i) <bb 2> [local count: 1073741824]: if (i_2(D) != 0) - goto <bb 4>; [35.00%] + goto <bb 3>; [35.00%] else - goto <bb 3>; [65.00%] + goto <bb 4>; [65.00%] - <bb 3> [local count: 697932184]: + <bb 3> [local count: 375809640]: <bb 4> [local count: 1073741824]: - # iftmp.0_1 = PHI <5(2), i_2(D)(3)> + # iftmp.0_1 = PHI <5(3), i_2(D)(2)> return iftmp.0_1; } and similarly for the other functions. That is functionally equivalent and there is no canonical form for those. The reason for i_2(D) in the PHI argument as opposed to 0 is the uncprop pass, that is in many cases beneficial for expansion as we don't need to load the value into some pseudo in one of the if blocks. Now, for the 11.x ordering we have the pseudo = i insn in the extended basic block (it comes first) and so forwprop1 undoes what uncprop does by propagating constant 0 there. But for the 12.x ordering, the extended basic block contains pseudo = 5 and pseudo = i is in the other bb and so fwprop1 doesn't change it. During the ce1 pass, we attempt to emit a conditional move and we have very nice code for the cases where both last operands of ?: are constant, and yet another for !TARGET_CMOVE if at least one of them is. The following patch will undo the uncprop behavior during ix86_expand_int_movcc, but just for those spots that can benefit from both or at least one operands being constant, leaving the pure cmov case as is (because then it is useful not to have to load a constant into a pseudo as it already is in one). We can do that in the op0 == op1 ? op0 : op3 or op0 != op1 ? op2 : op0 cases if op1 is a CONST_INT by pretending it is op0 == op1 ? op1 : op3 or op0 != op1 ? op2 : op1 2022-04-23 Jakub Jelinek <jakub@redhat.com> PR target/105338 * config/i386/i386-expand.cc (ix86_expand_int_movcc): Handle op0 == cst1 ? op0 : op3 like op0 == cst1 ? cst1 : op3 for the non-cmov cases. * gcc.target/i386/pr105338.c: New test.
2022-04-23Daily bump.GCC Administrator5-1/+93
2022-04-22libstdc++: Make atomic notify_one and notify_all non-constThomas W Rodgers3-14/+14
<recording this here for future reference> PR102994 "atomics: std::atomic<ptr>::wait is not marked const" raises the issue that the current libstdc++ implementation marks the notify members const, the implementation strategy used by libstdc++, as well as libc++ and the Microsoft STL, do not require the atomic to be mutable (it is hard to conceive of a desirable implementation approach that would require it). The original paper proposing the wait/notify functionality for atomics (p1185) also had these members marked const for the first three revisions, but that was changed without explanation in r3 and subsequent revisions of the paper. After raising the issue to the authors of p1185 and the author of the libc++ implementation, the consensus seems to be "meh, it's harmless" so there seems little appetite for an LWG issue to revisit the subject. This patch changes the libstdc++ implementation to be in agreement with the standard by removing const from those notify_one/notify_all members. libstdc++-v3/ChangeLog: PR libstdc++/102994 * include/bits/atomic_base.h (atomic_flag::notify_one, notify_all): Remove const qualification. (__atomic_base::notify_one, notify_all): Likewise. * include/std/atomic (atomic<bool>::notify_one, notify_all): Likewise. (atomic::notify_one, notify_all): Likewise. (atomic<T*>::notify_one, notify_all): Likewise. (atomic_notify_one, atomic_notify_all): Likewise. * testsuite/29_atomics/atomic/wait_notify/102994.cc: Adjust test to account for change in notify_one/notify_all signature.
2022-04-22fortran: Use pointer arithmetic to index arrays [PR102043]Mikael Morin10-15/+354
The code generated for array references used to be ARRAY_REF trees as could be expected. However, the middle-end may conclude from those trees that the indexes used are non-negative (more precisely not below the lower bound), which is a wrong assumption in the case of "reversed- order" arrays. The problematic arrays are those with a descriptor and having a negative stride for at least one dimension. The descriptor data points to the first element in array order (which is not the first in memory order in that case), and the negative stride(s) makes walking the array backwards (towards lower memory addresses), and we can access elements with negative index wrt data pointer. With this change, pointer arithmetic is generated by default for array references, unless we are in a case where negative indexes can’t happen (array descriptor’s dim element, substrings, explicit shape, allocatable, or assumed shape contiguous). A new flag is added to choose between array indexing and pointer arithmetic, and it’s set if the context can tell array indexing is safe (descriptor dim element, substring, temporary array), or a new method is called to decide on whether the flag should be set for one given array expression. PR fortran/102043 gcc/fortran/ChangeLog: * trans.h (gfc_build_array_ref): Add non_negative_offset argument. * trans.cc (gfc_build_array_ref): Ditto. Use pointer arithmetic if non_negative_offset is false. * trans-expr.cc (gfc_conv_substring): Set flag in the call to gfc_build_array_ref. * trans-array.cc (gfc_get_cfi_dim_item, gfc_conv_descriptor_dimension): Same. (build_array_ref): Decide on whether to set the flag and update the call. (gfc_conv_scalarized_array_ref): Same. New argument tmp_array. (gfc_conv_tmp_array_ref): Update call to gfc_conv_scalarized_ref. (non_negative_strides_array_p): New function. gcc/testsuite/ChangeLog: * gfortran.dg/array_reference_3.f90: New. * gfortran.dg/negative_stride_1.f90: New. * gfortran.dg/vector_subscript_8.f90: New. * gfortran.dg/vector_subscript_9.f90: New. * gfortran.dg/c_loc_test_22.f90: Update dump patterns. * gfortran.dg/finalize_10.f90: Same. Co-Authored-By: Richard Biener <rguenther@suse.de>
2022-04-22fortran: Generate an array temporary reference [PR102043]Mikael Morin1-1/+1
This avoids regressing on char_cast_1.f90 and char_cast_2.f90 later in the patch series when the code generation for array references is changed to use pointer arithmetic. The regressing testcases match part of an array reference in the generated tree dump and it’s not clear how the pattern should be rewritten to match the equivalent with pointer arithmetic. This change uses a method specific to array temporaries to generate array-references, so that these array references are flagged as safe for array indexing and will not be updated to use pointer arithmetic. PR fortran/102043 gcc/fortran/ChangeLog: * trans-array.cc (gfc_conv_expr_descriptor): Use gfc_conv_tmp_array_ref.
2022-04-22fortran: Update index extraction code. [PR102043]Mikael Morin1-11/+37
This avoids a regression on hollerith4.f90 and hollerith6.f90 later in the patch series when code generation for array references is changed to use pointer arithmetic. The problem comes from the extraction of the array index from an ARRAY_REF tree, which doesn’t work if the tree is not an ARRAY_REF any more. This updates the code generated for remaining size evaluation to work with a source tree that uses either array indexing or pointer arithmetic. PR fortran/102043 gcc/fortran/ChangeLog: * trans-io.cc: Add handling for the case where the array is referenced using pointer arithmetic.
2022-04-22fortran: Pre-evaluate string pointers. [PR102043]Mikael Morin2-1/+9
This avoids a regression on deferred_character_23.f90 later in the patch series when array references are rewritten to use pointer arithmetic. The problem is a SAVE_EXPR tree as TYPE_SIZE_UNIT of one array element type, which is used by the pointer arithmetic expressions. As these expressions appear in both branches of an if-then-else block, the tree is lowered to a variable in one of the branches but it’s used in both branches, which is invalid middle-end code. This change pre-evaluates the array references or pointer arithmetics to variables before the if-then-else block, so that the SAVE_EXPR are expanded to variables in the parent scope of the if-then-else block, and expressions referencing the variables remain valid in both branches. PR fortran/102043 gcc/fortran/ChangeLog: * trans-expr.cc: Pre-evaluate src and dest to variables before using them. gcc/testsuite/ChangeLog: * gfortran.dg/dependency_49.f90: Update variable occurence count.
2022-04-22rs6000: Fix pack for soft-float (PR105334)Segher Boessenkool1-2/+43
For PR103623 I fixed unpack, but pack is broken as well, as reported in PR105334. Fixing that is a bit more code, but it is pretty simple code nonetheless. 2022-04-22 Segher Boessenkool <segher@kernel.crashing.org> PR target/105334 * config/rs6000/rs6000.md (pack<mode> for FMOVE128): New expander. (pack<mode> for FMOVE128): Rename and split the insn_and_split to... (pack<mode>_hard for FMOVE128): ... this... (pack<mode>_soft for FMOVE128): ... and this.
2022-04-22docs: Correct "This functions" to "These functions"Paul A. Clarke1-1/+1
2022-04-22 Paul A. Clarke <pc@us.ibm.com> gcc * doc/extend.texi: Correct "This" to "These".
2022-04-22rtlanal: Fix up replace_rtx [PR105333]Jakub Jelinek2-2/+23
The following testcase FAILs, because replace_rtx replaces a REG with CONST_WIDE_INT inside of a SUBREG, which is an invalid transformation because a SUBREG relies on SUBREG_REG having non-VOIDmode but CONST_WIDE_INT has VOIDmode. replace_rtx already has code to deal with it, but it was doing it only for CONST_INTs. The following patch does it also for VOIDmode CONST_DOUBLE or CONST_WIDE_INT. 2022-04-22 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/105333 * rtlanal.cc (replace_rtx): Use simplify_subreg or simplify_unary_operation if CONST_SCALAR_INT_P rather than just CONST_INT_P. * gcc.dg/pr105333.c: New test.
2022-04-22Daily bump.GCC Administrator8-1/+106
2022-04-21rs6000/testsuite: xfail bswap-brw.cSegher Boessenkool1-1/+1
This testcase does not generate anywhere near optimal code for 32-bit code. For p10 it actually now fails this testcase, after the previous patch. Let's xfail it. 2022-04-21 Segher Boessenkool <segher@kernel.crashing.org> gcc/testsuite/ PR target/103197 PR target/102146 * gcc.target/powerpc/bswap-brw.c: Add xfail on scan-assembler for -m32.
2022-04-21rs6000: Disparage lfiwzx and similarSegher Boessenkool1-11/+11
RA now chooses GEN_OR_VSX_REGS in most cases. This is great in most cases, but we often (or always?) use {l,st}{f,xs}iwzx now, which is problematic because the integer load and store insns can use cheaper addressing modes. We can fix that by putting a small penalty on the instruction alternatives for those. 2022-04-21 Segher Boessenkool <segher@kernel.crashing.org> PR target/103197 PR target/102146 * config/rs6000/rs6000.md (zero_extendqi<mode>2 for EXTQI): Disparage the "Z" alternatives in {l,st}{f,xs}iwzx. (zero_extendhi<mode>2 for EXTHI): Ditto. (zero_extendsi<mode>2 for EXTSI): Ditto. (*movsi_internal1): Ditto. (*mov<mode>_internal1 for QHI): Ditto. (movsd_hardfloat): Ditto.
2022-04-21rs6000: Add effective target has_arch_ppc64Segher Boessenkool1-0/+10
This is true if we have -mpowerpc64. 2022-04-21 Segher Boessenkool <segher@kernel.crashing.org> gcc/testsuite/ * lib/target-supports.exp (check_effective_target_has_arch_ppc64): New.
2022-04-21d: Merge upstream dmd eb7bee331, druntime 27834edb, phobos ac296f80c.Iain Buclaw50-302/+1002
D front-end changes: - Import dmd v2.100.0-beta.1. - Print deprecation messages for scope violations unless `-frevert=dip1000' is used. - Fixed a missed case of switch case fallthrough not being caught by the compiler. D runtime changes: - Import druntime v2.100.0-beta.1. Phobos changes: - Import phobos v2.100.0-beta.1. gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd eb7bee331. * dmd/VERSION: Update version to v2.100.0-beta.1. * d-lang.cc (d_handle_option): Handle OPT_frevert_dip1000. * lang.opt (frevert=dip1000): New option. libphobos/ChangeLog: * libdruntime/MERGE: Merge upstream druntime 27834edb. * src/MERGE: Merge upstream phobos ac296f80c. * src/Makefile.am (PHOBOS_DSOURCES): Add std/int128.d. * src/Makefile.in: Regenerate.
2022-04-21libstdc++: Avoid ASCII assumptions in floating_from_chars.ccPatrick Palka2-17/+28
In starts_with_ci and in __floating_from_chars_hex's inf/nan handling, we were assuming that the letters are contiguous and that 'A' + 32 == 'a' which is true for ASCII but not for other character encodings. This patch fixes starts_with_ci by using a constexpr lookup table that maps uppercase letters to lowercase, and fixes __floating_from_chars_hex by using __from_chars_alnum_to_val. libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_alnum_to_val_table): Simplify initialization of __lower/__upper_letters. (__from_chars_alnum_to_val): Default the template parameter to false. * src/c++17/floating_from_chars.cc (starts_with_ci): Don't assume the uppercase and lowercase letters are contiguous. (__floating_from_chars_hex): Likewise.
2022-04-21c++: Remove unused parameterMarek Polacek1-3/+1
gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_logical_expression): Remove unused parameter. (cxx_eval_constant_expression) <case TRUTH_ANDIF_EXPR>, <case TRUTH_OR_EXPR>: Adjust calls to cxx_eval_logical_expression.
2022-04-21c++: wrong error with constexpr COMPOUND_EXPR [PR105321]Marek Polacek2-5/+22
Here we issue a bogus error for the first assert in the test. Therein we have <retval> = (void) (VIEW_CONVERT_EXPR<bool>(yes) || handle_error ());, VIEW_CONVERT_EXPR<int>(value); which has a COMPOUND_EXPR, so we get to cxx_eval_constant_expression <case COMPOUND_EXPR>. The problem here is that we call 7044 /* Check that the LHS is constant and then discard it. */ 7045 cxx_eval_constant_expression (ctx, op0, 7046 true, non_constant_p, overflow_p, 7047 jump_target); where lval is always true, so the PARM_DECL 'yes' is not evaluated into its value. Fixed by always passing false for 'lval' in cxx_eval_logical_expression; there's no case where we actually expect an lvalue from a TRUTH_*. PR c++/105321 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_logical_expression): Always pass false for lval to cxx_eval_constant_expression. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-105321.C: New test.
2022-04-21fortran: Fix conv of UNION constructors [PR105310]Fritz Reese2-2/+45
This fixes an ICE when a UNION is the (1+8*2^n)-th field in a DEC STRUCTURE when compiled with -finit-derived -finit-local-zero. The problem was CONSTRUCTOR_APPEND_ELT from within gfc_conv_union_initializer modified the vector pointer, but the pointer was passed by-value, so the old pointer from the caller (gfc_conv_structure) pointed to freed memory. PR fortran/105310 gcc/fortran/ChangeLog: * trans-expr.cc (gfc_conv_union_initializer): Pass vec* by reference. gcc/testsuite/ChangeLog: * gfortran.dg/dec_union_12.f90: New test.
2022-04-21libstdc++: Work around modules ICE in <charconv> [PR105297]Patrick Palka1-1/+3
This makes the initializer for __table in __from_chars_alnum_to_val dependent in an artificial way, which works around the reported modules testsuite ICE by preventing the compiler from evaluating the initializer parse time. Compared to the alternative workaround of using a non-local class type for __table, this workaround has the advantage of slightly speeding up compilation of <charconv>, since now the table won't get built (via constexpr evaluation) until the integer std::from_chars overload is instantiated. PR c++/105297 PR c++/105322 libstdc++-v3/ChangeLog: * include/std/charconv (__from_chars_alnum_to_val): Make initializer for __table dependent in an artificial way.