aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2025-04-30tree-optimization/119960 - failed external SLP promotionRichard Biener2-7/+71
The following addresses a too conservative sanity check of SLP nodes we want to promote external. The issue lies in code generation for such external which relies on get_later_stmt to figure an insert location. But get_later_stmt relies on the ability to totally order stmts, specifically implementation-wise that they are all from the same BB, which is what is verified at the moment. The patch changes this to require stmts to be orderable by dominance queries. For simplicity and seemingly enough for the testcase in PR119960, this handles the case of two distinct BBs. PR tree-optimization/119960 * tree-vect-slp.cc (vect_slp_can_convert_to_external): Handle cases where defs from multiple BBs are ordered by their dominance relation. * gcc.dg/vect/bb-slp-pr119960-1.c: New testcase.
2025-04-30ipa/120006 - wrong code with IPA PTARichard Biener2-0/+67
When PTA gets support for special-handling more builtins in find_func_aliases the corresponding code in find_func_clobbers needs updating as well since for unhandled cases it assumes the former will populate ESCAPED accordingly. The following fixes a few omissions, the testcase runs into the missing strdup handling. I believe the more advanced handling using modref results and fnspecs opened a larger gap, the proper fix is to merge both functions, gating the clobber/use part on a parameter to avoid diverging. PR ipa/120006 * tree-ssa-structalias.cc (find_func_clobbers): Handle strdup, strndup, realloc, index, strchr, strrchr, memchr, strstr, strpbrk builtins like find_func_aliases does. * gcc.dg/torture/pr120006.c: New testcase.
2025-04-30tree-optimization/120003 - missed jump threadingRichard Biener3-7/+24
The following allows the entry and exit block of a jump thread path to be equal, which can easily happen when there isn't a forwarder on the interesting edge for an FSM thread conditional. We just don't want to enlarge the path from such a block. PR tree-optimization/120003 * tree-ssa-threadbackward.cc (back_threader::find_paths_to_names): Allow block re-use but do not enlarge the path beyond such a re-use. * gcc.dg/tree-ssa/ssa-thread-23.c: New testcase. * gcc.dg/tree-ssa/ssa-dom-thread-7.c: Adjust.
2025-04-30Fix GNAT build failure for x86/FreeBSDEric Botcazou2-0/+173
gcc/ada/ PR ada/112958 * Makefile.rtl (LIBGNAT_TARGET_PAIRS) [x86 FreeBSD]: Add specific version of s-dorepr.adb. * libgnat/s-dorepr__freebsd.adb: New file.
2025-04-30AVR: target/119989 - Add missing clobbers to xload_<mode>_libgcc.Georg-Johann Lay10-0/+97
libgcc's __xload_1...4 is clobbering Z (and also R21 is some cases), but avr.md had clobbers of respective GPRs only up to reload. Outcome was that code reading from the same __memx address twice could be wrong. This patch adds respective clobbers. Forward-port from 2025-04-30 r14-11703 PR target/119989 gcc/ * config/avr/avr.md (xload_<mode>_libgcc): Clobber R21, Z. gcc/testsuite/ * gcc.target/avr/torture/pr119989.h: New file. * gcc.target/avr/torture/pr119989-memx-1.c: New test. * gcc.target/avr/torture/pr119989-memx-2.c: New test. * gcc.target/avr/torture/pr119989-memx-3.c: New test. * gcc.target/avr/torture/pr119989-memx-4.c: New test. * gcc.target/avr/torture/pr119989-flashx-1.c: New test. * gcc.target/avr/torture/pr119989-flashx-2.c: New test. * gcc.target/avr/torture/pr119989-flashx-3.c: New test. * gcc.target/avr/torture/pr119989-flashx-4.c: New test. (cherry picked from commit 1ca1c1fc3b58ae5e1d3db4f5a2014132fe69f82a)
2025-04-30RISC-V: Allow different dynamic floating point mode to be merged [PR119832]Kito Cheng2-0/+64
Although we already try to set the mode needed to FRM_DYN after a function call, there are still some corner cases where both FRM_DYN and FRM_DYN_CALL may appear on incoming edges. Therefore, we use TARGET_MODE_CONFLUENCE to tell GCC that FRM_DYN, FRM_DYN_CALL, and FRM_DYN_EXIT modes are compatible. gcc/ChangeLog: PR target/119832 * config/riscv/riscv.cc (riscv_dynamic_frm_mode_p): New. (riscv_mode_confluence): New. (TARGET_MODE_CONFLUENCE): Define to riscv_mode_confluence. gcc/testsuite/ChangeLog: PR target/119832 * g++.target/riscv/pr119832.C: New test.
2025-04-30RISC-V: Fix missing implied Zicsr from Zve32xJerry Zhang Jian2-27/+8
The Zve32x extension depends on the Zicsr extension. Currently, enabling Zve32x alone does not automatically imply Zicsr in GCC. gcc/ChangeLog: * common/config/riscv/riscv-common.cc: Add Zve32x depends on Zicsr gcc/testsuite/ChangeLog: * gcc.target/riscv/predef-19.c: set the march to rv64im_zve32x instead of rv64gc_zve32x to avoid Zicsr implied by g. Extra m is added to avoid current 'V' extension requires 'M' extension Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com>
2025-04-30AArch64: Fold LD1/ST1 with ptrue to LDR/STR for 128-bit VLSJennifer Schmitz6-96/+118
If -msve-vector-bits=128, SVE loads and stores (LD1 and ST1) with a ptrue predicate can be replaced by neon instructions (LDR and STR), thus avoiding the predicate altogether. This also enables formation of LDP/STP pairs. For example, the test cases svfloat64_t ptrue_load (float64_t *x) { svbool_t pg = svptrue_b64 (); return svld1_f64 (pg, x); } void ptrue_store (float64_t *x, svfloat64_t data) { svbool_t pg = svptrue_b64 (); return svst1_f64 (pg, x, data); } were previously compiled to (with -O2 -march=armv8.2-a+sve -msve-vector-bits=128): ptrue_load: ptrue p3.b, vl16 ld1d z0.d, p3/z, [x0] ret ptrue_store: ptrue p3.b, vl16 st1d z0.d, p3, [x0] ret Now the are compiled to: ptrue_load: ldr q0, [x0] ret ptrue_store: str q0, [x0] ret The implementation includes the if-statement if (known_eq (GET_MODE_SIZE (mode), 16) && aarch64_classify_vector_mode (mode) == VEC_SVE_DATA) which checks for 128-bit VLS and excludes partial modes with a mode size < 128 (e.g. VNx2QI). The patch was bootstrapped and tested on aarch64-linux-gnu, no regression. OK for mainline? Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com> gcc/ * config/aarch64/aarch64.cc (aarch64_emit_sve_pred_move): Fold LD1/ST1 with ptrue to LDR/STR for 128-bit VLS. gcc/testsuite/ * gcc.target/aarch64/sve/ldst_ptrue_128_to_neon.c: New test. * gcc.target/aarch64/sve/cond_arith_6.c: Adjust expected outcome. * gcc.target/aarch64/sve/pcs/return_4_128.c: Likewise. * gcc.target/aarch64/sve/pcs/return_5_128.c: Likewise. * gcc.target/aarch64/sve/pcs/struct_3_128.c: Likewise.
2025-04-30RISC-V: Add intrinsics testcases for SiFive Xsfvcp extensions.yulong4-0/+465
This commit adds testcases for Xsfvcp. Co-Authored by: Jiawei Chen <jiawei@iscas.ac.cn> Co-Authored by: Shihua Liao <shihua@iscas.ac.cn> Co-Authored by: Yixuan Chen <chenyixuan@iscas.ac.cn> gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/xsfvector/sf_vc_f.c: New test. * gcc.target/riscv/rvv/xsfvector/sf_vc_i.c: New test. * gcc.target/riscv/rvv/xsfvector/sf_vc_v.c: New test. * gcc.target/riscv/rvv/xsfvector/sf_vc_x.c: New test.
2025-04-30RISC-V: Add intrinsics support for SiFive Xsfvcp extensions.yulong17-8/+1562
This version is same as v5, but rebase to trunk, send out to trigger CI. This commit adds intrinsics support for Xsfvcp extension. Diff with V4: Delete the sifive_vector.h file. Co-Authored by: Jiawei Chen <jiawei@iscas.ac.cn> Co-Authored by: Shihua Liao <shihua@iscas.ac.cn> Co-Authored by: Yixuan Chen <chenyixuan@iscas.ac.cn> gcc/ChangeLog: * config/riscv/constraints.md (Ou01): New constraint. (Ou02): Ditto. * config/riscv/generic-vector-ooo.md (vec_sf_vcp): New reservation. * config/riscv/genrvv-type-indexer.cc (main): New type. * config/riscv/riscv-c.cc (riscv_pragma_intrinsic): Add xsfvcp strings. * config/riscv/riscv-vector-builtins-shapes.cc (struct sf_vcix_se_def): New function. (struct sf_vcix_def): Ditto. (SHAPE): Ditto. * config/riscv/riscv-vector-builtins-shapes.h: Ditto. * config/riscv/riscv-vector-builtins-types.def (DEF_RVV_X2_U_OPS): New type. (DEF_RVV_X2_WU_OPS): Ditto. (vuint8mf8_t): Ditto. (vuint8mf4_t): Ditto. (vuint8mf2_t): Ditto. (vuint8m1_t): Ditto. (vuint8m2_t): Ditto. (vuint8m4_t): Ditto. (vuint16mf4_t): Ditto. (vuint16mf2_t): Ditto. (vuint16m1_t): Ditto. (vuint16m2_t): Ditto. (vuint16m4_t): Ditto. (vuint32mf2_t): Ditto. (vuint32m1_t): Ditto. (vuint32m2_t): Ditto. (vuint32m4_t): Ditto. * config/riscv/riscv-vector-builtins.cc (DEF_RVV_X2_U_OPS): New builtins def. (DEF_RVV_X2_WU_OPS): Ditto. (rvv_arg_type_info::get_scalar_float_type): Ditto. (function_instance::modifies_global_state_p): Ditto. * config/riscv/riscv-vector-builtins.def (v_x): New base type. (i): Ditto. (v_i): Ditto. (xv): Ditto. (iv): Ditto. (fv): Ditto. (vvv): Ditto. (xvv): Ditto. (ivv): Ditto. (fvv): Ditto. (vvw): Ditto. (xvw): Ditto. (ivw): Ditto. (fvw): Ditto. (v_vv): Ditto. (v_xv): Ditto. (v_iv): Ditto. (v_fv): Ditto. (v_vvv): Ditto. (v_xvv): Ditto. (v_ivv): Ditto. (v_fvv): Ditto. (v_vvw): Ditto. (v_xvw): Ditto. (v_ivw): Ditto. (v_fvw): Ditto. (x2_vector): Ditto. (scalar_float): Ditto. * config/riscv/riscv-vector-builtins.h (enum required_ext): New extension. (required_ext_to_isa_name): Ditto. (required_extensions_specified): Ditto. (struct rvv_arg_type_info): Ditto. (struct function_group_info): Ditto. * config/riscv/riscv.md: New attr. * config/riscv/sifive-vector-builtins-bases.cc (class sf_vc): New function. (BASE): New base_name. * config/riscv/sifive-vector-builtins-bases.h: New function_base. * config/riscv/sifive-vector-builtins-functions.def (REQUIRED_EXTENSIONS): New intrinsics def. (sf_vc): Ditto. * config/riscv/sifive-vector.md (@sf_vc_x_se<mode>): New RTL mode. (@sf_vc_v_x_se<mode>): Ditto. (@sf_vc_v_x<mode>): Ditto. (@sf_vc_i_se<mode>): Ditto. (@sf_vc_v_i_se<mode>): Ditto. (@sf_vc_v_i<mode>): Ditto. (@sf_vc_vv_se<mode>): Ditto. (@sf_vc_v_vv_se<mode>): Ditto. (@sf_vc_v_vv<mode>): Ditto. (@sf_vc_xv_se<mode>): Ditto. (@sf_vc_v_xv_se<mode>): Ditto. (@sf_vc_v_xv<mode>): Ditto. (@sf_vc_iv_se<mode>): Ditto. (@sf_vc_v_iv_se<mode>): Ditto. (@sf_vc_v_iv<mode>): Ditto. (@sf_vc_fv_se<mode>): Ditto. (@sf_vc_v_fv_se<mode>): Ditto. (@sf_vc_v_fv<mode>): Ditto. (@sf_vc_vvv_se<mode>): Ditto. (@sf_vc_v_vvv_se<mode>): Ditto. (@sf_vc_v_vvv<mode>): Ditto. (@sf_vc_xvv_se<mode>): Ditto. (@sf_vc_v_xvv_se<mode>): Ditto. (@sf_vc_v_xvv<mode>): Ditto. (@sf_vc_ivv_se<mode>): Ditto. (@sf_vc_v_ivv_se<mode>): Ditto. (@sf_vc_v_ivv<mode>): Ditto. (@sf_vc_fvv_se<mode>): Ditto. (@sf_vc_v_fvv_se<mode>): Ditto. (@sf_vc_v_fvv<mode>): Ditto. (@sf_vc_vvw_se<mode>): Ditto. (@sf_vc_v_vvw_se<mode>): Ditto. (@sf_vc_v_vvw<mode>): Ditto. (@sf_vc_xvw_se<mode>): Ditto. (@sf_vc_v_xvw_se<mode>): Ditto. (@sf_vc_v_xvw<mode>): Ditto. (@sf_vc_ivw_se<mode>): Ditto. (@sf_vc_v_ivw_se<mode>): Ditto. (@sf_vc_v_ivw<mode>): Ditto. (@sf_vc_fvw_se<mode>): Ditto. (@sf_vc_v_fvw_se<mode>): Ditto. (@sf_vc_v_fvw<mode>): Ditto. * config/riscv/vector-iterators.md: New iterator. * config/riscv/vector.md: New vtype.
2025-04-30Fix compilation failure on FreeBSDEric Botcazou1-1/+1
[changelog] PR ada/112958 * init.c (__gnat_error_handler) [__FreeBSD__]: Fix typo.
2025-04-30Daily bump.GCC Administrator5-1/+202
2025-04-29Fix cs_interesting_for_ipcp_p wrt flag_profile_partial_training.Jan Hubicka1-6/+4
As noticed by Martin Jambor, I introduced a bug while simplifying cs_interesting_for_ipcp_p and reversed condition for flag_profile_partial_training. Also I noticed that we probably want to consider calls with unintialized counts for cloning so the pass does somehting with -fno-guess-branch-probability even thugh this is probably not very useful in practice. gcc/ChangeLog: * ipa-cp.cc (cs_interesting_for_ipcp_p): Fix handling of uninitialized counts and 0 IPA cost wrt flag_profile_partial_training.
2025-04-29analyzer: fix for older version of GCCMarc Poulhiès2-7/+7
Having both an enum and a variable with the same name triggers an error with gcc 5. exploded-graph.h:351:29: error: ‘status’ is not a class, namespace, or enumeration gcc/analyzer/ChangeLog: * exploded-graph.h (set_status): Rename parameter. * constraint-manager.cc (bound::ensure_closed): Likewise. (range::add_bound): Likewise. Signed-off-by: Marc Poulhiès <dkm@kataplop.net> Reviewed-by: David Malcolm <dmalcolm@redhat.com> Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
2025-04-29d: Use __builtin_clear_padding for zeroing alignment holes after setIain Buclaw4-70/+30
In an earlier change, a wrapper function was added to set CONSTRUCTOR_ZERO_PADDING_BITS on all CONSTRUCTOR nodes. This removes all the old generated calls to built-in memset and memcpy as zero padding is now taken care of by the middle-end. The remaining constructors that weren't getting zero padded was ARRAY_TYPEs, so now `__builtin_clear_padding' is used to fill in all alignment holes in constructed array literals where required. PR d/103044 gcc/d/ChangeLog: * d-tree.h (build_clear_padding_call): New prototype. * d-codegen.cc (build_clear_padding_call): New function. (build_memset_call): Remove generated call to __builtin_memcpy. (build_address): Replace generated call to __builtin_memset with __builtin_clear_padding. (build_array_from_exprs): Likewise. * expr.cc (ExprVisitor::visit (AssignExp *)): Remove generated call to __builtin_memset. (ExprVisitor::visit (ArrayLiteralExp *)): Likewise. Insert call to __builtin_clear_padding after copying array into GC memory. (ExprVisitor::visit (StructLiteralExp *)): Remove generated call to __builtin_memset. * toir.cc (IRVisitor::visit (ReturnStatement *)): Likewise.
2025-04-29simplify-rtx: Combine bitwise operations in more casesPengfei Li2-0/+67
This patch transforms RTL expressions of the form (subreg (not X)) into (not (subreg X)) if the subreg is an operand of another binary logical operation. This transformation can expose opportunities to combine more logical operations. For example, it improves the codegen of the following AArch64 NEON intrinsics: vandq_s64(vreinterpretq_s64_s32(vmvnq_s32(a)), vreinterpretq_s64_s32(b)); from: not v0.16b, v0.16b and v0.16b, v0.16b, v1.16b to: bic v0.16b, v1.16b, v0.16b Regression tested on x86_64-linux-gnu, arm-linux-gnueabihf and aarch64-linux-gnu. gcc/ChangeLog: * simplify-rtx.cc (non_paradoxical_subreg_not_p): New function for pattern match of (subreg (not X)). (simplify_with_subreg_not): New function for simplification.
2025-04-29i386: Disable string insn from non-default AS for Pmode != word_mode [PR111657]Uros Bizjak5-25/+44
0x67 prefix is applied before segment register. That is in rep movsq %gs:(%esi), (%edi) the address is %gs + %esi. In case Pmode != word_mode (x32 with a default -maddress-mode=short) instructions should not allow segment override prefixes. Also, remove explicit addr32 prefix from asm templates because address mode can be determined from explicit instruction operands. Also note that Pmode != word_mode only with TARGET_64BIT, so the check in ix86_print_operand is not needed. PR target/111657 gcc/ChangeLog: * config/i386/i386-expand.cc (alg_usable_p): For Pmode != word_mode reject rep_prefix_{1,4,8}_byte algorithms with src_as in the non-default address space. * config/i386/i386-protos.h (ix86_check_movs): New prototype. * config/i386/i386.cc (ix86_check_movs): New function. (ix86_print_operand) [case '^']: Remove excess check for TARGET_64BIT. * config/i386/i386.md (strmov): For Pmode != word_mode expand with gen_strmov_single only when operands[3] (source) is in the default address space. (*strmovdi_rex_1) Use ix86_check_movs. Remove %^ from asm template. (*strmovsi_1): Ditto. (*strmovhi_1): DItto. (*strmovqi_1): Ditto. (*rep_movdi_rex64): Ditto. (*rep_movsi): Ditto. (*rep_movqi): Ditto. gcc/testsuite/ChangeLog: * gcc.target/i386/pr111657-1.c: Check that segment override is not generated for "rep movsq" for x32 target.
2025-04-29RISC-V: Fix register move cost for SIBCALL_REGS/JALR_REGSZhijin Zeng1-4/+4
SIBCALL_REGS/JALR_REGS are also subset of GR_REGS and need to be taken into acount in riscv_register_move_cost, otherwise it will get a incorrect cost. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_register_move_cost): Use reg_class_subset_p to check the reg class.
2025-04-29tree-optimization/119997 - &ptr->field no longer subject to PRERichard Biener5-42/+93
The following makes PRE handle &ptr->field the same as VN by treating it as a POINTER_PLUS_EXPR when possible and thus as 'nary'. To facilitate this the patch splits out vn_pp_nary_for_addr and adds const overloads for vec::last. The patch also avoids handling an effective zero offset as POINTER_PLUS_EXPR. PR tree-optimization/119997 * vec.h (vec<T, A, vl_embed>::last): Provide const overload. (vec<T, va_heap, vl_ptr>::last): Likewise. * tree-ssa-sccvn.h (vn_pp_nary_for_addr): Declare. * tree-ssa-sccvn.cc (vn_pp_nary_for_addr): Split out from ... (vn_reference_lookup): ... here. (vn_reference_insert): ... and duplicate here. Do not handle zero offset as POINTER_PLUS_EXPR. * tree-ssa-pre.cc (compute_avail): Implement ADDR_EXPR-as-POINTER_PLUS_EXPR special casing. * gcc.dg/tree-ssa/ssa-pre-35.c: New testcase.
2025-04-29i386: Allow string instructions from non-default address space [PR111657]Uros Bizjak3-52/+131
MOVS instructions allow segment override of their source operand, e.g.: rep movsq %gs:(%rsi), (%rdi) where %rsi is the address of the source location (with %gs segment override) and %rdi is the address of the destination location. The testcase improves from (-O2 -mno-sse -mtune=generic): xorl %eax, %eax .L2: movl %eax, %edx addl $8, %eax movq %gs:m(%rdx), %rcx movq %rcx, (%rdi,%rdx) cmpl $240, %eax jb .L2 ret to: movl $m, %esi movl $30, %ecx rep movsq %gs:(%rsi), (%rdi) ret PR target/111657 gcc/ChangeLog: * config/i386/i386-expand.cc (alg_usable_p): Remove have_as bool argument and add dst_as and src_as address space arguments. Reject libcall algorithm with dst_as and src_as in the non-default address spaces. Reject rep_prefix_{1,4,8}_byte algorithms with dst_as in the non-default address space. (decide_alg): Remove have_as bool argument and add dst_as and src_as address space arguments. Update calls to alg_usable_p. (ix86_expand_set_or_cpymem): Update call to decide_alg. * config/i386/i386.md (strmov): Do not fail if operand[3] (source) is in the non-default address space. Expand with gen_strmov_singleop only when operand[1] (destination) is in the default address space. (*strmovdi_rex_1): Determine memory operands from insn pattern. Allow only when destination is in the default address space. Rewrite asm template to use explicit operands. (*strmovsi_1): Ditto. (*strmovhi_1): DItto. (*strmovqi_1): Ditto. (*rep_movdi_rex64): Ditto. (*rep_movsi): Ditto. (*rep_movqi): Ditto. (*strsetdi_rex_1): Determine memory operands from insn pattern. Allow only when destination is in the default address space. (*strsetsi_1): Ditto. (*strsethi_1): Ditto. (*strsetqi_1): Ditto. (*rep_stosdi_rex64): Ditto. (*rep_stossi): Ditto. (*rep_stosqi): Ditto. gcc/testsuite/ChangeLog: * gcc.target/i386/pr111657-1.c: New test.
2025-04-29target.def: Remove TARGET_PROMOTE_FUNCTION_RETURN referenceH.J. Lu2-8/+0
Since TARGET_PROMOTE_FUNCTION_RETURN is no longer used, remove its reference from target.def. PR target/119985 * target.def: Remove TARGET_PROMOTE_FUNCTION_RETURN reference. * doc/tm.texi: Regenerated. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-04-29Annotate empty bb with all debug_stmt with location of phi in the single_succ.hongtao.liu1-3/+43
For an empty BB with all debug_stmt, it will be ignored by afdo_set_bb_count, but it can be set with count of single successors PHIs which edge from the BB. gcc/ChangeLog: PR gcov-profile/118581 * auto-profile.cc (autofdo_source_profile::get_count_info): Overload the function with parameter gimple location instead of stmt. (afdo_set_bb_count): For !has_annotated BB, Check single successors PHIs corresponding to the block and use those count.
2025-04-29debug/78685 - reword -Og documentationRichard Biener1-7/+9
The following rewords the documentation for -Og which over-promises the ability to debug the generated code. While -Og enables var-tracking and thus improves debugging in some areas the experience is usually worse than -O0 for standard C code. PR debug/78685 * doc/invoke.texi (-Og): Reword.
2025-04-29i386: Skip sub-RTXes of memory operand in ix86_update_stack_alignmentUros Bizjak1-5/+10
Skip sub-RTXes of the memory operand if stack access register is not mentioned in the operand. gcc/ChangeLog: * config/i386/i386.cc (ix86_update_stack_alignment): Skip sub-RTXes of the memory operand if stack access register is not mentioned in the operand.
2025-04-29x86: Add a pass to remove redundant all 0s/1s vector loadH.J. Lu10-41/+549
For all different modes of all 0s/1s vectors, we can use the single widest all 0s/1s vector register for all 0s/1s vector uses in the whole function. Add a pass to generate a single widest all 0s/1s vector set instruction at entry of the nearest common dominator for basic blocks with all 0s/1s vector uses. On Linux/x86-64, in cc1plus, this patch reduces the number of vector xor instructions from 4803 to 4714 and pcmpeq instructions from 144 to 142. NB: PR target/92080 and PR target/117839 aren't same. PR target/117839 is for vectors of all 0s and all 1s with different sizes and different components. PR target/92080 is for broadcast of the same component to different vector sizes. This patch covers only all 0s and all 1s cases of PR target/92080. gcc/ PR target/92080 PR target/117839 * config/i386/i386-features.cc (ix86_place_single_vector_set): New function. (remove_partial_avx_dependency): Use it. (ix86_get_vector_load_mode): New function. (replace_vector_const): Likewise. (remove_redundant_vector_load): Likewise. (pass_data_remove_redundant_vector_load): Likewise. (pass_remove_redundant_vector_load): Likewise. (make_pass_remove_redundant_vector_load): Likewise. * config/i386/i386-passes.def: Add pass_remove_redundant_vector_load after pass_remove_partial_avx_dependency. * config/i386/i386-protos.h (make_pass_remove_redundant_vector_load): New. * config/i386/i386.cc (ix86_modes_tieable_p): Return true for narrower non-scalar-integer modes in SSE registers. gcc/testsuite/ PR target/92080 PR target/117839 * gcc.target/i386/pr117839-1a.c: New test. * gcc.target/i386/pr117839-1b.c: Likewise. * gcc.target/i386/pr117839-2.c: Likewise. * gcc.target/i386/pr92080-1.c: Likewise. * gcc.target/i386/pr92080-2.c: Likewise. * gcc.target/i386/pr92080-3.c: Likewise. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-04-29i386: Add ix86_expand_unsigned_small_int_cst_argumentH.J. Lu1-5/+53
When passing 0xff as an unsigned char function argument with the C frontend promotion, expand_normal used to get <integer_cst 0x7fffe6aa23a8 type <integer_type 0x7fffe98225e8 int> constant 255> and returned the rtx value using the sign-extended representation: (const_int 255 [0xff]) But after commit a670ebde3995481225ec62b29686ec07a21e5c10 Author: H.J. Lu <hjl.tools@gmail.com> Date: Thu Nov 21 07:54:35 2024 +0800 Drop targetm.promote_prototypes from C, C++ and Ada frontends expand_normal now gets <integer_cst 0x7fffe9824018 type <integer_type 0x7fffe9822348 unsigned char > constant 255> and returns (const_int -1 [0xffffffffffffffff]) which doesn't work with the predicates nor the instruction templates which expect the unsigned expanded value. Extract the unsigned char and short integer constants to return (const_int 255 [0xff]) so that the expanded value is always unsigned, without the C frontend promotion. PR target/117547 * config/i386/i386-expand.cc (ix86_expand_unsigned_small_int_cst_argument): New function. (ix86_expand_args_builtin): Call ix86_expand_unsigned_small_int_cst_argument to expand the argument before calling fixup_modeless_constant. (ix86_expand_round_builtin): Likewise. (ix86_expand_special_args_builtin): Likewise. (ix86_expand_builtin): Likewise. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-04-29Remove other processors from X86_TUNE_DEST_FALSE_DEP_FOR_GLC except GLCliuhongt1-3/+1
Since the tune if only for GLC(sapphirerapids and alderlake-P). gcc/ChangeLog: * config/i386/x86-tune.def (X86_TUNE_DEST_FALSE_DEP_FOR_GLC): Remove other processor except for GLC since this one is only for GLC.
2025-04-29Daily bump.GCC Administrator9-1/+1463
2025-04-28analyzer: handle NRVO and DECL_BY_REFERENCE [PR111536]David Malcolm14-28/+186
The analyzer was issuing false warnings about uninitialized variables in C++ in places where NRVO was marking DECL_RESULT with DECL_BY_REFERENCE. Fixed thusly. gcc/analyzer/ChangeLog: PR analyzer/111536 * engine.cc (maybe_update_for_edge): Update for new call_stmt param to region_model::push_frame. * program-state.cc (program_state::push_frame): Likewise. * region-model.cc (region_model::update_for_gcall): Likewise. (region_model::push_frame): Add "call_stmt" param. Handle DECL_RESULT with DECL_BY_REFERENCE set on it by stashing the region of the lhs of the call_stmt in the caller frame, and writing a reference to it within the "result" in the callee frame. (region_model::pop_frame): Don't write back to the LHS for DECL_BY_REFERENCE results. (selftest::test_stack_frames): Update for new call_stmt param to region_model::push_frame. (selftest::test_get_representative_path_var): Likewise. (selftest::test_state_merging): Likewise. (selftest::test_alloca): Likewise. * region-model.h (region_model::push_frame): Add "call_stmt" param. * region.cc: Include "tree-ssa.h". (region::can_have_initial_svalue_p): Use ssa_defined_default_def_p for ssa names, rather than special-casing it for just parameters. This should now also cover DECL_RESULT with DECL_BY_REFERENCE and hard registers. * sm-signal.cc (update_model_for_signal_handler): Update for new call_stmt param to region_model::push_frame. * state-purge.cc (state_purge_per_decl::process_worklists): Likewise. gcc/testsuite/ChangeLog: PR analyzer/111536 * c-c++-common/analyzer/hard-reg-1.c: New test. * g++.dg/analyzer/nrvo-1.C: New test. * g++.dg/analyzer/nrvo-2.C: New test. * g++.dg/analyzer/nrvo-pr111536-1.C: New test. * g++.dg/analyzer/nrvo-pr111536-1b.C: New test. * g++.dg/analyzer/nrvo-pr111536-2.C: New test. * g++.dg/analyzer/nrvo-pr111536-2b.C: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: fix null deref false negative on std::unique_ptr [PR109366]David Malcolm3-0/+36
gcc/analyzer/ChangeLog: PR analyzer/109366 * region-model-manager.cc (region_model_manager::maybe_fold_sub_svalue): Sub-values of zero constants are zero. gcc/testsuite/ChangeLog: PR analyzer/109366 * g++.dg/analyzer/unique_ptr-1.C: New test. * g++.dg/analyzer/unique_ptr-2.C: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: initial implementation of exception handling [PR97111]David Malcolm103-77/+2777
This patch adds initial support for exception-handling to -fanalyzer, handling eh_dispatch for regions of type ERT_TRY and ERT_ALLOWED_EXCEPTIONS. I haven't managed yet seen eh_dispatch for regions of type ERT_CLEANUP and ERT_MUST_NOT_THROW in the analyzer; with this patch it will ICE if it sees those. Additionally, this patch only checks for exact matches of exception types, rather than supporting subclasses and references. I'm deferring fixing this for now whilst figuring out how best to interact with the C++ type system; I'm tracking it as PR analyzer/119697. The patch adds event classes for throwing and catching exceptions, and seems to generate readable warnings for the kinds of leak that might occur due to trying to manage resources manually and forgetting about exceptions; for example: exception-leak-1.C: In function ‘int test()’: exception-leak-1.C:7:9: warning: leak of ‘ptr’ [CWE-401] [-Wanalyzer-malloc-leak] 7 | throw 42; | ^~ ‘int test()’: events 1-3 5 | void *ptr = __builtin_malloc (1024); | ~~~~~~~~~~~~~~~~~^~~~~~ | | | (1) allocated here 6 | 7 | throw 42; | ~~ | | | (2) throwing exception of type ‘int’ here... | (3) ⚠️ ‘ptr’ leaks here; was allocated at (1) Although dynamic exception specifications are only available in C++14 and earlier, the need to support them meant it seemed relatively easy to add a warning to check them, hence the patch adds a new warning for code paths that throw an exception that doesn't match a dynamic exception specification: -Wanalyzer-throw-of-unexpected-type. gcc/analyzer/ChangeLog: PR analyzer/97111 * analyzer.cc (is_cxa_throw_p): New. (is_cxa_rethrow_p): New. * analyzer.opt (Wanalyzer-throw-of-unexpected-type): New. * analyzer.opt.urls: Regenerate. * call-info.cc (custom_edge_info::create_enode): New. * call-info.h (call_info::print): Drop "final". (call_info::add_events_to_path): Likewise. * checker-event.cc (event_kind_to_string): Add cases for event_kind::catch_, event_kind::throw_, and event_kind::unwind. (explicit_throw_event::print_desc): New. (throw_from_call_to_external_fn_event::print_desc): New. (unwind_event::print_desc): New. * checker-event.h (enum class event_kind): Add catch_, throw_, and unwind. (class catch_cfg_edge_event): New. (class throw_event): New. (class explicit_throw_event): New. (class throw_from_call_to_external_fn_event): New. (class unwind_event): New. * common.h (class eh_dispatch_cfg_superedge): New forward decl. (class eh_dispatch_try_cfg_superedge): New forward decl. (class eh_dispatch_allowed_cfg_superedge): New forward decl. (custom_edge_info::create_enode): New vfunc decl. (is_cxa_throw_p): New decl. (is_cxa_rethrow_p): New decl. * diagnostic-manager.cc (diagnostic_manager::add_events_for_superedge): Special-case edges for eh_dispach_try. (diagnostic_manager::prune_path): Call consolidate_unwind_events. (diagnostic_manager::prune_for_sm_diagnostic): Don't filter the new event_kinds. (diagnostic_manager::consolidate_unwind_events): New. * diagnostic-manager.h (diagnostic_manager::consolidate_unwind_events): New decl. * engine.cc (exploded_node::on_stmt_pre): Handle "__cxa_throw", "__cxa_rethrow", and resx statements. (class throw_custom_edge): New. (class unwind_custom_edge): New. (get_eh_outedge): New. (exploded_graph::unwind_from_exception): New. (exploded_node::on_throw): New. (exploded_node::on_resx): New. (exploded_graph::get_or_create_node): Add "add_to_worklist" param and use it. (exploded_graph::process_node): Use edge_info's create_enode vfunc to create enodes, rather than calling get_or_create_node directly. Ignore CFG edges in the sgraph flagged with EH whilst we're exploring the egraph. (exploded_graph_annotator::print_enode): Handle case exploded_node::status::special. * exploded-graph.h (exploded_node::status): Add value "special". (exploded_node::on_throw): New decl. (exploded_node::on_resx): New decl. (exploded_graph::get_or_create_node): Add optional "add_to_worklist" param. (exploded_graph::unwind_from_exception): New decl. * kf-lang-cp.cc (class kf_cxa_allocate_exception): New. (class kf_cxa_begin_catch): New. (class kf_cxa_end_catch): New. (class throw_of_unexpected_type): New. (class kf_cxa_call_unexpected): New. (register_known_functions_lang_cp): Register known functions "__cxa_allocate_exception", "__cxa_begin_catch", "__cxa_end_catch", and "__cxa_call_unexpected". * kf.cc (class kf_eh_pointer): New. (register_known_functions): Register it for BUILT_IN_EH_POINTER. * region-model.cc: Include "analyzer/function-set.h". (exception_node::operator==): New. (exception_node::dump_to_pp): New. (exception_node::dump): New. (exception_node::to_json): New. (exception_node::make_dump_widget): New. (exception_node::maybe_get_type): New. (exception_node::add_to_reachable_regions): New. (region_model::region_model): Initialize m_thrown_exceptions_stack and m_caught_exceptions_stack. (region_model::operator=): Likewise. (region_model::operator==): Compare them. (region_model::dump_to_pp): Dump exception stacks. (region_model::to_json): Add exception stacks. (region_model::make_dump_widget): Likewise. (class exception_thrown_from_unrecognized_call): New. (get_fns_assumed_not_to_throw): New. (can_throw_p): New. (region_model::check_for_throw_inside_call): New. (region_model::on_call_pre): Call check_for_throw_inside_call on unknown fns or those we don't have a body for. (region_model::maybe_update_for_edge): Handle eh_dispatch_stmt statements. Drop old code that called apply_constraints_for_exception on EDGE_EH edges. (class rejected_eh_dispatch): New. (exception_matches_type_p): New. (matches_any_exception_type_p): New. (region_model::apply_constraints_for_eh_dispatch): New. (region_model::apply_constraints_for_eh_dispatch_try): New. (region_model::apply_constraints_for_eh_dispatch_allowed): New. (region_model::apply_constraints_for_exception): Delete. (region_model::can_merge_with_p): Don't merge models with non-equal exception stacks. (region_model::get_referenced_base_regions): Add regions from exception stacks. * region-model.h (struct exception_node): New. (region_model::push_thrown_exception): New. (region_model::get_current_thrown_exception): New. (region_model::pop_thrown_exception): New. (region_model::push_caught_exception): New. (region_model::get_current_caught_exception): New. (region_model::pop_caught_exception): New. (region_model::apply_constraints_for_eh_dispatch_try): New decl. (region_model::apply_constraints_for_eh_dispatch_allowed) New decl. (region_model::apply_constraints_for_exception): Delete. (region_model::apply_constraints_for_eh_dispatch): New decl. (region_model::check_for_throw_inside_call): New decl. (region_model::m_thrown_exceptions_stack): New field. (region_model::m_caught_exceptions_stack): New field. * supergraph.cc: Include "except.h" and "analyzer/region-model.h". (supergraph::add_cfg_edge): Special-case eh_dispatch edges. (superedge::get_description): Use default_tree_printer. (get_catch): New. (eh_dispatch_cfg_superedge::make): New. (eh_dispatch_cfg_superedge::eh_dispatch_cfg_superedge): New. (eh_dispatch_cfg_superedge::get_eh_status): New. (eh_dispatch_try_cfg_superedge::dump_label_to_pp): New. (eh_dispatch_try_cfg_superedge::apply_constraints): New. (eh_dispatch_allowed_cfg_superedge::eh_dispatch_allowed_cfg_superedge): New. (eh_dispatch_allowed_cfg_superedge::dump_label_to_pp): New. (eh_dispatch_allowed_cfg_superedge::apply_constraints): New. * supergraph.h: Include "except.h". (superedge::dyn_cast_eh_dispatch_cfg_superedge): New vfunc. (superedge::dyn_cast_eh_dispatch_try_cfg_superedge): New vfunc. (superedge::dyn_cast_eh_dispatch_allowed_cfg_superedge): New vfunc. (class eh_dispatch_cfg_superedge): New. (is_a_helper <const eh_dispatch_cfg_superedge *>::test): New. (class eh_dispatch_try_cfg_superedge): New. (is_a_helper <const eh_dispatch_try_cfg_superedge *>::test): New. (class eh_dispatch_allowed_cfg_superedge): New. (is_a_helper <const eh_dispatch_allowed_cfg_superedge *>::test): New. * svalue.cc (svalue::maybe_get_type_from_typeinfo): New. * svalue.h (svalue::maybe_get_type_from_typeinfo): New decl. gcc/ChangeLog: PR analyzer/97111 * doc/invoke.texi: Add -Wanalyzer-throw-of-unexpected-type. * gimple.h (gimple_call_nothrow_p): Make arg const. gcc/testsuite/ChangeLog: PR analyzer/97111 * c-c++-common/analyzer/analyzer-verbosity-2a.c: Add -fno-exceptions. * c-c++-common/analyzer/analyzer-verbosity-3a.c: Likewise. * c-c++-common/analyzer/attr-const-2.c: Add __attribute__((nothrow)). * c-c++-common/analyzer/attr-malloc-4.c: Likewise. * c-c++-common/analyzer/attr-malloc-5.c: Likewise. * c-c++-common/analyzer/attr-malloc-6.c: Add -fno-exceptions. * c-c++-common/analyzer/attr-malloc-CVE-2019-19078-usb-leak.c: Likewise. * c-c++-common/analyzer/attr-malloc-exception.c: New test. * c-c++-common/analyzer/call-summaries-pr107158-2.c: Add -fno-exceptions. * c-c++-common/analyzer/call-summaries-pr107158.c: Likewise. * c-c++-common/analyzer/capacity-2.c: Likewise. * c-c++-common/analyzer/coreutils-sum-pr108666.c: Likewise. * c-c++-common/analyzer/data-model-22.c: Likewise. * c-c++-common/analyzer/data-model-5d.c: Likewise. * c-c++-common/analyzer/deref-before-check-pr108455-git-pack-revindex.c: Likewise. * c-c++-common/analyzer/deref-before-check-pr108475-haproxy-tcpcheck.c: Likewise. * c-c++-common/analyzer/edges-2.c: Likewise. * c-c++-common/analyzer/fd-2.c: Likewise. * c-c++-common/analyzer/fd-3.c: Likewise. * c-c++-common/analyzer/fd-meaning.c: Likewise. * c-c++-common/analyzer/file-1.c: Likewise. * c-c++-common/analyzer/file-3.c: Likewise. * c-c++-common/analyzer/file-meaning-1.c: Likewise. * c-c++-common/analyzer/infinite-recursion.c: Likewise. * c-c++-common/analyzer/leak-3.c: Likewise. * c-c++-common/analyzer/malloc-dedupe-1.c: Likewise. * c-c++-common/analyzer/malloc-in-loop.c: Likewise. * c-c++-common/analyzer/malloc-many-paths-3.c: Likewise. * c-c++-common/analyzer/malloc-paths-5.c: Likewise. * c-c++-common/analyzer/malloc-paths-7.c: Likewise. * c-c++-common/analyzer/malloc-paths-8.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-1a.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-2.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-3.c: Likewise. * c-c++-common/analyzer/paths-7.c: Likewise. * c-c++-common/analyzer/pr110830.c: Likewise. * c-c++-common/analyzer/pr93032-mztools-simplified.c: Likewise. * c-c++-common/analyzer/pr93355-localealias-feasibility-3.c: Likewise. * c-c++-common/analyzer/pr93355-localealias-simplified.c: Likewise. * c-c++-common/analyzer/pr96650-1-trans.c: Likewise. * c-c++-common/analyzer/pr97072.c: Add __attribute__((nothrow)). * c-c++-common/analyzer/pr98575-1.c: Likewise. * c-c++-common/analyzer/pr99716-1.c: Add -fno-exceptions. * c-c++-common/analyzer/pr99716-2.c: Likewise. * c-c++-common/analyzer/pr99716-3.c: Likewise. * c-c++-common/analyzer/pragma-2.c: Likewise. * c-c++-common/analyzer/rhbz1878600.c: Likewise. * c-c++-common/analyzer/strndup-1.c: Likewise. * c-c++-common/analyzer/write-to-string-literal-4-disabled.c: Likewise. * c-c++-common/analyzer/write-to-string-literal-4.c: Likewise. * c-c++-common/analyzer/write-to-string-literal-5.c: Likewise. * c-c++-common/analyzer/zlib-5.c: Likewise. * g++.dg/analyzer/exception-could-throw-1.C: New test. * g++.dg/analyzer/exception-could-throw-2.C: New test. * g++.dg/analyzer/exception-dynamic-spec.C: New test. * g++.dg/analyzer/exception-leak-1.C: New test. * g++.dg/analyzer/exception-leak-2.C: New test. * g++.dg/analyzer/exception-leak-3.C: New test. * g++.dg/analyzer/exception-leak-4.C: New test. * g++.dg/analyzer/exception-leak-5.C: New test. * g++.dg/analyzer/exception-leak-6.C: New test. * g++.dg/analyzer/exception-nothrow.C: New test. * g++.dg/analyzer/exception-path-1.C: New test. * g++.dg/analyzer/exception-path-catch-all-1.C: New test. * g++.dg/analyzer/exception-path-catch-all-2.C: New test. * g++.dg/analyzer/exception-path-unwind-multiple-2.C: New test. * g++.dg/analyzer/exception-path-unwind-multiple.C: New test. * g++.dg/analyzer/exception-path-unwind-single.C: New test. * g++.dg/analyzer/exception-path-with-cleanups.C: New test. * g++.dg/analyzer/exception-rethrow-1.C: New test. * g++.dg/analyzer/exception-rethrow-2.C: New test. * g++.dg/analyzer/exception-stack-1.C: New test. * g++.dg/analyzer/exception-stack-2.C: New test. * g++.dg/analyzer/exception-subclass-1.C: New test. * g++.dg/analyzer/exception-subclass-2.C: New test. * g++.dg/analyzer/exception-value-1.C: New test. * g++.dg/analyzer/exception-value-2.C: New test. * g++.dg/analyzer/fno-exception.C: New test. * g++.dg/analyzer/pr94028.C: Drop xfail. * g++.dg/analyzer/std-unexpected.C: New test. * g++.dg/coroutines/pr105287.C: Drop dg-excess-errors. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer,c++: add placeholder implementation of ana::translation_unit for C++David Malcolm1-0/+40
Implement ana::translation_unit for the C++ frontend with a no-op placeholder implementation, for now. No functional change intended; a follow-up may implement things further. gcc/cp/ChangeLog: * parser.cc: Include "analyzer/analyzer-language.h". (ana::cp_translation_unit): New class. (cp_parser_translation_unit): Add call to ana::on_finish_translation_unit. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28Eliminate make-unique.h and ::make_uniqueDavid Malcolm73-1044/+1031
C++11 does not provide a std::make_unique so in r13-3627-g00d7c8ff16e683 I added a make-unique.h declaring a ::make_unique. As of r15-4719-ga9ec1bc06bd3cc we can use C++14, so make-unique.h is no longer needed: we can use simply use std::make_unique instead. This patch removes make-unique.h and updates every place using it to use std::make_unique. No functional change intended. gcc/analyzer/ChangeLog: * access-diagram.cc: Replace uses of ::make_unique with std::make_unique. * analyzer.cc: Likewise. * bounds-checking.cc: Likewise. * call-details.cc: Likewise. * call-info.cc: Likewise. * call-string.cc: Likewise. * checker-path.cc: Likewise. * common.h: Drop include of "make-unique.h". * constraint-manager.cc: Replace uses of ::make_unique with std::make_unique. * diagnostic-manager.cc: Likewise. * engine.cc: Likewise. * infinite-loop.cc: Likewise. * infinite-recursion.cc: Likewise. * kf-analyzer.cc: Likewise. * kf-lang-cp.cc: Likewise. * kf.cc: Likewise. * pending-diagnostic.cc: Likewise. * program-point.cc: Likewise; drop #include. * program-state.cc: Likewise. * ranges.cc: Likewise. * region-model.cc: Likewise. * region.cc: Likewise; drop #include. * sm-fd.cc: Likewise. * sm-file.cc: Likewise. * sm-malloc.cc: Likewise. * sm-pattern-test.cc: Likewise. * sm-sensitive.cc: Likewise. * sm-signal.cc: Likewise. * sm-taint.cc: Likewise. * sm.cc: Likewise. * store.cc: Likewise. * supergraph.cc: Likewise. * svalue.cc: Likewise; drop #include. * varargs.cc: Likewise. gcc/c-family/ChangeLog: * c-pretty-print.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. gcc/c/ChangeLog: * c-decl.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. * c-objc-common.cc: Likewise. * c-parser.cc: Likewise. gcc/cp/ChangeLog: * cxx-pretty-print.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. * error.cc: Likewise. * name-lookup.cc: Likewise. * parser.cc: Likewise. gcc/ChangeLog: * diagnostic-format-json.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. * diagnostic-format-sarif.cc: Likewise. * diagnostic-format-text.cc: Likewise. * diagnostic.cc: Likewise. * dumpfile.cc: Likewise. * gcc-attribute-urlifier.cc: Likewise. * gcc-urlifier.cc: Likewise. * json-parsing.cc: Likewise. * json.cc: Likewise. * lazy-diagnostic-path.cc: Likewise. * libgdiagnostics.cc: Likewise. * libsarifreplay.cc: Likewise. * lto-wrapper.cc: Likewise. * make-unique.h: Delete. * opts-diagnostic.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. * pretty-print.cc: Likewise. * text-art/style.cc: Likewise. * text-art/styled-string.cc: Likewise. * text-art/table.cc: Likewise. * text-art/tree-widget.cc: Likewise. * text-art/widget.cc: Likewise. * timevar.cc: Likewise. * toplev.cc: Likewise. * tree-diagnostic-client-data-hooks.cc: Likewise. gcc/jit/ChangeLog: * dummy-frontend.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. gcc/testsuite/ChangeLog: * gcc.dg/plugin/analyzer_cpython_plugin.cc: Drop include of "make-unique.h". Replace uses of ::make_unique with std::make_unique. * gcc.dg/plugin/analyzer_gil_plugin.cc: Likewise. * gcc.dg/plugin/analyzer_kernel_plugin.cc: Likewise. * gcc.dg/plugin/analyzer_known_fns_plugin.cc: Likewise. * gcc.dg/plugin/diagnostic_group_plugin.cc: Likewise. * gcc.dg/plugin/diagnostic_plugin_xhtml_format.cc: Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: use unique_ptr for state_machine instancesDavid Malcolm13-101/+108
gcc/analyzer/ChangeLog: * engine.cc (class plugin_analyzer_init_impl): Convert "m_checkers" to use std::vector of std::unique_ptr. Convert "m_known_fn_mgr" to a reference. (impl_run_checkers): Convert "checkers" to use std::vector of std::unique_ptr and move it into the extrinsic_state. * program-state.cc (extrinsic_state::dump_to_pp): Update for changes to m_checkers. (extrinsic_state::to_json): Likewise. (extrinsic_state::get_sm_idx_by_name): Likewise. (selftest::test_sm_state_map): Update to use std::unique_ptr for state machines. (selftest::test_program_state_1): Likewise. (selftest::test_program_state_2): Likewise. (selftest::test_program_state_merging): Likewise. (selftest::test_program_state_merging_2): Likewise. * program-state.h (class extrinsic_state): Convert "m_checkers" to use std::vector of std::unique_ptr and to be owned by this object, rather than a reference. Add ctor for use in selftests. * sm-fd.cc (make_fd_state_machine): Update to use std::unique_ptr. * sm-file.cc (make_fileptr_state_machine): Likewise. * sm-malloc.cc (make_malloc_state_machine): Likewise. * sm-pattern-test.cc (make_pattern_test_state_machine): Likewise. * sm-sensitive.cc (make_sensitive_state_machine): Likewise. * sm-signal.cc (make_signal_state_machine): Likewise. * sm-taint.cc (make_taint_state_machine): Likewise. * sm.cc: Define INCLUDE_LIST. (make_checkers): Return the vector directly, rather than pass it in by reference. Update to use std::unique_ptr throughout. Use an intermediate list, and use that to filter with flag_analyzer_checker, fixing memory leak for this case. * sm.h: (make_checkers): Return the vector directly, rather than pass it in by reference, and use std::vector of std::unique_ptr. (make_malloc_state_machine): Convert return type to use std::unique_ptr. (make_fileptr_state_machine): Likewise. (make_taint_state_machine): Likewise. (make_sensitive_state_machine): Likewise. (make_signal_state_machine): Likewise. (make_pattern_test_state_machine): Likewise. (make_va_list_state_machine): Likewise. (make_fd_state_machine): Likewise. * varargs.cc (make_va_list_state_machine): Update to use std::unique_ptr. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: convert various call_summary * to call_summary &David Malcolm4-16/+18
No functional change intended. gcc/analyzer/ChangeLog: * call-summary.cc (call_summary_replay::call_summary_replay): Convert "summary" from call_summary * to call_summary &. (call_summary_replay::dump_to_pp): Likewise for m_summary. * call-summary.h (call_summary_replay::call_summary_replay): Likewise for "summary". (call_summary_replay::m_summary): Likewise. * engine.cc (call_summary_edge_info::call_summary_edge_info): Likewise. (call_summary_edge_info::update_state): Likewise. (call_summary_edge_info::update_model): Likewise. (call_summary_edge_info::print_desc): Likewise for m_summary. (call_summary_edge_info::m_summary): Likewise. (exploded_node::replay_call_summaries): Update for change to replay_call_summary. (exploded_node::replay_call_summary): Convert "summary" from call_summary * to call_summary &. * exploded-graph.h (exploded_node::replay_call_summary): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: convert gcall * to gcall & in many placesDavid Malcolm34-383/+381
No functional change intended. gcc/analyzer/ChangeLog: * analyzer.cc: Convert gcall * to gcall & where we know the pointer must be non-null. * call-details.cc: Likewise. * call-details.h: Likewise. * call-info.cc: Likewise. * call-info.h: Likewise. * call-summary.h: Likewise. * checker-event.cc: Likewise. * checker-event.h: Likewise. * common.h: Likewise. * diagnostic-manager.cc: Likewise. * engine.cc: Likewise. * exploded-graph.h: Likewise. * kf-analyzer.cc: Likewise. * kf-lang-cp.cc: Likewise. * kf.cc: Likewise. * known-function-manager.cc: Likewise. * program-state.cc: Likewise. * program-state.h: Likewise. * region-model.cc: Likewise. * region-model.h: Likewise. * sm-fd.cc: Likewise. * sm-file.cc: Likewise. * sm-malloc.cc: Likewise. * sm-sensitive.cc: Likewise. * sm-signal.cc: Likewise. * sm-taint.cc: Likewise. * sm.h: Likewise. * store.cc: Likewise. * store.h: Likewise. * supergraph.cc: Likewise. * supergraph.h: Likewise. * svalue.h: Likewise. * varargs.cc: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/analyzer_gil_plugin.cc: Convert gcall * to gcall & where we know the pointer must be non-null. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: convert various enums to "enum class"David Malcolm19-243/+243
Modernization; no functional change intended. gcc/analyzer/ChangeLog: * access-diagram.cc: Convert enum access_direction to "enum class". * bounds-checking.cc: Likewise. * checker-event.cc: Convert enum event_kind to "enum class". * checker-event.h: Likewise. * checker-path.cc: Likewise. * common.h: Convert enum access_direction to "enum class". * constraint-manager.cc: Convert enum bound_kind to "enum class". * constraint-manager.h: Likewise. * diagnostic-manager.cc: Convert enum event_kind to "enum class". * engine.cc: Convert enum status to "enum class". * exploded-graph.h: Likewise. * infinite-loop.cc: Likewise. * kf-lang-cp.cc: Convert enum poison_kind to "enum class". * kf.cc: Likewise. * region-model-manager.cc: Likewise. * region-model.cc: Likewise; also for enum access_direction. * svalue.cc: Likewise. * svalue.h: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/analyzer_cpython_plugin.cc: Convert enum poison_kind to "enum class". Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: use analyzer/common.h as a common headerDavid Malcolm55-892/+325
Our headers are a major pain to work with: many require certain other headers to be included in a particular (undocumented) order in order to be includable. Simplify includes in the analyzer by renaming analyzer/analyzer.h to analyzer/common.h and have it include all the common headers needed throughout the analyzer, thus encapsulating the rules about e.g. being able to include "gimple.h" in one place in the analyzer subdirectory. Doing so also makes it easier to e.g. define INCLUDE_SET in one place, rather than in many source files. gcc/analyzer/ChangeLog: * analyzer.h: Rename to... * common.h: ...this. Add define of INCLUDE_VECTOR, includes of "config.h", "system.h", "coretypes.h", "make-unique.h", "tree.h", "function.h", "basic-block.h", "gimple.h", "options.h", "bitmap.h", "diagnostic-core.h", and "diagnostic-path.h". * access-diagram.h: Don't include "analyzer/analyzer.h". * access-diagram.cc: Reorganize includes to #include "analyzer/common.h" first, then group by subsystem, dropping redundant headers. * analysis-plan.cc: Likewise. * analyzer-language.cc: Likewise. * analyzer-pass.cc: Likewise. * analyzer-selftests.cc: Likewise. * analyzer.cc: Likewise. * bounds-checking.cc: Likewise. * call-details.cc: Likewise. * call-info.cc: Likewise. * call-string.cc: Likewise. * call-summary.cc: Likewise. * checker-event.cc: Likewise. * checker-path.cc: Likewise. * complexity.cc: Likewise. * constraint-manager.cc: Likewise. * diagnostic-manager.cc: Likewise. * engine.cc: Likewise. * feasible-graph.cc: Likewise. * infinite-loop.cc: Likewise. * infinite-recursion.cc: Likewise. * kf-analyzer.cc: Likewise. * kf-lang-cp.cc: Likewise. * kf.cc: Likewise. * known-function-manager.cc: Likewise. * pending-diagnostic.cc: Likewise. * program-point.cc: Likewise. * program-state.cc: Likewise. * ranges.cc: Likewise. * record-layout.cc: Likewise. * region-model-asm.cc: Likewise. * region-model-manager.cc: Likewise. * region-model-reachability.cc: Likewise. * region-model.cc: Likewise. * region.cc: Likewise. * sm-fd.cc: Likewise. * sm-file.cc: Likewise. * sm-malloc.cc: Likewise. * sm-pattern-test.cc: Likewise. * sm-sensitive.cc: Likewise. * sm-signal.cc: Likewise. * sm-taint.cc: Likewise. * sm.cc: Likewise. * state-purge.cc: Likewise. * store.cc: Likewise. * supergraph.cc: Likewise. * svalue.cc: Likewise. * symbol.cc: Likewise. * trimmed-graph.cc: Likewise. * varargs.cc: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/analyzer_cpython_plugin.cc: Update for renaming of analyzer/analyzer.h to analyzer/common.h. * gcc.dg/plugin/analyzer_gil_plugin.cc: Likewise. * gcc.dg/plugin/analyzer_kernel_plugin.cc: Likewise. * gcc.dg/plugin/analyzer_known_fns_plugin.cc: Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: fail if we see unexpected gimple stmt codesDavid Malcolm1-7/+16
gcc/analyzer/ChangeLog: * region-model.cc (region_model::on_stmt_pre): Use internal_error if we see an unexpected gimple stmt code. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28analyzer: add a call_details::dump (using text_art)David Malcolm2-0/+63
Add a new function to help debugging -fanalyzer. No functional change intended. gcc/analyzer/ChangeLog: * call-details.cc (call_details::dump): New overload. (call_details::make_dump_widget): New. * call-details.h (call_details::dump): Declare new overload. (call_details::make_dump_widget): New decl. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28pass_manager: add m_ prefix to pass fields accessed via passes.defDavid Malcolm2-27/+27
Make it clearer when we're accessing member data of pass_manager by adding an "m"_ prefix to the fields handled via passes.def macros. No functional change intended. gcc/ChangeLog: * pass_manager.h (class pass_manager): Add "m_" prefix to all pass fields. * passes.cc (pass_manager::execute_early_local_passes): Update for added "m_" prefix. (pass_manager::execute_pass_mode_switching): Likewise. (pass_manager::finish_optimization_passes): Likewise. (pass_manager::pass_manager): Likewise. (pass_manager::dump_profile_report): Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28c,c++: use unique_ptr in name_hint to reduce naked 'new'David Malcolm5-37/+54
gcc/c-family/ChangeLog: * name-hint.h (name_hint::name_hint): Use std::unique_ptr for param. gcc/c/ChangeLog: * c-decl.cc: Include "make-unique.h". (lookup_name_fuzzy): Use ::make_unique rather than "new" when making suggest_missing_header and suggest_missing_option. * c-parser.cc: Include "make-unique.h" (c_parser_error_richloc): Use ::make_unique rather than "new" when making suggest_missing_header. gcc/cp/ChangeLog: * name-lookup.cc: Include "make-unique.h". (namespace_hints::convert_candidates_to_name_hint): Use ::make_unique rather than "new" when making show_candidate_location and suggest_alternatives. (namespace_hints::maybe_decorate_with_limit): Likewise when making namespace_limit_reached. (suggest_alternatives_for_1): Likewise when making suggest_missing_option. (maybe_suggest_missing_std_header): Likewise when making missing_std_header. (macro_use_before_def::maybe_make): Use std::unique_ptr. (macro_use_before_def::macro_use_before_def): Make public. (lookup_name_fuzzy): Use ::make_unique rather than "new" when making suggest_missing_header. * parser.cc: Include "make-unique.h". (cp_parser_error_1): Use ::make_unique rather than "new" when making suggest_missing_header. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28diagnostics: use diagnostic_option_id for m_opt_permissiveDavid Malcolm1-3/+3
gcc/ChangeLog: * diagnostic.h (diagnostic_context::m_opt_permissive): Convert from int to diagnostic_option_id. Update comment. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28diagnostics: make diagnostic_context::m_abort_on_error privateDavid Malcolm2-9/+9
No functional change intended. gcc/ChangeLog: * diagnostic.h (diagnostic_context::set_abort_on_error): New. (diagnostic_context::m_abort_on_error): Make private. (diagnostic_abort_on_error): Delete. * opts.cc (setup_core_dumping): Update for above changes. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28sarif output: introduce sarif_generation_optionsDavid Malcolm5-86/+115
Signed-off-by: David Malcolm <dmalcolm@redhat.com> gcc/ChangeLog: * diagnostic-format-sarif.cc (sarif_builder::get_opts): New accessor. (sarif_builder::get_version): Update for... (sarif_builder::m_version): Replace this field... (sarif_builder::m_m_sarif_gen_opts): ...with this. (sarif_builder::sarif_builder): Replace version with sarif_gen_opts throughout. (sarif_builder::make_top_level_object): Use get_version. (sarif_output_format::sarif_output_format): Replace version with sarif_gen_opts throughout. (sarif_stream_output_format::sarif_stream_output_format): Likewise. (sarif_file_output_format::sarif_file_output_format): Likewise. (diagnostic_output_format_init_sarif_stderr): Drop version param and use default for sarif_generation_options instead. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. (make_sarif_sink): Replace version with sarif_gen_opts throughout. (sarif_generation_options::sarif_generation_options): New. (selftest::test_sarif_diagnostic_context::test_sarif_diagnostic_context): Replace version with sarif_gen_opts throughout. (selftest::test_make_location_object): Likewise. (selftest::test_simple_log): Likewise. (selftest::test_simple_log_2): Likewise. (selftest::test_message_with_embedded_link): Likewise. (selftest::test_message_with_braces): Likewise. (selftest::test_buffering): Likewise. (selftest::run_tests_per_version): Replace with... (selftest::for_each_sarif_gen_option): ...this... (selftest::run_line_table_case_tests_per_version): ...and this. (selftest::diagnostic_format_sarif_cc_tests): Update to use for_each_sarif_gen_option and run_line_table_case_tests_per_version. * diagnostic-format-sarif.h (enum class sarif_version): Move lower down. (diagnostic_output_format_init_sarif_stderr): Drop "version" param. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. (struct sarif_generation_options): New. (make_sarif_sink): Add "formatted" param. Replace version param with sarif_gen_opts. * diagnostic.cc (diagnostic_output_format_init): Drop hardcoded sarif_version::v2_1_0 arguments from calls, which instead use the default ctor for sarif_generation_options internally. * libgdiagnostics.cc (sarif_sink::sarif_sink): Replace version param with sarif_gen_opts, and update for changes to make_sarif_sink. (diagnostic_manager_add_sarif_sink): Use sarif_gen_opts rather than version. * opts-diagnostic.cc (sarif_scheme_handler::make_sink): Likewise. Pass "true" for "formatted" param. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2025-04-28Add a Relation iterator to the relation oracle.Andrew MacLeod2-8/+117
This patch adds a relation iterator to query the oracle to list either all the relations on exit to a block, or just ones involving a specified SSA_NAME. The oracle then uses this iterator internally as well. * value-relation.cc (value_relation::swap): New. (value_relation::negate): Remove. (dom_oracle::next_relation): New. (block_relation_iterator::block_relation_iterator): New. (block_relation_iterator::get_next_relation): New. (dom_oracle::dump): Use iterator. * value-relation.h (relation_oracle::next_relation): New. (dom_oracle::next_relation): New prototype. (class block_relation_iterator): New. (FOR_EACH_RELATION_BB): New. (FOR_EACH_RELATION_NAME): New.
2025-04-28Add lhs_op1 relation to pointer_plusAndrew MacLeod3-0/+67
When prange was split from irange, the functionality of lhs_op1_relation did not get ported. This patch adds that functionality back, and is also good example of how to add new dispatch patterns to range-ops as lhs_op1_relation had no prange/prange/irange combination. * range-op-ptr.cc (range_operator::lhs_op1_relation): Add prange/prange/irange (PPI) default. (pointer_plus_operator::lhs_op1_relation): New. * range-op.cc (range_op_handler::lhs_op1_relation): Add RO_PPI case. * range-op.h (range_op_handler::lhs_op1_relation): Add prototype.
2025-04-28Do not overwrite relation in range_of_range_op.Andrew MacLeod1-6/+8
when registering reltions between the lhs and op1/op2, the relation between op1 and op2 is being overwritten by the result. This could result in either an incorrect relation being registered between lhs and op2, or a correct relation not being recognized. * gimple-range-fold.cc (fold_using_range::range_of_range_op): Use a new local variable for intermediate relation results.
2025-04-28Use the current cache when creating inferred ranges.Andrew MacLeod1-1/+1
Infer range processing was adjusted to allow a query to be specified, but during VRP folding, ranger was not providing a query. This results in contextual ranges being missed. Pass the cache in as the query which provide a read-only query of the current state. * gimple-range-cache.cc (ranger_cache::apply_inferred_ranges): Pass 'this' as the range-query to the inferred range constructor.
2025-04-28Infer non-zero for integral division RHS.Andrew MacLeod2-0/+29
Adding op2_range for operator_div allows ranger to notice the divisor is non-zero after execution. PR tree-optimization/95801 gcc/ * range-op.cc (operator_div::op2_range): New. gcc/testsuite/ * gcc.dg/tree-ssa/pr95801.c: New.