mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
gnu: GCC: Fix union optimization issue.
* gnu/packages/patches/gcc-10-tree-sra-union-handling.patch: New file. * gnu/local.mk (dist_patch_DATA): Adjust accordingly. * gnu/packages/gcc.scm (gcc-10, gcc-11)[source](patches): Add it. * gnu/packages/rust.scm (rust-bootstrap)[native-inputs]: Remove GCC-9.
This commit is contained in:
parent
b3fb4ed0b0
commit
8a2b5f3f58
4 changed files with 38 additions and 10 deletions
33
gnu/packages/patches/gcc-10-tree-sra-union-handling.patch
Normal file
33
gnu/packages/patches/gcc-10-tree-sra-union-handling.patch
Normal file
|
@ -0,0 +1,33 @@
|
|||
Fix a regression in GCC 10/11/12 where some union structures
|
||||
could get miscompiled when optimizations are enabled:
|
||||
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105860
|
||||
|
||||
Taken from upstream:
|
||||
|
||||
https://gcc.gnu.org/g:16afe2e2862f3dd93c711d7f8d436dee23c6c34d
|
||||
|
||||
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
|
||||
index 09d951a261b..420329f63f6 100644
|
||||
--- a/gcc/tree-sra.c
|
||||
+++ b/gcc/tree-sra.c
|
||||
@@ -1647,7 +1647,18 @@ build_ref_for_offset (location_t loc, tree base, poly_int64 offset,
|
||||
static tree
|
||||
build_reconstructed_reference (location_t, tree base, struct access *model)
|
||||
{
|
||||
- tree expr = model->expr, prev_expr = NULL;
|
||||
+ tree expr = model->expr;
|
||||
+ /* We have to make sure to start just below the outermost union. */
|
||||
+ tree start_expr = expr;
|
||||
+ while (handled_component_p (expr))
|
||||
+ {
|
||||
+ if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == UNION_TYPE)
|
||||
+ start_expr = expr;
|
||||
+ expr = TREE_OPERAND (expr, 0);
|
||||
+ }
|
||||
+
|
||||
+ expr = start_expr;
|
||||
+ tree prev_expr = NULL_TREE;
|
||||
while (!types_compatible_p (TREE_TYPE (expr), TREE_TYPE (base)))
|
||||
{
|
||||
if (!handled_component_p (expr))
|
Loading…
Add table
Add a link
Reference in a new issue