From 507de5ee23efdc8a16d6b0b6488e118055c711cd Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 15 Jan 2020 16:52:18 +0000 Subject: [PATCH] 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 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/ChangeLog | 6 ++++++ gcc/gimplify.c | 6 +++--- gcc/testsuite/ChangeLog | 4 ++++ .../g++.target/aarch64/sve/acle/general-c++/gimplify_1.C | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/gimplify_1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d8c34b283bd..423899d3988 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-01-17 Richard Sandiford + + * 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 PR tree-optimization/93292 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/ChangeLog b/gcc/testsuite/ChangeLog index 4247302bda9..a4290eead8e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-01-17 Richard Sandiford + + * g++.target/aarch64/sve/acle/general-c++/gimplify_1.C: New test. + 2020-01-17 Mark Eggleston Tobias Burnus 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); } -- 2.30.2