Handle POLY_INT_CSTs in declare_return_value

SVE allows variable-length vectors to be returned by value,
which tripped the assert in declare_return_variable.

2019-11-08  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-inline.c (declare_return_variable): Check for poly_int_tree_p
	instead of INTEGER_CST.

gcc/testsuite/
	* gcc.target/aarch64/sve/acle/general/inline_1.c: New test.

From-SVN: r277956
This commit is contained in:
Richard Sandiford 2019-11-08 09:06:50 +00:00 committed by Richard Sandiford
parent f1e1ed3314
commit be5f7eccf7
4 changed files with 17 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
* tree-inline.c (declare_return_variable): Check for poly_int_tree_p
instead of INTEGER_CST.
2019-11-08 Richard Biener <rguenther@suse.de> 2019-11-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/92324 PR tree-optimization/92324

View File

@ -1,3 +1,7 @@
2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/acle/general/inline_1.c: New test.
2019-11-08 Richard Biener <rguenther@suse.de> 2019-11-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/92324 PR tree-optimization/92324

View File

@ -0,0 +1,6 @@
/* { dg-options "-O2" } */
#pragma GCC aarch64 "arm_sve.h"
static inline svint32_t foo () { return svdup_s32 (32); }
svint32_t bar () { return svadd_x (svptrue_b8 (), foo (), 1); }

View File

@ -3654,7 +3654,7 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest,
/* ??? If we're assigning to a variable sized type, then we must /* ??? If we're assigning to a variable sized type, then we must
reuse the destination variable, because we've no good way to reuse the destination variable, because we've no good way to
create variable sized temporaries at this point. */ create variable sized temporaries at this point. */
else if (TREE_CODE (TYPE_SIZE_UNIT (caller_type)) != INTEGER_CST) else if (!poly_int_tree_p (TYPE_SIZE_UNIT (caller_type)))
use_it = true; use_it = true;
/* If the callee cannot possibly modify MODIFY_DEST, then we can /* If the callee cannot possibly modify MODIFY_DEST, then we can
@ -3689,7 +3689,7 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest,
} }
} }
gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (callee_type)) == INTEGER_CST); gcc_assert (poly_int_tree_p (TYPE_SIZE_UNIT (callee_type)));
var = copy_result_decl_to_var (result, id); var = copy_result_decl_to_var (result, id);
DECL_SEEN_IN_BIND_EXPR_P (var) = 1; DECL_SEEN_IN_BIND_EXPR_P (var) = 1;