aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2022-06-20middle-end/106027 - fix types in needle foldingRichard Biener2-3/+15
The fold_to_nonsharp_ineq_using_bound folding ends up creating invalid typed IL which confuses later foldings. The following fixes that. 2022-06-20 Richard Biener <rguenther@suse.de> PR middle-end/106027 * fold-const.cc (fold_to_nonsharp_ineq_using_bound): Use the type of the prevailing comparison for the new comparison type. (fold_binary_loc): Use proper types for the A < X && A + 1 > Y to A < X && A >= Y folding. * gcc.dg/pr106027.c: New testcase.
2022-06-20vect: Respect slp decision when applying suggested uf [PR105940]Kewen Lin1-34/+67
This follows Richi's suggestion in PR105940, it aims to avoid inconsistent slp decision between when the suggested unroll factor is worked out and when the suggested unroll factor is applied. If the previous slp decision is true when the suggested unroll factor is worked out, when we are applying unroll factor we don't need to start over with slp off if the analysis with slp on fails. On the other hand, if the previous slp decision is false when the suggested unroll factor is worked out, when we are applying unroll factor we can skip the slp handlings. Function vect_is_simple_reduction saves reduction chains for subsequent slp analyses, we have to disable this early otherwise there is an ICE in vectorizable_reduction for below: if (REDUC_GROUP_FIRST_ELEMENT (stmt_info)) gcc_assert (slp_node && REDUC_GROUP_FIRST_ELEMENT (stmt_info) == stmt_info); PR tree-optimization/105940 gcc/ChangeLog: * tree-vect-loop.cc (vect_analyze_loop_2): Add new parameter slp_done_for_suggested_uf and adjust with it accordingly. (vect_analyze_loop_1): Add new variable slp_done_for_suggested_uf, pass it down to vect_analyze_loop_2 for the initial analysis and applying suggested unroll factor. (vect_is_simple_reduction): Add parameter slp and adjust with it. (vect_analyze_scalar_cycles_1): Add parameter slp and pass down. (vect_analyze_scalar_cycles): Likewise.
2022-06-20Add operators / and * for profile_{count,probability}.Martin Liska22-120/+137
gcc/ChangeLog: * bb-reorder.cc (find_traces_1_round): Add operators / and * and use them. (better_edge_p): Likewise. * cfgloop.cc (find_subloop_latch_edge_by_profile): Likewise. * cfgloopmanip.cc (scale_loop_profile): Likewise. * cfgrtl.cc (force_nonfallthru_and_redirect): Likewise. * cgraph.cc (cgraph_edge::maybe_hot_p): Likewise. * config/sh/sh.cc (expand_cbranchdi4): Likewise. * dojump.cc (do_compare_rtx_and_jump): Likewise. * final.cc (compute_alignments): Likewise. * ipa-cp.cc (update_counts_for_self_gen_clones): Likewise. (decide_about_value): Likewise. * ipa-inline-analysis.cc (do_estimate_edge_time): Likewise. * loop-unroll.cc (unroll_loop_runtime_iterations): Likewise. * modulo-sched.cc (sms_schedule): Likewise. * omp-expand.cc (extract_omp_for_update_vars): Likewise. (expand_omp_ordered_sink): Likewise. (expand_omp_for_ordered_loops): Likewise. (expand_omp_for_static_nochunk): Likewise. * predict.cc (maybe_hot_count_p): Likewise. (probably_never_executed): Likewise. (set_even_probabilities): Likewise. (handle_missing_profiles): Likewise. (expensive_function_p): Likewise. * profile-count.h: Likewise. * profile.cc (compute_branch_probabilities): Likewise. * stmt.cc (emit_case_dispatch_table): Likewise. * symtab-thunks.cc (expand_thunk): Likewise. * tree-ssa-loop-manip.cc (tree_transform_and_unroll_loop): Likewise. * tree-ssa-sink.cc (select_best_block): Likewise. * tree-switch-conversion.cc (switch_decision_tree::analyze_switch_statement): Likewise. (switch_decision_tree::balance_case_nodes): Likewise. (switch_decision_tree::emit_case_nodes): Likewise. * tree-vect-loop.cc (scale_profile_for_vect_loop): Likewise.
2022-06-20RISC-V: Fix a bug that is the CMO builtins are missing parameteryulong7-34/+58
We changed builtins format about zicbom and zicboz subextensions and modified test cases. diff with the previous version: 1.We modified the FUNCTION_TYPE from RISCV_VOID_FTYPE_SI/DI to RISCV_VOID_FTYPE_VOID_PTR. 2.We added a new RISCV_ATYPE_VOID_PTR in riscv-builtins.cc and a new DEF_RISCV_FTYPE (1, (VOID, VOID_PTR)) in riscv-ftypes.def. 3.We deleted DEF_RISCV_FTYPE (1, (VOID, SI/DI)). 4.We modified the input parameters of the test cases. Thanks, Simon and Kito. gcc/ChangeLog: * config/riscv/riscv-builtins.cc (RISCV_ATYPE_VOID_PTR): New. * config/riscv/riscv-cmo.def (RISCV_BUILTIN): Changed the FUNCTION_TYPE of RISCV_BUILTIN. * config/riscv/riscv-ftypes.def (0): Remove unused. (1): New. gcc/testsuite/ChangeLog: * gcc.target/riscv/cmo-zicbom-1.c: modified the input parameters. * gcc.target/riscv/cmo-zicbom-2.c: modified the input parameters. * gcc.target/riscv/cmo-zicboz-1.c: modified the input parameters. * gcc.target/riscv/cmo-zicboz-2.c: modified the input parameters.
2022-06-20Daily bump.GCC Administrator2-1/+20
2022-06-19xtensa: Fix RTL insn cost estimation about relaxed MOVI instructionsTakayuki 'January June' Suwa1-8/+14
These instructions will all be converted to L32R ones with litpool entries by the assembler. gcc/ChangeLog: * config/xtensa/xtensa.cc (xtensa_is_insn_L32R_p): Consider relaxed MOVI instructions as L32R.
2022-06-19xtensa: Apply a few minor fixesTakayuki 'January June' Suwa2-12/+12
No functional changes. gcc/ChangeLog: * config/xtensa/xtensa.cc (xtensa_emit_move_sequence): Use can_create_pseudo_p(), instead of using individual reload_in_progress and reload_completed. (xtensa_expand_block_set_small_loop): Use xtensa_simm8x256(), the existing predicate function. (xtensa_is_insn_L32R_p, gen_int_relational, xtensa_emit_sibcall): Use the standard RTX code predicate macros such as MEM_P, SYMBOL_REF_P and/or CONST_INT_P. * config/xtensa/xtensa.md: Avoid using numeric literals to determine if callee-saved register, at the split patterns for indirect sibcall fixups.
2022-06-19Daily bump.GCC Administrator6-1/+120
2022-06-18Fortran: check POS and LEN arguments simplifying bit intrinsics [PR105986]Harald Anlauf2-0/+28
gcc/fortran/ChangeLog: PR fortran/105986 * simplify.cc (gfc_simplify_btest): Add check for POS argument. (gfc_simplify_ibclr): Add check for POS argument. (gfc_simplify_ibits): Add check for POS and LEN arguments. (gfc_simplify_ibset): Add check for POS argument. gcc/testsuite/ChangeLog: PR fortran/105986 * gfortran.dg/check_bits_3.f90: New test.
2022-06-18ubsan: Add -fsanitize-trap= supportJakub Jelinek16-109/+226
On Thu, Jun 16, 2022 at 09:32:02PM +0100, Jonathan Wakely wrote: > It looks like clang has addressed this deficiency now: > > https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#usage Thanks, that is roughly what I'd implement anyway and apparently they have it already since 2015, we've added the -fsanitize-undefined-trap-on-error support back in 2014 and didn't change it since then. As a small divergence from clang, I chose -fsanitize-undefined-trap-on-error to be a (deprecated) alias for -fsanitize-trap aka -fsanitize-trap=all rather thn -fsanitize-trap=undefined which seems to be what clang does, because for a deprecated option it is IMHO more important backwards compatibility with what gcc did over the past 8 years rather than clang compatibility. Some sanitizers (e.g. asan, lsan, tsan) don't support traps, -fsanitize-trap=address etc. will be rejected (if enabled at the end of command line), -fno-sanitize-trap= can be specified even for them. This is similar behavior to -fsanitize-recover=. One complication is vptr sanitization, which can't easily trap, as the whole slow path of the checking is inside of libubsan. Previously, -fsanitize=vptr -fsanitize-undefined-trap-on-error silently ignored vptr sanitization. This patch similarly to what clang does will accept -fsanitize-trap=all or -fsanitize-trap=undefined which enable the vptr bit as trapping and again that causes silent disabling of vptr sanitization, while -fsanitize-trap=vptr is rejected (already during option processing). 2022-06-18 Jakub Jelinek <jakub@redhat.com> gcc/ * common.opt (flag_sanitize_trap): New variable. (fsanitize-trap=, fsanitize-trap): New options. (fsanitize-undefined-trap-on-error): Change into deprecated alias for -fsanitize-trap=all. * opts.h (struct sanitizer_opts_s): Add can_trap member. * opts.cc (finish_options): Complain about unsupported -fsanitize-trap= options. (sanitizer_opts): Add can_trap values to all entries. (get_closest_sanitizer_option): Ignore -fsanitize-trap= options which have can_trap false. (parse_sanitizer_options): Add support for -fsanitize-trap=. For -fsanitize-trap=all, enable SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT. Disallow -fsanitize-trap=vptr here. (common_handle_option): Handle OPT_fsanitize_trap_ and OPT_fsanitize_trap. * sanopt.cc (maybe_optimize_ubsan_null_ifn): Check flag_sanitize_trap & SANITIZE_{NULL,ALIGNMENT} instead of flag_sanitize_undefined_trap_on_error. * gcc.cc (sanitize_spec_function): Use flag_sanitize & ~flag_sanitize_trap instead of flag_sanitize and drop use of flag_sanitize_undefined_trap_on_error in "undefined" handling. * ubsan.cc (ubsan_instrument_unreachable): Use flag_sanitize_trap & SANITIZE_??? instead of flag_sanitize_undefined_trap_on_error. (ubsan_expand_bounds_ifn, ubsan_expand_null_ifn, ubsan_expand_objsize_ifn, ubsan_expand_ptr_ifn, ubsan_build_overflow_builtin, instrument_bool_enum_load, ubsan_instrument_float_cast, instrument_nonnull_arg, instrument_nonnull_return, instrument_builtin): Likewise. * doc/invoke.texi (-fsanitize-trap=, -fsanitize-trap): Document. (-fsanitize-undefined-trap-on-error): Document as deprecated alias of -fsanitize-trap. gcc/c-family/ * c-ubsan.cc (ubsan_instrument_division, ubsan_instrument_shift): Use flag_sanitize_trap & SANITIZE_??? instead of flag_sanitize_undefined_trap_on_error. If 2 sanitizers are involved and flag_sanitize_trap differs for them, emit __builtin_trap only for the comparison where trap is requested. (ubsan_instrument_vla, ubsan_instrument_return): Use lag_sanitize_trap & SANITIZE_??? instead of flag_sanitize_undefined_trap_on_error. gcc/cp/ * cp-ubsan.cc (cp_ubsan_instrument_vptr_p): Use flag_sanitize_trap & SANITIZE_VPTR instead of flag_sanitize_undefined_trap_on_error. gcc/testsuite/ * c-c++-common/ubsan/nonnull-4.c: Use -fsanitize-trap=all instead of -fsanitize-undefined-trap-on-error. * c-c++-common/ubsan/div-by-zero-4.c: Use -fsanitize-trap=signed-integer-overflow instead of -fsanitize-undefined-trap-on-error. * c-c++-common/ubsan/overflow-add-4.c: Use -fsanitize-trap=undefined instead of -fsanitize-undefined-trap-on-error. * c-c++-common/ubsan/pr56956.c: Likewise. * c-c++-common/ubsan/pr68142.c: Likewise. * c-c++-common/ubsan/pr80932.c: Use -fno-sanitize-trap=all -fsanitize-trap=shift,undefined instead of -fsanitize-undefined-trap-on-error. * c-c++-common/ubsan/align-8.c: Use -fsanitize-trap=alignment instead of -fsanitize-undefined-trap-on-error.
2022-06-18varasm: Fix up ICE in narrowing_initializer_constant_valid_p [PR105998]Jakub Jelinek2-2/+20
The following testcase ICEs because there is NON_LVALUE_EXPR (location wrapper) around a VAR_DECL and has TYPE_MODE V2SImode and SCALAR_INT_TYPE_MODE on that ICEs. Or for -m32 -march=i386 TYPE_MODE is DImode, but SCALAR_INT_TYPE_MODE still uses the raw V2SImode and ICEs too. 2022-06-18 Jakub Jelinek <jakub@redhat.com> PR middle-end/105998 * varasm.cc (narrowing_initializer_constant_valid_p): Check SCALAR_INT_MODE_P instead of INTEGRAL_MODE_P, also break on ! INTEGRAL_TYPE_P and do the same check also on op{0,1}'s type. * c-c++-common/pr105998.c: New test.
2022-06-18PR tree-optimization/105835: Two narrowing patterns for match.pd.Roger Sayle2-0/+33
This patch resolves PR tree-optimization/105835, which is a code quality (dead code elimination) regression at -O1 triggered/exposed by a recent change to canonicalize X&-Y as X*Y. The new (shorter) form exposes some missed optimization opportunities that can be handled by adding some extra simplifications to match.pd. One transformation is to simplify "(short)(x ? 65535 : 0)" into the equivalent "x ? -1 : 0", or more accurately x ? (short)-1 : (short)0", as INTEGER_CSTs record their type, and integer conversions can be pushed inside COND_EXPRs reducing the number of gimple statements. The other transformation is that (short)(X * 65535), where X is [0,1], into the equivalent (short)X * -1, (or again (short)-1 where tree's INTEGER_CSTs encode their type). This is valid because multiplications where one operand is [0,1] are guaranteed not to overflow, and hence integer conversions can also be pushed inside these multiplications. These narrowing conversion optimizations can be identified by range analyses, such as EVRP, but these are only performed at -O2 and above, which is why this regression is only visible with -O1. 2022-06-18 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR tree-optimization/105835 * match.pd (convert (mult zero_one_valued_p@1 INTEGER_CST@2)): Narrow integer multiplication by a zero_one_valued_p operand. (convert (cond @1 INTEGER_CST@2 INTEGER_CST@3)): Push integer conversions inside COND_EXPR where both data operands are integer constants. gcc/testsuite/ChangeLog PR tree-optimization/105835 * gcc.dg/pr105835.c: New test case.
2022-06-17xtensa: Defer storing integer constants into litpool until reloadTakayuki 'January June' Suwa3-5/+9
Storing integer constants into litpool in the early stage of compilation hinders some integer optimizations. In fact, such integer constants are not subject to the constant folding process. For example: extern unsigned short value; extern void foo(void); void test(void) { if (value == 30001) foo(); } .literal_position .literal .LC0, value .literal .LC1, 30001 test: l32r a3, .LC0 l32r a2, .LC1 l16ui a3, a3, 0 extui a2, a2, 0, 16 // runtime zero-extension despite constant bne a3, a2, .L1 j.l foo, a9 .L1: ret.n This patch defers the placement of integer constants into litpool until the start of reload: .literal_position .literal .LC0, value .literal .LC1, 30001 test: l32r a3, .LC0 l32r a2, .LC1 l16ui a3, a3, 0 bne a3, a2, .L1 j.l foo, a9 .L1: ret.n gcc/ChangeLog: * config/xtensa/constraints.md (Y): Change to include integer constants until reload begins. * config/xtensa/predicates.md (move_operand): Ditto. * config/xtensa/xtensa.cc (xtensa_emit_move_sequence): Change to allow storing integer constants into litpool only after reload begins.
2022-06-18Daily bump.GCC Administrator4-1/+74
2022-06-17libgo: permit loff_t and off_t to be macrosIan Lance Taylor1-1/+1
They are macros in musl libc, rather than typedefs, and -fgo-dump-spec doesn't handle that case. Based on patch by Sören Tempel. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/412075
2022-06-17c++: Use fold_non_dependent_expr rather than maybe_constant_value in ↵Jakub Jelinek2-1/+19
__builtin_shufflevector handling [PR106001] In this case the STATIC_CAST_EXPR expressions in the call aren't type nor value dependent, but maybe_constant_value still ICEs on those when processing_template_decl. Calling fold_non_dependent_expr on it instead fixes the ICE and folds them to INTEGER_CSTs. 2022-06-17 Jakub Jelinek <jakub@redhat.com> PR c++/106001 * typeck.cc (build_x_shufflevector): Use fold_non_dependent_expr instead of maybe_constant_value. * g++.dg/ext/builtin-shufflevector-4.C: New test.
2022-06-17alpha: Introduce target specific store_data_bypass_p function [PR105209]Uros Bizjak4-11/+101
This patch introduces alpha-specific version of store_data_bypass_p that ignores TRAP_IF that would result in assertion failure (and internal compiler error) in the generic store_data_bypass_p function. While at it, also remove ev4_ist_c reservation, store_data_bypass_p can handle the patterns with multiple sets since some time ago. 2022-06-17 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/105209 * config/alpha/alpha-protos.h (alpha_store_data_bypass_p): New. * config/alpha/alpha.cc (alpha_store_data_bypass_p): New function. (alpha_store_data_bypass_p_1): Ditto. * config/alpha/ev4.md: Use alpha_store_data_bypass_p instead of generic store_data_bypass_p. (ev4_ist_c): Remove insn reservation. gcc/testsuite/ChangeLog: PR target/105209 * gcc.target/alpha/pr105209.c: New test.
2022-06-17i386: Fix assert in ix86_function_arg [PR105970]Uros Bizjak2-1/+7
The mode of pointer argument should equal ptr_mode, not Pmode. 2022-06-17 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/105970 * config/i386/i386.cc (ix86_function_arg): Assert that the mode of pointer argumet is equal to ptr_mode, not Pmode. gcc/testsuite/ChangeLog: PR target/105970 * gcc.target/i386/pr105970.c: New test.
2022-06-17i386: Fix VPMOV splitter [PR105993]Uros Bizjak2-14/+34
REGNO should not be used with register_operand before reload because subregs of registers or even subregs of memory match the predicate. The build with RTL checking enabled does not tolerate REGNO with non-reg operand. The patch splits the splitter into two related splitters and uses (match_dup ...) RTXes instead of REGNO comparisons. 2022-06-17 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/105993 * config/i386/sse.md (vpmov splitter): Use (match_dup ...) instead of REGNO comparisons in combine splitter. gcc/testsuite/ChangeLog: PR target/105993 * gcc.target/i386/pr105993.c: New test.
2022-06-17rs6000: Fix some error messages for invalid conversionsSegher Boessenkool1-4/+4
"* something" isn't a type. "something *" is. 2022-06-17 Segher Boessenkool <segher@kernel.crashing.org> * config/rs6000/rs6000.cc (rs6000_invalid_conversion): Correct some types.
2022-06-17RISC-V: Supress warning for comparison of integer expressions of different ↵Kito Cheng1-1/+1
signedness gcc/ChangeLog: * config/riscv/bitmanip.md: Supress warning.
2022-06-17arm: fix checking ICE in arm_print_operand [PR106004]Richard Earnshaw1-1/+2
Sigh, another instance where I incorrectly used XUINT instead of UINTVAL. I've also made the code here a little more robust (although I think this case can't in fact be reached) if the 32-bit clear mask includes bit 31. This case, if reached, would print out an out-of-range value based on the size of the compiler's HOST_WIDE_INT type due to sign-extension. We avoid this by masking the value after inversion. gcc/ChangeLog: PR target/106004 * config/arm/arm.cc (arm_print_operand, case 'V'): Use UINTVAL. Clear bits in the mask above bit 31.
2022-06-17arm: mve: Don't force trivial vector literals to the poolRichard Earnshaw2-337/+311
A bug in the ordering of the operands in the mve_mov<mode> pattern meant that all literal values were being pushed to the literal pool. This patch fixes that and simplifies some of the logic slightly so that we can use as simple switch statement. For example: void f (uint32_t *a) { int i; for (i = 0; i < 100; i++) a[i] += 1; } Now compiles to: push {lr} mov lr, #25 vmov.i32 q2, #0x1 @ v4si ... instead of push {lr} mov lr, #25 vldr.64 d4, .L6 vldr.64 d5, .L6+8 ... .L7: .align 3 .L6: .word 1 .word 1 .word 1 .word 1 gcc/ChangeLog: * config/arm/mve.md (*mve_mov<mode>): Re-order constraints to avoid spilling trivial literals to the constant pool. gcc/testsuite/ChangeLog: * gcc.target/arm/acle/cde-mve-full-assembly.c: Adjust expected output.
2022-06-17Daily bump.GCC Administrator6-1/+218
2022-06-16gimple-ssa-warn-access.cc: add missing auto_diagnostic_groupDavid Malcolm1-6/+22
Whilst working on SARIF output I noticed some places where followup notes weren't being properly associated with their warnings in gcc/gimple-ssa-warn-access.cc. Fixed thusly. gcc/ChangeLog: * gimple-ssa-warn-access.cc (warn_string_no_nul): Add auto_diagnostic_group to group any warning with its note. (maybe_warn_for_bound): Likewise. (check_access): Likewise. (warn_dealloc_offset): Likewise. (pass_waccess::maybe_warn_memmodel): Likewise. (pass_waccess::maybe_check_dealloc_call): Likewise. (pass_waccess::warn_invalid_pointer): Likewise. (pass_waccess::check_dangling_stores): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-06-16c-decl: fix "inform" grouping and conditionalizationDavid Malcolm1-23/+42
Whilst working on SARIF output I noticed some places where followup notes weren't being properly associated with their errors/warnings in c-decl.cc. Whilst fixing those I noticed some places where we "inform" after a "warning" without checking that the warning was actually emitted. Fixed the various issues seen in gcc/c/c-decl.cc thusly. gcc/c/ChangeLog: * c-decl.cc (implicitly_declare): Add auto_diagnostic_group to group the warning with any note. (warn_about_goto): Likewise to group error or warning with note. Bail out if the warning wasn't emitted, to avoid emitting orphan notes. (lookup_label_for_goto): Add auto_diagnostic_group to group the error with the note. (check_earlier_gotos): Likewise. (c_check_switch_jump_warnings): Likewise for any error/warning. Conditionalize emission of the notes. (diagnose_uninitialized_cst_member): Likewise for warning, conditionalizing emission of the note. (grokdeclarator): Add auto_diagnostic_group to group the "array type has incomplete element type" error with any note. (parser_xref_tag): Add auto_diagnostic_group to group warnings with their notes. Conditionalize emission of notes. (start_struct): Add auto_diagnostic_group to group the "redefinition of" errors with any note. (start_enum): Likewise for "redeclaration of %<enum %E%>" error. (check_for_loop_decls): Likewise for pre-C99 error. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-06-16analyzer: associate -Wanalyzer-va-arg-type-mismatch with CWE-686David Malcolm2-6/+9
gcc/analyzer/ChangeLog: * varargs.cc (va_arg_type_mismatch::emit): Associate the warning with CWE-686 ("Function Call With Incorrect Argument Type"). gcc/testsuite/ChangeLog: * gcc.dg/analyzer/stdarg-1.c (__analyzer_called_by_test_type_mismatch_1): Verify that -Wanalyzer-va-arg-type-mismatch is associated with CWE-686. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-06-16analyzer: associate -Wanalyzer-va-list-exhausted with CWE-685David Malcolm2-4/+8
gcc/analyzer/ChangeLog: * varargs.cc: Include "diagnostic-metadata.h". (va_list_exhausted::emit): Associate the warning with CWE-685 ("Function Call With Incorrect Number of Arguments"). gcc/testsuite/ChangeLog: * gcc.dg/analyzer/stdarg-1.c (__analyzer_called_by_test_not_enough_args): Verify that -Wanalyzer-va-list-exhausted is associated with CWE-685. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-06-16analyzer: associate -Wanalyzer-double-fclose with CWE-1341David Malcolm2-4/+7
gcc/analyzer/ChangeLog: * sm-file.cc (double_fclose::emit): Associate the warning with CWE-1341 ("Multiple Releases of Same Resource or Handle"). gcc/testsuite/ChangeLog: * gcc.dg/analyzer/file-1.c (test_1): Verify that double-fclose is associated with CWE-1341. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-06-16opts: fix opts_set->x_flag_sanitizeJason Merrill1-0/+1
While working on PR104642 I noticed this wasn't getting set. gcc/ChangeLog: * opts.cc (common_handle_option) [OPT_fsanitize_]: Set opts_set->x_flag_sanitize.
2022-06-16flags: add commentJason Merrill1-1/+1
gcc/ChangeLog: * flags.h (issue_strict_overflow_warning): Comment #endif.
2022-06-16compiler: don't generate stubs for ambiguous direct interface methodsMikhail Ablakatov2-2/+2
Current implementation checks whether it has to generate a stub method for a promoted method of an embedded struct field in Type::build_stub_methods(). If the promoted method is ambiguous it's simply skipped. But struct types that can fit in an interface value (e.g. structs that consist of a single pointer field) get a second chance in Type::build_direct_iface_stub_methods(). This patch adds the same check used by Type::build_stub_methods() to Type::build_direct_iface_stub_methods(). Fixes golang/go#52870 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/405974
2022-06-16c++: Elide inactive initializer fns from init arrayNathan Sidwell3-46/+53
There's no point adding no-op initializer fns (that a module might have) to the static initializer list. Also, we can add any objc initializer call to a partial initializer function and simplify some control flow. gcc/cp/ * decl2.cc (finish_objects): Add startp parameter, adjust. (generate_ctor_or_dtor_function): Detect empty fn, and don't generate unnecessary code. Remove objc startup here ... (c_parse_final_cleanyps): ... do it here. gcc/testsuite/ * g++.dg/modules/init-2_b.C: Add init check. * g++.dg/modules/init-2_c.C: Add init check.
2022-06-16Clear invariant bit for inferred ranges.Andrew MacLeod3-5/+14
The range of an invariant SSA (no outgoing edge range anywhere) is not tracked. If an inferred range is registered, remove the invariant flag. * gimple-range-cache.cc (ranger_cache::apply_inferred_ranges): If name was invaraint before, clear the invariant bit. * gimple-range-gori.cc (gori_map::set_range_invariant): Add a flag. * gimple-range-gori.h (gori_map::set_range_invariant): Adjust prototype.
2022-06-16Propagator should call value_of_stmt.Andrew MacLeod1-1/+1
When evaluating the LHS of a stmt, its more efficent/better to call value_of_stmt directly rather than value_of_expr. * tree-ssa-propagate.cc (before_dom_children): Call value_of_stmt.
2022-06-16match.pd: Improve y == MIN || x < y optimization [PR105983]Jakub Jelinek2-2/+19
On the following testcase, we only optimize bar where this optimization is performed at GENERIC folding time, but on GIMPLE it doesn't trigger anymore, as we actually don't see (bit_and (ne @1 min_value) (ge @0 @1)) but (bit_and (ne @1 min_value) (le @1 @0)) genmatch handles :c modifier not just on commutative operations, but also comparisons and in that case it means it swaps the comparison. 2022-06-16 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/105983 * match.pd (y == XXX_MIN || x < y -> x <= y - 1, y != XXX_MIN && x >= y -> x > y - 1): Use :cs instead of :s on non-equality comparisons. * gcc.dg/tree-ssa/pr105983.c: New test.
2022-06-16match.pd: Fix up __builtin_mul_overflow_p signed type optimization [PR105984]Jakub Jelinek2-5/+23
Earlier in the simplification pattern, we require that @0 has compatible type to the type of IMAGPART_EXPR, but for @1 which is a non-zero constant all we require is that it the constant fits into that type. Later the code checks if the constant is negative, because when min / max values are divided by negative divisor, lo will be higher than hi. In the following testcase, @1 has unsigned char type, while @0 has int type, so @1 which is 254 is wi::neg_p and we were swapping lo and hi, even when @1 cast to int isn't negative. We could use tree_int_cst_sgn (@1) < 0 as the check instead and it would work both for narrower types of @1 and even same or wider ones, but I've noticed we probably don't want to call fold_convert (TREE_TYPE (@0), @1) twice and when we save that result in a temporary, we can just use wi::neg_p on that temporary. 2022-06-16 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/105984 * match.pd (__builtin_mul_overflow_p (x, cst, (stype) 0) -> x > stype_max / cst || x < stype_min / cst): fold_convert @1 to TREE_TYPE (@0) just once and test for negative divisor also on that folded constant instead of on @1. * gcc.c-torture/execute/pr105984.c: New test.
2022-06-16expand: Fix up IFN_ATOMIC_{BIT*,*CMP_0} expansion [PR105951]Jakub Jelinek4-16/+64
Both IFN_ATOMIC_BIT_TEST_AND_* and IFN_ATOMIC_*_FETCH_CMP_0 ifns are matched if their corresponding optab is implemented for the particular mode. The fact that those optabs are implemented doesn't guarantee they will succeed though, they can just FAIL in their expansion. The expansion in that case uses expand_atomic_fetch_op as fallback, but as has been reported and and can be reproduced on the testcases, even those can fail and we didn't have any fallback after that. For IFN_ATOMIC_BIT_TEST_AND_* we actually have such calls. One is done whenever we lost lhs of the ifn at some point in between matching it in tree-ssa-ccp.cc and expansion. The following patch for that case just falls through and expands as if there was a lhs, creates a temporary for it. For the other expand_atomic_fetch_op call in the same expander and for the only expand_atomic_fetch_op call in the other, this falls back the hard way, by constructing a CALL_EXPR to the call from which the ifn has been matched and expanding that. Either it is lucky and manages to expand inline, or it emits a libatomic API call. So that we don't have to rediscover which builtin function to call in the fallback, we record at tree-ssa-ccp.cc time gimple_call_fn (call) in an extra argument to the ifn. 2022-06-16 Jakub Jelinek <jakub@redhat.com> PR middle-end/105951 * tree-ssa-ccp.cc (optimize_atomic_bit_test_and, optimize_atomic_op_fetch_cmp_0): Remember gimple_call_fn (call) as last argument to the internal functions. * builtins.cc (expand_ifn_atomic_bit_test_and): Adjust for the extra call argument to ifns. If expand_atomic_fetch_op fails for the lhs == NULL_TREE case, fall through into the optab code with gen_reg_rtx (mode) as target. If second expand_atomic_fetch_op fails, construct a CALL_EXPR and expand that. (expand_ifn_atomic_op_fetch_cmp_0): Adjust for the extra call argument to ifns. If expand_atomic_fetch_op fails, construct a CALL_EXPR and expand that. * gcc.target/i386/pr105951-1.c: New test. * gcc.target/i386/pr105951-2.c: New test.
2022-06-16rs6000: add V1TI into vector comparison expand [PR103316]Haochen Gui4-145/+239
This patch adds V1TI mode into a new mode iterator used in vector comparison,shift and rotation expands. It also merges some vector comparison, shift and rotation expands for V1T1 and other vector integer modes as they have the similar patterns. The expands for V1TI only are removed. gcc/ PR target/103316 * config/rs6000/rs6000-builtin.cc (rs6000_gimple_fold_builtin): Enable gimple folding for RS6000_BIF_VCMPEQUT, RS6000_BIF_VCMPNET, RS6000_BIF_CMPGE_1TI, RS6000_BIF_CMPGE_U1TI, RS6000_BIF_VCMPGTUT, RS6000_BIF_VCMPGTST, RS6000_BIF_CMPLE_1TI, RS6000_BIF_CMPLE_U1TI. * config/rs6000/vector.md (VEC_IC): New mode iterator. Add support for new Power10 V1TI instructions. (vec_cmp<mode><mode>): Set mode iterator to VEC_IC. (vec_cmpu<mode><mode>): Likewise. (vector_nlt<mode>): Set mode iterator to VEC_IC. (vector_nltv1ti): Remove. (vector_gtu<mode>): Set mode iterator to VEC_IC. (vector_gtuv1ti): Remove. (vector_nltu<mode>): Set mode iterator to VEC_IC. (vector_nltuv1ti): Remove. (vector_geu<mode>): Set mode iterator to VEC_IC. (vector_ngt<mode>): Likewise. (vector_ngtv1ti): Remove. (vector_ngtu<mode>): Set mode iterator to VEC_IC. (vector_ngtuv1ti): Remove. (vector_gtu_<mode>_p): Set mode iterator to VEC_IC. (vector_gtu_v1ti_p): Remove. (vrotl<mode>3): Set mode iterator to VEC_IC. Emit insns for V1TI. (vrotlv1ti3): Remove. (vashr<mode>3): Set mode iterator to VEC_IC. Emit insns for V1TI. (vashrv1ti3): Remove. gcc/testsuite/ PR target/103316 * gcc.target/powerpc/pr103316.c: New. * gcc.target/powerpc/fold-vec-cmp-int128.c: New.
2022-06-16clang: fix -Wunused-parameter warningMartin Liska1-1/+1
Fixes: gcc/cp/decl2.cc:158:54: warning: unused parameter 'entry' [-Wunused-parameter] gcc/cp/ChangeLog: * decl2.cc (struct priority_map_traits): Remove unused param.
2022-06-16gengtype: do not skip char after escape sequnceMartin Liska1-10/+0
Right now, when a \$x escape sequence occures, the next character after $x is skipped, which is bogus. The code has very low coverage right now. gcc/ChangeLog: * gengtype-state.cc (read_a_state_token): Do not skip extra character after escaped sequence.
2022-06-16opts: improve option suggestionMartin Liska2-3/+30
In case where we have 2 equally good candidates like -ftrivial-auto-var-init= -Wtrivial-auto-var-init for -ftrivial-auto-var-init, we should take the candidate that has a difference in trailing sign symbol. PR driver/105564 gcc/ChangeLog: * spellcheck.cc (test_find_closest_string): Add new test. * spellcheck.h (class best_match): Prefer a difference in trailing sign symbol.
2022-06-16RISC-V/testsuite: Fix pr105666.c under rv32Jia-wei Chen1-1/+1
In rv32 regression test, this cases will report an error: "cc1: error: ABI requires '-march=rv32'" Add '-mabi' option will fix this. gcc/testsuite/ChangeLog: * gcc.target/riscv/pr105666.c: New options.
2022-06-16Simplify (B * v + C) * D -> BD* v + CD when B,C,D are all INTEGER_CST.liuhongt7-5/+247
Similar for (v + B) * C + D -> C * v + BCD. Don't simplify it when there's overflow and overflow is UB for type v. gcc/ChangeLog: PR tree-optimization/53533 * match.pd: Simplify (B * v + C) * D -> BD * v + CD and (v + B) * C + D -> C * v + BCD when B,C,D are all INTEGER_CST, and there's no overflow or !TYPE_OVERFLOW_UNDEFINED. gcc/testsuite/ChangeLog: * gcc.target/i386/pr53533-1.c: New test. * gcc.target/i386/pr53533-2.c: New test. * gcc.target/i386/pr53533-3.c: New test. * gcc.target/i386/pr53533-4.c: New test. * gcc.target/i386/pr53533-5.c: New test. * gcc.dg/vect/slp-11a.c: Adjust testcase.
2022-06-16Daily bump.GCC Administrator6-1/+353
2022-06-15xtensa: Eliminate [DS]Cmode hard register clobber that is immediately ↵Takayuki 'January June' Suwa1-0/+28
followed by whole overwrite the register RTL expansion of substitution to [DS]Cmode hard register includes obstructive register clobber. A simplest example: double _Complex test(double _Complex c) { return c; } will be converted to: (set (reg:DF 42 [ c ]) (reg:DF 2 a2)) (set (reg:DF 43 [ c+8 ]) (reg:DF 4 a4)) (clobber (reg:DC 2 a2)) (set (reg:DF 2 a2) (reg:DF 42 [ c ])) (set (reg:DF 4 a4) (reg:DF 43 [ c+8 ])) (use (reg:DC 2 a2)) (return) and then finally: test: mov a8, a2 mov a9, a3 mov a6, a4 mov a7, a5 mov a2, a8 mov a3, a9 mov a4, a6 mov a5, a7 ret As you see, it is so ridiculous. This patch eliminates such clobber in order to prune away the wasted move instructions by the optimizer: test: ret gcc/ChangeLog: * config/xtensa/xtensa.md (DSC): New split pattern and mode iterator.
2022-06-15xtensa: Eliminate unwanted reg-reg moves during DFmode input reloadsTakayuki 'January June' Suwa2-0/+44
When spilled DFmode registers are reloaded in, once loaded into a pair of SImode regs and then copied from that regs. Such unwanted reg-reg moves seems not to be eliminated at the "cprop_hardreg" stage, despite no problem in output reloads. Luckily it is easy to resolve such inefficiencies, with the use of peephole2 pattern. gcc/ChangeLog: * config/xtensa/predicates.md (reload_operand): New predicate. * config/xtensa/xtensa.md: New peephole2 pattern.
2022-06-15xtensa: Add some dedicated patterns that correspond to GIMPLE canonicalizationsTakayuki 'January June' Suwa1-0/+45
This patch offers better RTL representations against straightforward derivations from some tree optimizers' canonicalized forms. - rounding up to even, such as '(x + (x & 1))', is canonicalized to '((x + 1) & -2)', but the former is one instruction less than the latter in Xtensa ISA. - signed greater or equal to zero as logical value '((signed)x >= 0)', is canonicalized to '((unsigned)(x ^ -1) >> 31)', but the equivalent '(((signed)x >> 31) + 1)' is one instruction less. gcc/ChangeLog: * config/xtensa/xtensa.md (*round_up_to_even): New insn-and-split pattern. (*signed_ge_zero): Ditto.
2022-06-15xtensa: Add support for sibling call optimizationTakayuki 'January June' Suwa4-20/+155
This patch introduces support for sibling call optimization, when call0 ABI is in effect. gcc/ChangeLog: * config/xtensa/xtensa-protos.h (xtensa_prepare_expand_call, xtensa_emit_sibcall): New prototypes. (xtensa_expand_epilogue): Add new argument that specifies whether or not sibling call. * config/xtensa/xtensa.cc (TARGET_FUNCTION_OK_FOR_SIBCALL): New macro definition. (xtensa_prepare_expand_call): New function in order to share the common code. (xtensa_emit_sibcall, xtensa_function_ok_for_sibcall): New functions. (xtensa_expand_epilogue): Add new argument sibcall_p and use it for sibling call handling. * config/xtensa/xtensa.md (call, call_value): Use xtensa_prepare_expand_call. (call_internal, call_value_internal): Add the condition in order to be disabled if sibling call. (sibcall, sibcall_value, sibcall_epilogue): New expansions. (sibcall_internal, sibcall_value_internal): New insn patterns, and split ones in order to take care of the indirect sibcalls. gcc/testsuite/ChangeLog: * gcc.target/xtensa/sibcalls.c: New.
2022-06-15xtensa: Document new -mextra-l32r-costs= Xtensa-specific optionTakayuki 'January June' Suwa1-1/+10
gcc/ChangeLog: * doc/invoke.texi: Document -mextra-l32r-costs= option.