commit: 45d4820445bee14f31c0f6381504c67ebc5d0c52 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Sun Jul 27 01:00:15 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Sun Jul 27 01:01:24 2025 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=45d48204
15.1.0: backport SRA fix, cut patchset 4 Note that the fix for the related https://gcc.gnu.org/PR117423 is already on the 15 branch. Bug: https://bugs.gentoo.org/941225 Bug: https://gcc.gnu.org/PR119085 Signed-off-by: Sam James <sam <AT> gentoo.org> 15.1.0/gentoo/86_all_PR119085.patch | 98 +++++++++++++++++++++++++++++++++++++ 15.1.0/gentoo/README.history | 4 ++ 2 files changed, 102 insertions(+) diff --git a/15.1.0/gentoo/86_all_PR119085.patch b/15.1.0/gentoo/86_all_PR119085.patch new file mode 100644 index 0000000..cf145a6 --- /dev/null +++ b/15.1.0/gentoo/86_all_PR119085.patch @@ -0,0 +1,98 @@ +https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=171fcc80ede596442712e559c4fc787aa4636694 + +From 171fcc80ede596442712e559c4fc787aa4636694 Mon Sep 17 00:00:00 2001 +From: Martin Jambor <[email protected]> +Date: Wed, 23 Jul 2025 11:22:33 +0200 +Subject: [PATCH] tree-sra: Avoid total SRA if there are incompat. aggregate + accesses (PR119085) + +We currently use the types encountered in the function body and not in +type declaration to perform total scalarization. Bug PR 119085 +uncovered that we miss a check that when the same data is accessed +with aggregate types that those are actually compatible. Without it, +we can base total scalarization on a type that does not "cover" all +live data in a different part of the function. This patch adds the +check. + +gcc/ChangeLog: + +2025-07-21 Martin Jambor <[email protected]> + + PR tree-optimization/119085 + * tree-sra.cc (sort_and_splice_var_accesses): Prevent total + scalarization if two incompatible aggregates access the same place. + +gcc/testsuite/ChangeLog: + +2025-07-21 Martin Jambor <[email protected]> + + PR tree-optimization/119085 + * gcc.dg/tree-ssa/pr119085.c: New test. +--- + gcc/testsuite/gcc.dg/tree-ssa/pr119085.c | 37 ++++++++++++++++++++++++ + gcc/tree-sra.cc | 6 ++++ + 2 files changed, 43 insertions(+) + create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr119085.c + +diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr119085.c b/gcc/testsuite/gcc.dg/tree-ssa/pr119085.c +new file mode 100644 +index 000000000000..e9811ce12b58 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/tree-ssa/pr119085.c +@@ -0,0 +1,37 @@ ++/* { dg-do run } */ ++/* { dg-options "-O1" } */ ++ ++struct with_hole { ++ int x; ++ long y; ++}; ++struct without_hole { ++ int x; ++ int y; ++}; ++union u { ++ struct with_hole with_hole; ++ struct without_hole without_hole; ++}; ++ ++void __attribute__((noinline)) ++test (union u *up, union u u) ++{ ++ union u u2; ++ volatile int f = 0; ++ u2 = u; ++ if (f) ++ u2.with_hole = u.with_hole; ++ *up = u2; ++} ++ ++int main(void) ++{ ++ union u u; ++ union u u2; ++ u2.without_hole.y = -1; ++ test (&u, u2); ++ if (u.without_hole.y != -1) ++ __builtin_abort (); ++ return 0; ++} +diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc +index 240af676ea33..032f27704847 100644 +--- a/gcc/tree-sra.cc ++++ b/gcc/tree-sra.cc +@@ -2504,6 +2504,12 @@ sort_and_splice_var_accesses (tree var) + } + unscalarizable_region = true; + } ++ /* If there the same place is accessed with two incompatible ++ aggregate types, trying to base total scalarization on either of ++ them can be wrong. */ ++ if (!first_scalar && !types_compatible_p (access->type, ac2->type)) ++ bitmap_set_bit (cannot_scalarize_away_bitmap, ++ DECL_UID (access->base)); + + if (grp_same_access_path + && (!ac2->grp_same_access_path +-- +2.43.7 diff --git a/15.1.0/gentoo/README.history b/15.1.0/gentoo/README.history index d89a94a..2b37a49 100644 --- a/15.1.0/gentoo/README.history +++ b/15.1.0/gentoo/README.history @@ -1,3 +1,7 @@ +4 27 July 2025 + + + 86_all_PR119085.patch + 3 13 July 2025 - 86_all_PR120358-qt-pta.patch
