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:
parent
f1e1ed3314
commit
be5f7eccf7
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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); }
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user