mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-17 09:30:30 +08:00
gimplifier: handle POLY_INT_CST-sized TARGET_EXPRs
If a TARGET_EXPR has poly-int size, the gimplifier would treat it like a VLA and use gimplify_vla_decl. gimplify_vla_decl in turn would use an alloca and expect all references to be gimplified via the DECL_VALUE_EXPR. This caused confusion later in gimplify_var_or_parm_decl_1 when we (correctly) had direct rather than indirect references. For completeness, the patch also fixes similar tests in the RETURN_EXPR handling and OpenMP depend clauses. 2020-01-17 Richard Sandiford <richard.sandiford@arm.com> gcc/ * gimplify.c (gimplify_return_expr): Use poly_int_tree_p rather than testing directly for INTEGER_CST. (gimplify_target_expr, gimplify_omp_depend): Likewise. gcc/testsuite/ * g++.target/aarch64/sve/acle/general-c++/gimplify_1.C: New test.
This commit is contained in:
parent
e4a5f73449
commit
507de5ee23
@ -1,3 +1,9 @@
|
||||
2020-01-17 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* gimplify.c (gimplify_return_expr): Use poly_int_tree_p rather
|
||||
than testing directly for INTEGER_CST.
|
||||
(gimplify_target_expr, gimplify_omp_depend): Likewise.
|
||||
|
||||
2020-01-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/93292
|
||||
|
@ -1632,7 +1632,7 @@ gimplify_return_expr (tree stmt, gimple_seq *pre_p)
|
||||
result = NULL_TREE;
|
||||
else if (aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
|
||||
{
|
||||
if (TREE_CODE (DECL_SIZE (result_decl)) != INTEGER_CST)
|
||||
if (!poly_int_tree_p (DECL_SIZE (result_decl)))
|
||||
{
|
||||
if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (result_decl)))
|
||||
gimplify_type_sizes (TREE_TYPE (result_decl), pre_p);
|
||||
@ -6714,7 +6714,7 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
|
||||
|
||||
/* TARGET_EXPR temps aren't part of the enclosing block, so add it
|
||||
to the temps list. Handle also variable length TARGET_EXPRs. */
|
||||
if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
|
||||
if (!poly_int_tree_p (DECL_SIZE (temp)))
|
||||
{
|
||||
if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
|
||||
gimplify_type_sizes (TREE_TYPE (temp), pre_p);
|
||||
@ -7921,7 +7921,7 @@ gimplify_omp_depend (tree *list_p, gimple_seq *pre_p)
|
||||
tree type = build_array_type (ptr_type_node, build_index_type (totalpx));
|
||||
tree array = create_tmp_var_raw (type);
|
||||
TREE_ADDRESSABLE (array) = 1;
|
||||
if (TREE_CODE (totalpx) != INTEGER_CST)
|
||||
if (!poly_int_tree_p (totalpx))
|
||||
{
|
||||
if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (array)))
|
||||
gimplify_type_sizes (TREE_TYPE (array), pre_p);
|
||||
|
@ -1,3 +1,7 @@
|
||||
2020-01-17 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* g++.target/aarch64/sve/acle/general-c++/gimplify_1.C: New test.
|
||||
|
||||
2020-01-17 Mark Eggleston <mark.eggleston@codethink.com>
|
||||
Tobias Burnus <burnus@gcc.gnu.org>
|
||||
|
||||
|
@ -0,0 +1,4 @@
|
||||
/* { dg-additional-options "-flax-vector-conversions" } */
|
||||
|
||||
inline void foo (const __SVInt32_t &foo) {}
|
||||
void bar (__SVUint32_t x) { foo(x); }
|
Loading…
x
Reference in New Issue
Block a user