c++: Add support for vec_dup to constexpr [PR118445]
Checks
| Context |
Check |
Description |
| linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
success
|
Build passed
|
| linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 |
success
|
Test passed
|
| linaro-tcwg-bot/tcwg_gcc_build--master-arm |
fail
|
Patch failed to apply
|
Commit Message
With the addition of supporting operations on the SVE scalable vector types,
the vec_duplicate tree will show up in expressions and the constexpr handling
was not done for this tree code.
This is a simple fix to treat VEC_DUPLICATE like any other unary operator and allows
the constexpr-add-1.C testcase to work.
Built and tested for aarch64-linux-gnu.
PR c++/118445
gcc/cp/ChangeLog:
* constexpr.cc (cxx_eval_constant_expression): Handle VEC_DUPLICATE like
a "normal" unary operator.
(potential_constant_expression_1): Likewise.
gcc/testsuite/ChangeLog:
* g++.target/aarch64/sve/constexpr-add-1.C: New test.
Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
---
gcc/cp/constexpr.cc | 2 ++
.../g++.target/aarch64/sve/constexpr-add-1.C | 16 ++++++++++++++++
2 files changed, 18 insertions(+)
create mode 100644 gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C
Comments
On 1/13/25 4:55 PM, Andrew Pinski wrote:
> With the addition of supporting operations on the SVE scalable vector types,
> the vec_duplicate tree will show up in expressions and the constexpr handling
> was not done for this tree code.
> This is a simple fix to treat VEC_DUPLICATE like any other unary operator and allows
> the constexpr-add-1.C testcase to work.
>
> Built and tested for aarch64-linux-gnu.
OK.
> PR c++/118445
>
> gcc/cp/ChangeLog:
>
> * constexpr.cc (cxx_eval_constant_expression): Handle VEC_DUPLICATE like
> a "normal" unary operator.
> (potential_constant_expression_1): Likewise.
>
> gcc/testsuite/ChangeLog:
>
> * g++.target/aarch64/sve/constexpr-add-1.C: New test.
>
> Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
> ---
> gcc/cp/constexpr.cc | 2 ++
> .../g++.target/aarch64/sve/constexpr-add-1.C | 16 ++++++++++++++++
> 2 files changed, 18 insertions(+)
> create mode 100644 gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C
>
> diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
> index 1345bc124ef..0896576fd28 100644
> --- a/gcc/cp/constexpr.cc
> +++ b/gcc/cp/constexpr.cc
> @@ -8005,6 +8005,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
> case BIT_NOT_EXPR:
> case TRUTH_NOT_EXPR:
> case FIXED_CONVERT_EXPR:
> + case VEC_DUPLICATE_EXPR:
> r = cxx_eval_unary_expression (ctx, t, lval,
> non_constant_p, overflow_p);
> break;
> @@ -10344,6 +10345,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
> case UNARY_PLUS_EXPR:
> case UNARY_LEFT_FOLD_EXPR:
> case UNARY_RIGHT_FOLD_EXPR:
> + case VEC_DUPLICATE_EXPR:
> unary:
> return RECUR (TREE_OPERAND (t, 0), rval);
>
> diff --git a/gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C b/gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C
> new file mode 100644
> index 00000000000..43489560c8a
> --- /dev/null
> +++ b/gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +
> +/* PR C++/118445 */
> +
> +#include <arm_sve.h>
> +
> +/* See if constexpr handles VEC_DUPLICATE and SVE. */
> +constexpr svfloat32_t f(svfloat32_t b, float a)
> +{
> + return b + a;
> +}
> +
> +svfloat32_t g(void)
> +{
> + return f((svfloat32_t){1.0}, 2.0);
> +}
@@ -8005,6 +8005,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
case BIT_NOT_EXPR:
case TRUTH_NOT_EXPR:
case FIXED_CONVERT_EXPR:
+ case VEC_DUPLICATE_EXPR:
r = cxx_eval_unary_expression (ctx, t, lval,
non_constant_p, overflow_p);
break;
@@ -10344,6 +10345,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
case UNARY_PLUS_EXPR:
case UNARY_LEFT_FOLD_EXPR:
case UNARY_RIGHT_FOLD_EXPR:
+ case VEC_DUPLICATE_EXPR:
unary:
return RECUR (TREE_OPERAND (t, 0), rval);
new file mode 100644
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+/* PR C++/118445 */
+
+#include <arm_sve.h>
+
+/* See if constexpr handles VEC_DUPLICATE and SVE. */
+constexpr svfloat32_t f(svfloat32_t b, float a)
+{
+ return b + a;
+}
+
+svfloat32_t g(void)
+{
+ return f((svfloat32_t){1.0}, 2.0);
+}