diff mbox series

gimplifier: handle POLY_INT_CST-sized TARGET_EXPRs

Message ID mptv9pb38my.fsf@arm.com
State New
Headers show
Series gimplifier: handle POLY_INT_CST-sized TARGET_EXPRs | expand

Commit Message

Richard Sandiford Jan. 16, 2020, 12:09 p.m. UTC
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?

Richard


2020-01-16  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.
---
 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

Comments

Richard Biener Jan. 17, 2020, 8:17 a.m. UTC | #1
On Thu, Jan 16, 2020 at 1:10 PM Richard Sandiford
<richard.sandiford@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.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.
> ---
>  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); }
diff mbox series

Patch

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); }