aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-05-06 09:44:49 +0200
committerRichard Biener <rguenther@suse.de>2021-05-06 13:54:02 +0200
commit1698f496c5ee96b980ba97f5cd5f56b633e4afe0 (patch)
treec583015cfee055f6808ef44b26a65ac2e55666e0 /gcc/tree-inline.c
parente82e87a851cdea9f4f43f342842025b068287d4e (diff)
downloadgcc-1698f496c5ee96b980ba97f5cd5f56b633e4afe0.zip
gcc-1698f496c5ee96b980ba97f5cd5f56b633e4afe0.tar.gz
gcc-1698f496c5ee96b980ba97f5cd5f56b633e4afe0.tar.bz2
Fix IPA SRA removal of DECL_BY_REFERENCE return
While doing bogus call LHS removal I noticed that cloning with dropping a return value creates a bogus replacement for a DECL_BY_REFERENCE DECL_RESULT, resulting in MEM_REFs of aggregates rather than pointers. The following fixes this latent issue. 2021-05-06 Richard Biener <rguenther@suse.de> * tree-inline.c (tree_function_versioning): Fix DECL_BY_REFERENCE return variable removal.
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r--gcc/tree-inline.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 49a5850..8f945b8 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -6367,6 +6367,8 @@ tree_function_versioning (tree old_decl, tree new_decl,
tree resdecl_repl = copy_result_decl_to_var (DECL_RESULT (old_decl),
&id);
declare_inline_vars (NULL, resdecl_repl);
+ if (DECL_BY_REFERENCE (DECL_RESULT (old_decl)))
+ resdecl_repl = build_fold_addr_expr (resdecl_repl);
insert_decl_map (&id, DECL_RESULT (old_decl), resdecl_repl);
DECL_RESULT (new_decl)