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>
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>
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
reuse the destination variable, because we've no good way to
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;
/* 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);
DECL_SEEN_IN_BIND_EXPR_P (var) = 1;