aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2022-07-16Daily bump.GCC Administrator11-1/+273
2022-07-15x86: Disable sibcall if indirect_return attribute doesn't matchH.J. Lu5-1/+53
When shadow stack is enabled, function with indirect_return attribute may return via indirect jump. In this case, we need to disable sibcall if caller doesn't have indirect_return attribute and indirect branch tracking is enabled since compiler won't generate ENDBR when calling the caller. gcc/ PR target/85620 * config/i386/i386.cc (ix86_function_ok_for_sibcall): Return false if callee has indirect_return attribute and caller doesn't. gcc/testsuite/ PR target/85620 * gcc.target/i386/pr85620-2.c: Updated. * gcc.target/i386/pr85620-5.c: New test. * gcc.target/i386/pr85620-6.c: Likewise. * gcc.target/i386/pr85620-7.c: Likewise.
2022-07-15PR target/106273: Add earlyclobber to *andn<dwi>3_doubleword_bmi on x86_64.Roger Sayle2-3/+30
This patch resolves PR target/106273 which is a wrong code regression caused by the recent reorganization to split doubleword operations after reload on x86. For the failing test case, the constraints on the andnti3_doubleword_bmi pattern allow reload to allocate the output and operand in overlapping but non-identical registers, i.e. (insn 45 44 66 2 (parallel [ (set (reg/v:TI 5 di [orig:96 i ] [96]) (and:TI (not:TI (reg:TI 39 r11 [orig:83 _2 ] [83])) (reg/v:TI 4 si [orig:100 i ] [100]))) (clobber (reg:CC 17 flags)) ]) "pr106273.c":13:5 562 {*andnti3_doubleword_bmi} where the output is in registers 5 and 6, and the second operand is registers 4 and 5, which then leads to the incorrect split: (insn 113 44 114 2 (parallel [ (set (reg:DI 5 di [orig:96 i ] [96]) (and:DI (not:DI (reg:DI 39 r11 [orig:83 _2 ] [83])) (reg:DI 4 si [orig:100 i ] [100]))) (clobber (reg:CC 17 flags)) ]) "pr106273.c":13:5 566 {*andndi_1} (insn 114 113 66 2 (parallel [ (set (reg:DI 6 bp [ i+8 ]) (and:DI (not:DI (reg:DI 40 r12 [ _2+8 ])) (reg:DI 5 di [ i+8 ]))) (clobber (reg:CC 17 flags)) ]) "pr106273.c":13:5 566 {*andndi_1} [Notice that reg:DI 5 is set in the first instruction, but assumed to have its original value in the second]. My first thought was that this could be fixed by swapping the order of the split instructions (which works in this case), but in the general case, it's impossible to handle (set (reg:TI x) (op (reg:TI x+1) (reg:TI x-1)). Hence for correctness this pattern needs an earlyclobber "=&r", but we can also allow cases where the output is the same as one of the operands (using constraint "0"). The other binary logic operations (AND, IOR, XOR) are unaffected as they constrain the output to match the first operand, but BMI's andn is a three-operand instruction which can lead to the overlapping cases described above. 2022-07-15 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR target/106273 * config/i386/i386.md (*andn<dwi>3_doubleword_bmi): Update the constraints to reflect the output is earlyclobber, unless it is the same register (pair) as one of the operands. gcc/testsuite/ChangeLog PR target/106273 * gcc.target/i386/pr106273.c: New test case.
2022-07-15Fortran: do not generate conflicting results under -ff2c [PR104313]Steve Kargl2-1/+12
gcc/fortran/ChangeLog: PR fortran/104313 * trans-decl.cc (gfc_generate_return): Do not generate conflicting fake results for functions with no result variable under -ff2c. gcc/testsuite/ChangeLog: PR fortran/104313 * gfortran.dg/pr104313.f: New test.
2022-07-15c++: Add __reference_con{struc,ver}ts_from_temporary [PR104477]Marek Polacek17-24/+744
This patch implements C++23 P2255R2, which adds two new type traits to detect reference binding to a temporary. They can be used to detect code like std::tuple<const std::string&> t("meow"); which is incorrect because it always creates a dangling reference, because the std::string temporary is created inside the selected constructor of std::tuple, and not outside it. There are two new compiler builtins, __reference_constructs_from_temporary and __reference_converts_from_temporary. The former is used to simulate direct- and the latter copy-initialization context. But I had a hard time finding a test where there's actually a difference. Under DR 2267, both of these are invalid: struct A { } a; struct B { explicit B(const A&); }; const B &b1{a}; const B &b2(a); so I had to peruse [over.match.ref], and eventually realized that the difference can be seen here: struct G { operator int(); // #1 explicit operator int&&(); // #2 }; int&& r1(G{}); // use #2 (no temporary) int&& r2 = G{}; // use #1 (a temporary is created to be bound to int&&) The implementation itself was rather straightforward because we already have the conv_binds_ref_to_prvalue function. The main function here is ref_xes_from_temporary. I've changed the return type of ref_conv_binds_directly to tristate, because previously the function didn't distinguish between an invalid conversion and one that binds to a prvalue. Since it no longer returns a bool, I removed the _p suffix. The patch also adds the relevant class and variable templates to <type_traits>. PR c++/104477 gcc/c-family/ChangeLog: * c-common.cc (c_common_reswords): Add __reference_constructs_from_temporary and __reference_converts_from_temporary. * c-common.h (enum rid): Add RID_REF_CONSTRUCTS_FROM_TEMPORARY and RID_REF_CONVERTS_FROM_TEMPORARY. gcc/cp/ChangeLog: * call.cc (ref_conv_binds_directly_p): Rename to ... (ref_conv_binds_directly): ... this. Add a new bool parameter. Change the return type to tristate. * constraint.cc (diagnose_trait_expr): Handle CPTK_REF_CONSTRUCTS_FROM_TEMPORARY and CPTK_REF_CONVERTS_FROM_TEMPORARY. * cp-tree.h: Include "tristate.h". (enum cp_trait_kind): Add CPTK_REF_CONSTRUCTS_FROM_TEMPORARY and CPTK_REF_CONVERTS_FROM_TEMPORARY. (ref_conv_binds_directly_p): Rename to ... (ref_conv_binds_directly): ... this. (ref_xes_from_temporary): Declare. * cxx-pretty-print.cc (pp_cxx_trait_expression): Handle CPTK_REF_CONSTRUCTS_FROM_TEMPORARY and CPTK_REF_CONVERTS_FROM_TEMPORARY. * method.cc (ref_xes_from_temporary): New. * parser.cc (cp_parser_primary_expression): Handle RID_REF_CONSTRUCTS_FROM_TEMPORARY and RID_REF_CONVERTS_FROM_TEMPORARY. (cp_parser_trait_expr): Likewise. (warn_for_range_copy): Adjust to call ref_conv_binds_directly. * semantics.cc (trait_expr_value): Handle CPTK_REF_CONSTRUCTS_FROM_TEMPORARY and CPTK_REF_CONVERTS_FROM_TEMPORARY. (finish_trait_expr): Likewise. libstdc++-v3/ChangeLog: * include/std/type_traits (reference_constructs_from_temporary, reference_converts_from_temporary): New class templates. (reference_constructs_from_temporary_v, reference_converts_from_temporary_v): New variable templates. (__cpp_lib_reference_from_temporary): Define for C++23. * include/std/version (__cpp_lib_reference_from_temporary): Define for C++23. * testsuite/20_util/variable_templates_for_traits.cc: Test reference_constructs_from_temporary_v and reference_converts_from_temporary_v. * testsuite/20_util/reference_from_temporary/value.cc: New test. * testsuite/20_util/reference_from_temporary/value2.cc: New test. * testsuite/20_util/reference_from_temporary/version.cc: New test. gcc/testsuite/ChangeLog: * g++.dg/ext/reference_constructs_from_temporary1.C: New test. * g++.dg/ext/reference_converts_from_temporary1.C: New test.
2022-07-15analyzer: fix taint false positive on optimized range checks [PR106284]David Malcolm2-0/+98
PR analyzer/106284 reports a false positive from -Wanalyzer-tainted-array-index seen on the Linux kernel with a version of my patches from: https://gcc.gnu.org/pipermail/gcc-patches/2021-November/584372.html in drivers/usb/class/usblp.c in function ‘usblp_set_protocol’ handling usblp_ioctl on IOCNR_SET_PROTOCOL, which has: | 1337 | if (protocol < USBLP_FIRST_PROTOCOL || protocol > USBLP_LAST_PROTOCOL) | | ~ | | | | | (15) following ‘false’ branch... |...... | 1341 | if (usblp->intf->num_altsetting > 1) { | | ~~~~~~~~~~~~ | | | | | | | (16) ...to here | | (17) following ‘true’ branch... | 1342 | alts = usblp->protocol[protocol].alt_setting; | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (18) ...to here | | (19) use of attacker-controlled value ‘arg’ in array lookup without bounds checking where "arg" is "protocol" (albeit from the caller frame, the ioctl callback), and is clearly checked at (15). The root cause is that at -O1 and above fold-const's build_range-check can optimize range checks (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low) and thus into a single check: (unsigned)(c - low) <= (unsigned)(high-low). I initially attempted to fix this by detecting such conditions in region_model::on_condition, and calling on_condition for both of the implied conditions. This turned out not to work since the current sm_context framework doesn't support applying two conditions simultaneously: it led to a transition from the old state to has_lb, then a transition from the old state *again* to has_ub, thus leaving the new state as has_ub, rather than the stop state. Instead, this patch fixes things by special-casing it within taint_state_machine::on_condition. gcc/analyzer/ChangeLog: PR analyzer/106284 * sm-taint.cc (taint_state_machine::on_condition): Handle range checks optimized by build_range_check. gcc/testsuite/ChangeLog: PR analyzer/106284 * gcc.dg/analyzer/torture/taint-read-index-2.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-15analyzer: documentation nits relating to new fd warningsDavid Malcolm1-0/+10
gcc/ChangeLog: * doc/invoke.texi (Static Analyzer Options): Add the new fd warnings to the initial gccoptlist, and to the list of those disabled by -fanalyzer-checker=taint. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-15go: fix f(g()) where g returns zero-sized typeIan Lance Taylor1-0/+13
Test case is https://go.dev/cl/417481. Fixes golang/go#23868 * go-gcc.cc (Gcc_backend::call_expression): Handle a void argument, as for f(g()) where g returns a zero-sized type.
2022-07-15aarch64: Remove qualifier_internalAndrew Carlotti1-7/+1
This has been unused since 2014, so there's no reason to retain it. gcc/ChangeLog: * config/aarch64/aarch64-builtins.cc (enum aarch64_type_qualifiers): Remove qualifier_internal. (aarch64_init_simd_builtin_functions): Remove qualifier_internal check.
2022-07-15aarch64: Add V1DI modeAndrew Carlotti6-13/+25
We already have a V1DF mode, so this makes the vector modes more consistent. Additionally, this allows us to recognise uint64x1_t and int64x1_t types given only the mode and type qualifiers (e.g. in aarch64_lookup_simd_builtin_type). gcc/ChangeLog: * config/aarch64/aarch64-builtins.cc (v1di_UP): Add V1DI mode to _UP macros. * config/aarch64/aarch64-modes.def (VECTOR_MODE): Add V1DI mode. * config/aarch64/aarch64-simd-builtin-types.def: Use V1DI mode. * config/aarch64/aarch64-simd.md (vec_extractv2dfv1df): Replace with... (vec_extract<mode><V1half>): ...this. * config/aarch64/aarch64.cc (aarch64_classify_vector_mode): Add V1DI mode. * config/aarch64/iterators.md (VQ_2E, V1HALF, V1half): New. (nunits): Add V1DI mode.
2022-07-15MAINTAINERS: Add myself to Write After ApprovalAndrew Carlotti1-0/+1
ChangeLog: * MAINTAINERS: Add myself to Write After Approval.
2022-07-15PR target/106278: Keep REG_EQUAL notes consistent during TImode STV on x86_64.Roger Sayle2-18/+38
This patch resolves PR target/106278 a regression on x86_64 caused by my recent TImode STV improvements. Now that TImode STV can handle comparisons such as "(set (regs:CC) (compare:CC (reg:TI) ...))" the convert_insn method sensibly checks that the mode of the SET_DEST is TImode before setting it to V1TImode [to avoid V1TImode appearing on the hard reg CC_FLAGS. Hence the current code looks like: if (GET_MODE (dst) == TImode) { tmp = find_reg_equal_equiv_note (insn); if (tmp && GET_MODE (XEXP (tmp, 0)) == TImode) PUT_MODE (XEXP (tmp, 0), V1TImode); PUT_MODE (dst, V1TImode); fix_debug_reg_uses (dst); } break; which checks GET_MODE (dst) before calling PUT_MODE, and when a change is made updating the REG_EQUAL_NOTE tmp if it exists. The logical flaw (oversight) is that due to RTL sharing, the destination of this set may already have been updated to V1TImode, as this chain is being converted, but we still need to update any REG_EQUAL_NOTE that still has TImode. Hence the correct code is actually: if (GET_MODE (dst) == TImode) { PUT_MODE (dst, V1TImode); fix_debug_reg_uses (dst); } if (GET_MODE (dst) == V1TImode) { tmp = find_reg_equal_equiv_note (insn); if (tmp && GET_MODE (XEXP (tmp, 0)) == TImode) PUT_MODE (XEXP (tmp, 0), V1TImode); } break; While fixing this behavior, I noticed I had some indentation whitespace issues and some vestigial dead code in this function/method that I've taken the liberty of cleaning up (as obvious) in this patch. 2022-07-15 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR target/106278 * config/i386/i386-features.cc (general_scalar_chain::convert_insn): Fix indentation whitespace. (timode_scalar_chain::fix_debug_reg_uses): Likewise. (timode_scalar_chain::convert_insn): Delete dead code. Update TImode REG_EQUAL_NOTE even if the SET_DEST is already V1TI. Fix indentation whitespace. (convertible_comparison_p): Likewise. (timode_scalar_to_vector_candidate_p): Likewise. gcc/testsuite/ChangeLog * gcc.dg/pr106278.c: New test case.
2022-07-15Use pp_vrange for ranges in dump_ssaname_info.Aldy Hernandez1-28/+4
This changes the ad-hoc dumping of ranges in the gimple pretty printer to use the pp_vrange utility function, which has the benefit of handling all range types going forward and unifying the dumping code. Instead of: # RANGE [0, 51] NONZERO 0x3f # RANGE ~[5, 10] we would now get: # RANGE [irange] long unsigned int [0, 51] NONZERO 0x3f # RANGE [irange] int [-MIN, 4][11, MAX] Tested on x86-64 Linux. gcc/ChangeLog: * gimple-pretty-print.cc (dump_ssaname_info): Use pp_vrange.
2022-07-15Convert vrange dumping facilities to pretty_printer.Aldy Hernandez6-105/+172
We need to dump global ranges from the gimple pretty printer code, but all the vrange dumping facilities work with FILE handles. This patch converts all the dumping methods to work with pretty printers, and provides a wrapper so the FILE * methods continue to work for debugging. I also cleaned up the code a bit. Tested on x86-64 Linux. gcc/ChangeLog: * Makefile.in (OBJS): Add value-range-pretty-print.o. * pretty-print.h (pp_vrange): New. * value-range.cc (vrange::dump): Call pp version. (unsupported_range::dump): Move to its own file. (dump_bound_with_infinite_markers): Same. (irange::dump): Same. (irange::dump_bitmasks): Same. (vrange::debug): Remove. * value-range.h: Remove virtual designation for dump methods. Remove dump_bitmasks method. * value-range-pretty-print.cc: New file. * value-range-pretty-print.h: New file.
2022-07-15Implement visitor pattern for vrange.Aldy Hernandez2-0/+23
We frequently do operations on the various (upcoming) range types. The cascading if/switch statements of is_a<> are getting annoying and repetitive. The classic visitor pattern provides a clean way to implement classes handling various range types without the need for endless conditionals. It also helps us keep polluting the vrange API with functionality that should frankly live elsewhere. In a follow-up patch I will add pretty printing facilities for vrange and unify them with the dumping code. This is a prime candidate for the pattern, as the code isn't performance sensitive. Other instances (?? the dispatch code in range-ops ??) may still benefit from the hand coded conditionals, since they elide vtables in favor of the discriminator bit in vrange. Tested on x86-64 Linux. gcc/ChangeLog: * value-range.cc (irange::accept): New. (unsupported_range::accept): New. * value-range.h (class vrange_visitor): New. (class vrange): Add accept method. (class unsupported_range): Same. (class Value_Range): Same.
2022-07-15libcpp: Improve encapsulation of label_textJonathan Wakely17-78/+80
This adjusts the API of label_text so that the data members are private and cannot be modified by callers. Add accessors for them instead, and make the accessors const-correct. Also rename moved_from () to the more idiomatic release (). Also remove the unused take_or_copy () member function which has confusing ownership semantics. gcc/analyzer/ChangeLog: * call-info.cc (call_info::print): Adjust to new label_text API. * checker-path.cc (checker_event::dump): Likewise. (region_creation_event::get_desc): Likewise. (state_change_event::get_desc): Likewise. (superedge_event::should_filter_p): Likewise. (start_cfg_edge_event::get_desc): Likewise. (call_event::get_desc): Likewise. (return_event::get_desc): Likewise. (warning_event::get_desc): Likewise. (checker_path::dump): Likewise. (checker_path::debug): Likewise. * diagnostic-manager.cc (diagnostic_manager::prune_for_sm_diagnostic): Likewise. (diagnostic_manager::prune_interproc_events): Likewise. * engine.cc (feasibility_state::maybe_update_for_edge): Likewise. * program-state.cc (sm_state_map::to_json): Likewise. * region-model-impl-calls.cc (region_model::impl_call_analyzer_describe): Likewise. (region_model::impl_call_analyzer_dump_capacity): Likewise. * region.cc (region::to_json): Likewise. * sm-malloc.cc (inform_nonnull_attribute): Likewise. * store.cc (binding_map::to_json): Likewise. (store::to_json): Likewise. * supergraph.cc (superedge::dump): Likewise. * svalue.cc (svalue::to_json): Likewise. gcc/c-family/ChangeLog: * c-format.cc (class range_label_for_format_type_mismatch): Adjust to new label_text API. gcc/ChangeLog: * diagnostic-format-json.cc (json_from_location_range): Adjust to new label_text API. * diagnostic-format-sarif.cc (sarif_builder::make_location_object): Likewise. * diagnostic-show-locus.cc (struct pod_label_text): Likewise. (layout::print_any_labels): Likewise. * tree-diagnostic-path.cc (class path_label): Likewise. (struct event_range): Likewise. (default_tree_diagnostic_path_printer): Likewise. (default_tree_make_json_for_path): Likewise. libcpp/ChangeLog: * include/line-map.h (label_text::take_or_copy): Remove. (label_text::moved_from): Rename to release. (label_text::m_buffer, label_text::m_owned): Make private. (label_text::get, label_text::is_owned): New accessors.
2022-07-15i386: Fix _mm_[u]comixx_{ss,sd} codegen and add PF result. [PR106113]konglin114-66/+450
gcc/ChangeLog: PR target/106113 * config/i386/i386-builtin.def (BDESC): Fix [u]comi{ss,sd} comparison due to intrinsics changed over time. * config/i386/i386-expand.cc (ix86_ssecom_setcc): Add unordered check and mode for sse comi codegen. (ix86_expand_sse_comi): Add unordered check and check a different CCmode. (ix86_expand_sse_comi_round):Extract unordered check and mode part in ix86_ssecom_setcc. gcc/testsuite/ChangeLog: PR target/106113 * gcc.target/i386/avx-vcomisd-pr106113-2.c: New test. * gcc.target/i386/avx-vcomiss-pr106113-2.c: Ditto. * gcc.target/i386/avx-vucomisd-pr106113-2.c: Ditto. * gcc.target/i386/avx-vucomiss-pr106113-2.c: Ditto. * gcc.target/i386/sse-comiss-pr106113-1.c: Ditto. * gcc.target/i386/sse-comiss-pr106113-2.c: Ditto. * gcc.target/i386/sse-ucomiss-pr106113-1.c: Ditto. * gcc.target/i386/sse-ucomiss-pr106113-2.c: Ditto. * gcc.target/i386/sse2-comisd-pr106113-1.c: Ditto. * gcc.target/i386/sse2-comisd-pr106113-2.c: Ditto. * gcc.target/i386/sse2-ucomisd-pr106113-1.c: Ditto. * gcc.target/i386/sse2-ucomisd-pr106113-2.c: Ditto.
2022-07-15[aarch64] Use op_mode instead of vmode in aarch64_vectorize_vec_perm_const.Prathamesh Kulkarni1-2/+2
gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_vectorize_vec_perm_const): Use op_mode instead of vmode in calls to force_reg for op0 and op1.
2022-07-15Daily bump.GCC Administrator7-1/+92
2022-07-14Simplify memchr with small constant stringsH.J. Lu13-2/+317
When memchr is applied on a constant string of no more than the bytes of a word, simplify memchr by checking each byte in the constant string. int f (int a) { return __builtin_memchr ("AE", a, 2) != 0; } is simplified to int f (int a) { return ((char) a == 'A' || (char) a == 'E') != 0; } gcc/ PR tree-optimization/103798 * tree-ssa-forwprop.cc: Include "tree-ssa-strlen.h". (simplify_builtin_call): Inline memchr with constant strings of no more than the bytes of a word. * tree-ssa-strlen.cc (use_in_zero_equality): Make it global. * tree-ssa-strlen.h (use_in_zero_equality): New. gcc/testsuite/ PR tree-optimization/103798 * c-c++-common/pr103798-1.c: New test. * c-c++-common/pr103798-2.c: Likewise. * c-c++-common/pr103798-3.c: Likewise. * c-c++-common/pr103798-4.c: Likewise. * c-c++-common/pr103798-5.c: Likewise. * c-c++-common/pr103798-6.c: Likewise. * c-c++-common/pr103798-7.c: Likewise. * c-c++-common/pr103798-8.c: Likewise. * c-c++-common/pr103798-9.c: Likewise. * c-c++-common/pr103798-10.c: Likewise.
2022-07-14Fortran: error recovery for bad initializers of implied-shape arrays [PR106209]Harald Anlauf2-2/+22
gcc/fortran/ChangeLog: PR fortran/106209 * decl.cc (add_init_expr_to_sym): Handle bad initializers for implied-shape arrays. gcc/testsuite/ChangeLog: PR fortran/106209 * gfortran.dg/pr106209.f90: New test. Co-authored-by: Steven G. Kargl <kargl@gcc.gnu.org>
2022-07-14jit: Make recording::memento non-copyableJonathan Wakely1-1/+7
gcc/jit/ChangeLog: * jit-recording.h (recording::memento): Define copy constructor and copy assignment operator as deleted. (recording::string): Likewise. (recording::string::c_str): Add const qualifier.
2022-07-14lto-plugin: use -pthread only for detected targetsMartin Liska4-6/+16
Use -pthread only if we are going to use pthread functionality. PR bootstrap/106156 lto-plugin/ChangeLog: * Makefile.am: Use ac_lto_plugin_extra_ldflags for AM_LDFLAGS. * configure.ac: Use AC_SUBST(ac_lto_plugin_extra_ldflags). * Makefile.in: Regenerate. * configure: Regenerate.
2022-07-14Fix ICE on view conversion between struct and integerEric Botcazou3-13/+49
This happens from prepare_gimple_addressable for the variable to be marked with DECL_NOT_GIMPLE_REG_P when its initialization is gimplified, so it's apparently just a matter of setting the flag earlier. gcc/ * gimplify.cc (lookup_tmp_var): Add NOT_GIMPLE_REG boolean parameter and set DECL_NOT_GIMPLE_REG_P on the variable according to it. (internal_get_tmp_var): Add NOT_GIMPLE_REG boolean parameter and pass it in the call to lookup_tmp_var. (get_formal_tmp_var): Pass false in the call to lookup_tmp_var. (get_initialized_tmp_var): Likewise. (prepare_gimple_addressable): Call internal_get_tmp_var instead of get_initialized_tmp_var with NOT_GIMPLE_REG set to true. gcc/testsuite/ * gnat.dg/opt98.ads, gnat.dg/opt98.adb: New test.
2022-07-14libiberty: fix docs typoMartin Liska1-1/+1
libiberty/ChangeLog: * functions.texi: Replace strtoul with strtoull.
2022-07-14docs: fix position of @end deftypefnMartin Liska1-2/+2
gcc/ChangeLog: * doc/gimple.texi: Close properly a deftypefn.
2022-07-14docs: fix position of @end deftypefnMartin Liska1-2/+1
gcc/ChangeLog: * doc/gimple.texi: Close properly a deftypefn.
2022-07-14xtensa: Minor fix for FP constant synthesisTakayuki 'January June' Suwa2-28/+9
This patch fixes an non-fatal issue about negative constant values derived from FP constant synthesis on hosts whose 'long' is wider than 'int32_t'. And also replaces the dedicated code in FP constant synthesis split pattern with the appropriate existing function call. gcc/ChangeLog: * config/xtensa/xtensa.md: In FP constant synthesis split pattern, subcontract to avoid_constant_pool_reference() as in the case of integer, because it can handle well too. And cast to int32_t before calling xtensa_constantsynth() in order to ignore upper 32-bit. gcc/testsuite/ChangeLog: * gcc.target/xtensa/constsynth_double.c: Modify in order to catch the issue.
2022-07-14Daily bump.GCC Administrator6-1/+328
2022-07-13libcpp: Avoid pessimizing std::move [PR106272]Marek Polacek1-2/+2
std::move in a return statement can prevent the NRVO: <https://developers.redhat.com/blog/2019/04/12/understanding-when-not-to-stdmove-in-c> PR106272 reports that we have two such cases in class label_text's member functions. We have -Wpessimizing-move that's supposed to detect problematic std::move uses, but in this case it didn't trigger. I've filed PR106276 to track that. PR preprocessor/106272 libcpp/ChangeLog: * include/line-map.h (class label_text): Don't std::move in a return statement.
2022-07-13c++: non-dependent call to consteval operator [PR105912]Patrick Palka2-6/+32
Here we're crashing when substituting a non-dependent call to a consteval operator, whose CALL_EXPR_OPERATOR_SYNTAX flag we try to propagate to the result, but the result isn't a CALL_EXPR since the selected function is consteval. This patch fixes this by checking the result of extract_call_expr accordingly. (Note that we can't check DECL_IMMEDIATE_FUNCTION_P here because we don't know which function was selected by overload resolution from here.) PR c++/105912 gcc/cp/ChangeLog: * pt.cc (tsubst_copy_and_build) <case CALL_EXPR>: Guard against NULL_TREE extract_call_expr result. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/consteval31.C: New test.
2022-07-13c++: dependence of constrained memfn from current inst [PR105842]Patrick Palka4-12/+84
Here we incorrectly deem the calls to func1, func2 and tmpl2 as ambiguous ahead of time ultimately because we mishandle dependence of a constrained member function from the current instantiation. In type_dependent_expression_p, we already consider dependence of a TEMPLATE_DECL's constraints (via uses_outer_template_parms), but neglect to do the same for a FUNCTION_DECL (such as that for func1). And in satisfy_declaration_constraints, we give up if _any_ template argument is dependent, but for non-dependent member functions from the current instantiation (such as func2 and tmpl2), we can and must check constraints as long as the innermost arguments aren't dependent. PR c++/105842 gcc/cp/ChangeLog: * constraint.cc (satisfy_declaration_constraints): Refine early exit test for argument dependence. * cp-tree.h (uses_outer_template_parms_in_constraints): Declare. * pt.cc (template_class_depth): Handle TI_TEMPLATE being a FIELD_DECL. (usse_outer_template_parms): Factor out constraint dependence test into ... (uses_outer_template_parms_in_constraints): ... here. (type_dependent_expression_p): Use it for FUNCTION_DECL. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-memtmpl6.C: New test.
2022-07-13libgo: don't include <linux/fs.h> when building gen-sysinfo.goIan Lance Taylor2-4/+1
Removing this doesn't change anything at least with glibc 2.33. The include was added in https://go.dev/cl/6100049 but it's not clear why. Fixes PR go/106266 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/417294
2022-07-13Use nonzero bits in range-ops to determine if < 0 is false.Aldy Hernandez3-2/+5
For a signed integer, x < 0 is false if the sign bit in the nonzero bits of X is clear. Both CCP and ipa-cp can set the global nonzero bits in a range, which means we can now use some of that information in evrp and subsequent passes. I've adjusted two tests which now fold things earlier because of this optimization. Tested on x86-64 Linux. gcc/ChangeLog: * range-op.cc (operator_lt::fold_range): Use nonzero bits. gcc/testsuite/ChangeLog: * g++.dg/ipa/pure-const-3.C: Adjust. * gcc.dg/pr102983.c: Adjust.
2022-07-13Clear nonzero mask when inverting ranges.Aldy Hernandez1-0/+8
Every time we set a range we should take into account the nonzero mask. This happens automatically for the set() methods, plus all the other assignment, intersect, and union methods. Unfortunately I forgot about the invert code. Also, for good measure I audited the rest of the setters in value_range.cc and plugged the legacy code to pessimize the masks to -1 for union/intersect, since we don't support the masks on them (or rather, we don't keep very good track of them). Tested on x86-64 Linux. gcc/ChangeLog: * value-range.cc (irange::copy_to_legacy): Set nonzero mask. (irange::legacy_intersect): Clear nonzero mask. (irange::legacy_union): Same. (irange::invert): Same.
2022-07-13Speed up DOM record_temporary_equivalencesRichard Biener2-39/+31
The following gets away computing a dominance bitmap when fast queries are not available and we are doing back_propagate_equivalences. The comuted bitmap can be cheaply kept up-to-date during the domwalk since it is simply the set of blocks on the domwalk stack. Abstraction of the threading makes this somewhat awkward but it also fulfills the fixme comment in only considering equivalences in already (domwalk) visited blocks, even when querying from the outgoing block of a forward thread. Maybe that's not what is intended but at least we have no testsuite coverage of such missed equivalences. * tree-ssa-dom.h (record_temporary_equivalences): Remove. * tree-ssa-dom.cc (dom_jt_state::m_blocks_on_stack): New. (dom_jt_state::get_blocks_on_stack): Likewise. (dom_opt_dom_walker::dom_opt_dom_walker): Take dom_jt_state. (back_propagate_equivalences): Remove dominator bitmap compute and instead use passed in m_blocks_on_stack. (record_temporary_equivalences): Likewise. (record_equivalences_from_incoming_edge): Likewise. (dom_opt_dom_walker::before_dom_children): Maintain and pass down blocks on stack. (dom_opt_dom_walker::after_dom_children): Likewise.
2022-07-13[Ada] Small housekeeping work in gigiEric Botcazou1-1/+8
gcc/ada/ * gcc-interface/trans.cc (gnat_to_gnu) <N_Assignment_Statement>: Fix a couple of minor issues in the commentary.
2022-07-13[Ada] Extend No_Dependence restriction to code generationEric Botcazou2-21/+64
This reports violations for 4 units from gigi. gcc/ada/ * gcc-interface/trans.cc (gigi): Report a violation of No_Dependence on System.Stack_Checking if Stack_Check_Probes_On_Target is not set and -fstack-check is specified. (build_binary_op_trapv): Report violatiosn of No_Dependence on both System.Arith_64 and System.Arith_128. (add_decl_expr): If an initialized variable, report a violation of No_Dependence on System.Memory_Copy for large aggregate types. (gnat_to_gnu) <N_Op_Eq>: Report a violation of No_Dependence on System.Memory_Compare for large aggregate types. <N_Assignment_Statement>! Report a violation of No_Dependence on System.Memory_Set, System.Memory_Move or else System.Memory_Copy for large aggregate types. * gcc-interface/utils2.cc (maybe_wrap_malloc): Report a violation of No_Dependence on System.Memory. (maybe_wrap_free): Add GNAT_NODE parameter and report a violation of No_Dependence on System.Memory. (build_call_alloc_dealloc): Adjust call to maybe_wrap_free.
2022-07-13[Ada] Revert recent change in debug info for vector array typesEric Botcazou1-8/+0
It lost too much useful information. gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity): Do not set the debug type for vector types.
2022-07-13[Ada] Undo questionable renaming in earlier changeEric Botcazou1-2/+2
gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Access_Subtype>: Undo questionable renaming.
2022-07-13[Ada] Also deal with private actual types in latest changeEric Botcazou1-0/+13
gcc/ada/ * gcc-interface/decl.cc (Gigi_Cloned_Subtype): Handle private case.
2022-07-13[Ada] Adjust name of stack checking functionEric Botcazou1-1/+1
gcc/ada/ * gcc-interface/trans.cc (gigi): Add one more leading underscore to name of stack checking function.
2022-07-13[Ada] Use actual types instead of formal types consistently in debug infoEric Botcazou1-27/+93
This makes sure that the objects present in instantiations always have the actual type instead of a local variant of the formal type in the debugging information generated by the compiler (this was already the case when the actual type is a record, a protected or a task type). gcc/ada/ * gcc-interface/decl.cc (Gigi_Cloned_Subtype): New function. (gnat_to_gnu_entity) <E_Signed_Integer_Subtype>: Call it to get the cloned subtype, if any. <E_Floating_Point_Subtype>: Likewise. <E_Array_Subtype>: Likewise. <E_Record_Subtype>: Likewise. <E_Access_Subtype>: Likewise. Deal with all cloned subtypes on the main path.
2022-07-13[Ada] Generate debug info entry for user-defined access subtypeEric Botcazou1-7/+6
This is consistent with the other kinds of subtypes. gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Access_Subtype>: Do not reuse the TYPE_DECL of the base type.
2022-07-13[Ada] Do not generate DW_TAG_typedef for constrained array typesEric Botcazou1-16/+9
It no longer serves any useful purpose at this point. gcc/ada/ * gcc-interface/utils.cc (gnat_pushdecl): Build DECL_ORIGINAL_TYPE only for pointer types.
2022-07-13[Ada] Fix internal error on comparison with access function parameterEric Botcazou1-5/+10
It comes from an overzealous assertion. gcc/ada/ * gcc-interface/utils2.cc (build_binary_op) <EQ_EXPR>: Also accept pointer-to-function types that are not variant of each other.
2022-07-13[Ada] Fix internal error on instance of Ada.Task_Attributes at -OEric Botcazou1-7/+13
This happens when there is a size mismatch, but this must be accepted. gcc/ada/ * gcc-interface/utils.cc (unchecked_convert): Also pad in most cases if the source is not a scalar type but the destination is.
2022-07-13[Ada] Fix wrong access check with access-to-unconstrained-arrayEric Botcazou1-8/+13
The current implementation may create dangling references from a superset of the alias set of the dummy pointer-to-array type when it exists. gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Array_Type>: Save and restore the alias set of the dummy pointer-to-array type.
2022-07-13[Ada] Extend No_Dependence restriction to code generation (continued)Eric Botcazou1-0/+4
gcc/ada/ * snames.ads-tmpl (Name_Memory_Compare): New package name. (Name_Memory_Copy): Likewise. (Name_Memory_Move): Likewise. (Name_Memory_Set): Likewise.
2022-07-13[Ada] Fix for bootstrap problem with calling function System.Case_Util.To_MixedGary Dismukes1-1/+3
gcc/ada/ * sem_ch13.adb (Check_And_Resolve_Storage_Model_Type_Argument): Call the System.Case_Util.To_Mixed procedure rather than the function, to avoid bootstrap problems.