summaryrefslogtreecommitdiff
path: root/0169-Backport-SME-aarch64-Tweak-error-message-for-tuple-v.patch
diff options
context:
space:
mode:
Diffstat (limited to '0169-Backport-SME-aarch64-Tweak-error-message-for-tuple-v.patch')
-rw-r--r--0169-Backport-SME-aarch64-Tweak-error-message-for-tuple-v.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/0169-Backport-SME-aarch64-Tweak-error-message-for-tuple-v.patch b/0169-Backport-SME-aarch64-Tweak-error-message-for-tuple-v.patch
new file mode 100644
index 0000000..f2f2fd0
--- /dev/null
+++ b/0169-Backport-SME-aarch64-Tweak-error-message-for-tuple-v.patch
@@ -0,0 +1,106 @@
+From 1abb02c636eef4f9a5f55f243bc0c4d38ee1f849 Mon Sep 17 00:00:00 2001
+From: Richard Sandiford <richard.sandiford@arm.com>
+Date: Tue, 5 Dec 2023 10:11:22 +0000
+Subject: [PATCH 070/157] [Backport][SME] aarch64: Tweak error message for
+ (tuple,vector) pairs
+
+Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=5ce2e22b7e02c7fbd1ab8145b632559b67ae9958
+
+SME2 adds more intrinsics that take a tuple of vectors followed
+by a single vector, with the two arguments expected to have the
+same element type. Unlike with the existing svset* intrinsics,
+the size of the tuple is not fixed by the overloaded function name.
+
+This patch adds an error message that (hopefully) copes better
+with that combination.
+
+gcc/
+ * config/aarch64/aarch64-sve-builtins.cc
+ (function_resolver::require_derived_vector_type): Add a specific
+ error message for the case in which the caller wants a single
+ vector whose element type matches a previous tuyple argument.
+
+gcc/testsuite/
+ * gcc.target/aarch64/sve/acle/general-c/set_1.c: Tweak expected
+ error message.
+ * gcc.target/aarch64/sve/acle/general-c/set_3.c: Likewise.
+ * gcc.target/aarch64/sve/acle/general-c/set_5.c: Likewise.
+---
+ gcc/config/aarch64/aarch64-sve-builtins.cc | 13 +++++++++++++
+ .../gcc.target/aarch64/sve/acle/general-c/set_1.c | 4 ++--
+ .../gcc.target/aarch64/sve/acle/general-c/set_3.c | 4 ++--
+ .../gcc.target/aarch64/sve/acle/general-c/set_5.c | 4 ++--
+ 4 files changed, 19 insertions(+), 6 deletions(-)
+
+diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
+index e98274f8a..9224916a7 100644
+--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
++++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
+@@ -1707,6 +1707,19 @@ require_derived_vector_type (unsigned int argno,
+ if (!actual_type)
+ return false;
+
++ if (orig_expected_tclass == SAME_TYPE_CLASS
++ && orig_expected_bits == SAME_SIZE)
++ {
++ if (actual_type.type == first_type.type)
++ return true;
++
++ error_at (location, "passing %qT to argument %d of %qE, but"
++ " argument %d was a tuple of %qT",
++ get_vector_type (actual_type), argno + 1, fndecl,
++ first_argno + 1, get_vector_type (first_type.type));
++ return false;
++ }
++
+ /* Exit now if we got the right type. */
+ auto &actual_type_suffix = type_suffixes[actual_type.type];
+ bool tclass_ok_p = (actual_type_suffix.tclass == expected_tclass);
+diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_1.c
+index f07c76102..f2a6da536 100644
+--- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_1.c
++++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_1.c
+@@ -16,8 +16,8 @@ f1 (svbool_t pg, svuint8_t u8, svuint8x2_t u8x2, svuint8x3_t u8x3, int x)
+ u8x2 = svset2 (u8x3, 0, u8); /* { dg-error {passing 'svuint8x3_t' to argument 1 of 'svset2', which expects a tuple of 2 vectors} } */
+ u8x2 = svset2 (pg, 0, u8); /* { dg-error {passing 'svbool_t' to argument 1 of 'svset2', which expects a tuple of 2 vectors} } */
+ u8x2 = svset2 (u8x2, 0, u8x2); /* { dg-error {passing 'svuint8x2_t' to argument 3 of 'svset2', which expects a single SVE vector rather than a tuple} } */
+- u8x2 = svset2 (u8x2, 0, f64); /* { dg-error {passing 'svfloat64_t' instead of the expected 'svuint8_t' to argument 3 of 'svset2', after passing 'svuint8x2_t' to argument 1} } */
+- u8x2 = svset2 (u8x2, 0, pg); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 3 of 'svset2', after passing 'svuint8x2_t' to argument 1} } */
++ u8x2 = svset2 (u8x2, 0, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svset2', but argument 1 was a tuple of 'svuint8_t'} } */
++ u8x2 = svset2 (u8x2, 0, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svset2', but argument 1 was a tuple of 'svuint8_t'} } */
+ u8x2 = svset2 (u8x2, x, u8); /* { dg-error {argument 2 of 'svset2' must be an integer constant expression} } */
+ u8x2 = svset2 (u8x2, 0, u8);
+ f64 = svset2 (u8x2, 0, u8); /* { dg-error {incompatible types when assigning to type 'svfloat64_t' from type 'svuint8x2_t'} } */
+diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_3.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_3.c
+index 543a1bea8..92b955f83 100644
+--- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_3.c
++++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_3.c
+@@ -17,8 +17,8 @@ f1 (svbool_t pg, svfloat16_t f16, svfloat16x3_t f16x3, svfloat16x4_t f16x4,
+ f16x3 = svset3 (f16x4, 0, f16); /* { dg-error {passing 'svfloat16x4_t' to argument 1 of 'svset3', which expects a tuple of 3 vectors} } */
+ f16x3 = svset3 (pg, 0, f16); /* { dg-error {passing 'svbool_t' to argument 1 of 'svset3', which expects a tuple of 3 vectors} } */
+ f16x3 = svset3 (f16x3, 0, f16x3); /* { dg-error {passing 'svfloat16x3_t' to argument 3 of 'svset3', which expects a single SVE vector rather than a tuple} } */
+- f16x3 = svset3 (f16x3, 0, f64); /* { dg-error {passing 'svfloat64_t' instead of the expected 'svfloat16_t' to argument 3 of 'svset3', after passing 'svfloat16x3_t' to argument 1} } */
+- f16x3 = svset3 (f16x3, 0, pg); /* { dg-error {passing 'svbool_t' instead of the expected 'svfloat16_t' to argument 3 of 'svset3', after passing 'svfloat16x3_t' to argument 1} } */
++ f16x3 = svset3 (f16x3, 0, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svset3', but argument 1 was a tuple of 'svfloat16_t'} } */
++ f16x3 = svset3 (f16x3, 0, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svset3', but argument 1 was a tuple of 'svfloat16_t'} } */
+ f16x3 = svset3 (f16x3, x, f16); /* { dg-error {argument 2 of 'svset3' must be an integer constant expression} } */
+ f16x3 = svset3 (f16x3, 0, f16);
+ f64 = svset3 (f16x3, 0, f16); /* { dg-error {incompatible types when assigning to type 'svfloat64_t' from type 'svfloat16x3_t'} } */
+diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_5.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_5.c
+index be911a731..f0696fb07 100644
+--- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_5.c
++++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/set_5.c
+@@ -16,8 +16,8 @@ f1 (svbool_t pg, svint32_t s32, svint32x4_t s32x4, svint32x2_t s32x2, int x)
+ s32x4 = svset4 (s32x2, 0, s32); /* { dg-error {passing 'svint32x2_t' to argument 1 of 'svset4', which expects a tuple of 4 vectors} } */
+ s32x4 = svset4 (pg, 0, s32); /* { dg-error {passing 'svbool_t' to argument 1 of 'svset4', which expects a tuple of 4 vectors} } */
+ s32x4 = svset4 (s32x4, 0, s32x4); /* { dg-error {passing 'svint32x4_t' to argument 3 of 'svset4', which expects a single SVE vector rather than a tuple} } */
+- s32x4 = svset4 (s32x4, 0, f64); /* { dg-error {passing 'svfloat64_t' instead of the expected 'svint32_t' to argument 3 of 'svset4', after passing 'svint32x4_t' to argument 1} } */
+- s32x4 = svset4 (s32x4, 0, pg); /* { dg-error {passing 'svbool_t' instead of the expected 'svint32_t' to argument 3 of 'svset4', after passing 'svint32x4_t' to argument 1} } */
++ s32x4 = svset4 (s32x4, 0, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svset4', but argument 1 was a tuple of 'svint32_t'} } */
++ s32x4 = svset4 (s32x4, 0, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svset4', but argument 1 was a tuple of 'svint32_t'} } */
+ s32x4 = svset4 (s32x4, x, s32); /* { dg-error {argument 2 of 'svset4' must be an integer constant expression} } */
+ s32x4 = svset4 (s32x4, 0, s32);
+ f64 = svset4 (s32x4, 0, s32); /* { dg-error {incompatible types when assigning to type 'svfloat64_t' from type 'svint32x4_t'} } */
+--
+2.33.0
+