On Thu, Jan 16, 2020 at 1:10 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > 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. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. I guess this isn't > really a regression, but instead a bug in a new feature. It should > be very low risk for non-SVE targets though, so OK anyway?
OK. Richard. > Richard > > > 2020-01-16 Richard Sandiford <richard.sandif...@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. > --- > gcc/gimplify.c | 6 +++--- > .../g++.target/aarch64/sve/acle/general-c++/gimplify_1.C | 4 ++++ > 2 files changed, 7 insertions(+), 3 deletions(-) > create mode 100644 > gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/gimplify_1.C > > diff --git a/gcc/gimplify.c b/gcc/gimplify.c > index 05d7922116b..e50be5706c7 100644 > --- a/gcc/gimplify.c > +++ b/gcc/gimplify.c > @@ -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); > diff --git > a/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/gimplify_1.C > b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/gimplify_1.C > new file mode 100644 > index 00000000000..06ee7eae029 > --- /dev/null > +++ b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/gimplify_1.C > @@ -0,0 +1,4 @@ > +/* { dg-additional-options "-flax-vector-conversions" } */ > + > +inline void foo (const __SVInt32_t &foo) {} > +void bar (__SVUint32_t x) { foo(x); }