Commit be5f7ecc by Richard Sandiford Committed by Richard Sandiford

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
parent f1e1ed33
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
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
......
/* { 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); }
...@@ -3654,7 +3654,7 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest, ...@@ -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, ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment