Fix IPA SRA removal of DECL_BY_REFERENCE return

Message ID nycvar.YFH.7.76.2105060947110.18067@elmra.sevgm.obk
State New
Headers show
Series
  • Fix IPA SRA removal of DECL_BY_REFERENCE return
Related show

Commit Message

Richard Biener May 6, 2021, 7:48 a.m.
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.

I don't have a testcase that ICEs without doing a bogus DSE
transform though.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

2021-05-06  Richard Biener  <rguenther@suse.de>

	* tree-inline.c (tree_function_versioning): Fix DECL_BY_REFERENCE
	return variable removal.
---
 gcc/tree-inline.c | 2 ++
 1 file changed, 2 insertions(+)

-- 
2.26.2

Patch

diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 49a5850f410..8f945b88c12 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)