summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSander de Smalen <sander.desmalen@arm.com>2024-02-23 11:31:24 +0000
committerGitHub <noreply@github.com>2024-02-23 11:31:24 +0000
commit22734e15d8f2c437e8543f19632299d2e09b31f3 (patch)
treefdeaec7ebe5c006f97c51775a8b15166a2757d35
parent790bcecce6c135476d2551805c09ed670b9f8418 (diff)
[Clang][AArch64] Fix 'svzero_za' intrinsic to take no arguments. (#82648)
We previously defined svzero_za as: void svzero_za(); rather than: void svzero_za(void); Which meant that Clang accepted arguments. Compiling for example `svzero_za(<non-constant integer>)` ended up with incorrect IR and a compiler crash because it couldn't select an instruction for it.
-rw-r--r--clang/include/clang/Basic/arm_sme.td2
-rw-r--r--clang/test/Sema/aarch64-sme-intrinsics/acle_sme_zero.c7
2 files changed, 8 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/arm_sme.td b/clang/include/clang/Basic/arm_sme.td
index 2da0e8d2aba9..1ac6d5170ea2 100644
--- a/clang/include/clang/Basic/arm_sme.td
+++ b/clang/include/clang/Basic/arm_sme.td
@@ -142,7 +142,7 @@ let TargetGuard = "sme" in {
def SVZERO_MASK_ZA : SInst<"svzero_mask_za", "vi", "", MergeNone, "aarch64_sme_zero",
[IsOverloadNone, IsStreamingCompatible, IsInOutZA],
[ImmCheck<0, ImmCheck0_255>]>;
- def SVZERO_ZA : SInst<"svzero_za", "v", "", MergeNone, "aarch64_sme_zero",
+ def SVZERO_ZA : SInst<"svzero_za", "vv", "", MergeNone, "aarch64_sme_zero",
[IsOverloadNone, IsStreamingCompatible, IsOutZA]>;
}
diff --git a/clang/test/Sema/aarch64-sme-intrinsics/acle_sme_zero.c b/clang/test/Sema/aarch64-sme-intrinsics/acle_sme_zero.c
new file mode 100644
index 000000000000..e0b6c391d989
--- /dev/null
+++ b/clang/test/Sema/aarch64-sme-intrinsics/acle_sme_zero.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sme -target-feature +sve -fsyntax-only -verify %s
+
+void test_svzero_args(uint64_t m) {
+ svzero_za(0); // expected-error {{too many arguments to function call, expected 0, have 1}}
+ svzero_za(m); // expected-error {{too many arguments to function call, expected 0, have 1}}
+ svzero_mask_za(m); // expected-error {{argument to 'svzero_mask_za' must be a constant integer}}
+}