[clang] [PowerPC] Add missing vec_msum and vec_vmsumudm builtins for POWER9 (PR #221199)
Aman Maurya via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 10 17:52:50 PDT 2026
https://github.com/amanmaurya92 updated https://github.com/llvm/llvm-project/pull/221199
>From 4ea965197144ecd44325053d1368b7cca32caa86 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Fri, 4 Sep 2026 17:10:16 +0530
Subject: [PATCH 1/3] [PowerPC] Add missing vec_msum and vec_vmsumudm builtins
for POWER9
Power ISA 3.0 (POWER9) instruction vmsumudm (Vector Multiply-Sum Unsigned Doubleword Modulo) and its LLVM IR intrinsic int_ppc_altivec_vmsumudm were implemented in the LLVM backend (commit a28e9f120860), but the Clang target builtin and <altivec.h> overloads were missing.
This patch exposes __builtin_altivec_vmsumudm in BuiltinsPPC.def and adds the missing vec_msum and vec_vmsumudm intrinsics in <altivec.h> matching GCC 11+ behavior.
Implement support for the following builtins:
* vector unsigned __int128 vec_msum(vector unsigned long long, vector unsigned long long, vector unsigned __int128)
* vector unsigned __int128 vec_vmsumudm(vector unsigned long long, vector unsigned long long, vector unsigned __int128)
Fixes #221065
---
clang/include/clang/Basic/BuiltinsPPC.def | 2 ++
clang/lib/Headers/altivec.h | 18 ++++++++++++++++++
.../CodeGen/PowerPC/builtins-ppc-p9vector.c | 17 +++++++++++++++++
clang/test/SemaCXX/altivec-vec-msum-p9.cpp | 14 ++++++++++++++
4 files changed, 51 insertions(+)
create mode 100644 clang/test/SemaCXX/altivec-vec-msum-p9.cpp
diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def
index 7970163c15f72..7b29f70cab826 100644
--- a/clang/include/clang/Basic/BuiltinsPPC.def
+++ b/clang/include/clang/Basic/BuiltinsPPC.def
@@ -349,6 +349,8 @@ TARGET_BUILTIN(__builtin_altivec_vmulosd, "V1SLLLiV2SLLiV2SLLi", "",
"power10-vector")
TARGET_BUILTIN(__builtin_altivec_vmsumcud, "V1ULLLiV2ULLiV2ULLiV1ULLLi", "",
"power10-vector")
+TARGET_BUILTIN(__builtin_altivec_vmsumudm, "V1ULLLiV2ULLiV2ULLiV1ULLLi", "",
+ "power9-vector")
TARGET_BUILTIN(__builtin_altivec_vnmsubfp, "V4fV4fV4fV4f", "", "altivec")
diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h
index 2df3f46823732..929189be04cf5 100644
--- a/clang/lib/Headers/altivec.h
+++ b/clang/lib/Headers/altivec.h
@@ -6080,6 +6080,14 @@ vec_msum(vector unsigned short __a, vector unsigned short __b,
return __builtin_altivec_vmsumuhm(__a, __b, __c);
}
+#if defined(__POWER9_VECTOR__) && defined(__SIZEOF_INT128__)
+static __inline__ vector unsigned __int128 __ATTRS_o_ai
+vec_msum(vector unsigned long long __a, vector unsigned long long __b,
+ vector unsigned __int128 __c) {
+ return __builtin_altivec_vmsumudm(__a, __b, __c);
+}
+#endif
+
/* vec_msumc */
#if defined(__POWER10_VECTOR__) && defined(__SIZEOF_INT128__)
@@ -6149,6 +6157,16 @@ vec_vmsumuhs(vector unsigned short __a, vector unsigned short __b,
return __builtin_altivec_vmsumuhs(__a, __b, __c);
}
+#if defined(__POWER9_VECTOR__) && defined(__SIZEOF_INT128__)
+/* vec_vmsumudm */
+
+static __inline__ vector unsigned __int128 __attribute__((__always_inline__))
+vec_vmsumudm(vector unsigned long long __a, vector unsigned long long __b,
+ vector unsigned __int128 __c) {
+ return __builtin_altivec_vmsumudm(__a, __b, __c);
+}
+#endif
+
/* vec_mtvscr */
static __inline__ void __ATTRS_o_ai vec_mtvscr(vector signed char __a) {
diff --git a/clang/test/CodeGen/PowerPC/builtins-ppc-p9vector.c b/clang/test/CodeGen/PowerPC/builtins-ppc-p9vector.c
index a35dc0c077c6b..923ae9bcdeca2 100644
--- a/clang/test/CodeGen/PowerPC/builtins-ppc-p9vector.c
+++ b/clang/test/CodeGen/PowerPC/builtins-ppc-p9vector.c
@@ -1268,3 +1268,20 @@ vector unsigned long long test_vbpermd(void) {
// CHECK-BE: @llvm.ppc.altivec.vbpermd(<2 x i64>
return vec_bperm(vula, vuca);
}
+
+vector unsigned __int128 test_vec_msum_u128(void) {
+ // CHECK: @llvm.ppc.altivec.vmsumudm(<2 x i64>
+ // CHECK-NEXT: ret <1 x i128>
+ // CHECK-BE: @llvm.ppc.altivec.vmsumudm(<2 x i64>
+ // CHECK-BE-NEXT: ret <1 x i128>
+ return vec_msum(vula, vulb, vui128a);
+}
+
+vector unsigned __int128 test_vec_vmsumudm(void) {
+ // CHECK: @llvm.ppc.altivec.vmsumudm(<2 x i64>
+ // CHECK-NEXT: ret <1 x i128>
+ // CHECK-BE: @llvm.ppc.altivec.vmsumudm(<2 x i64>
+ // CHECK-BE-NEXT: ret <1 x i128>
+ return vec_vmsumudm(vula, vulb, vui128a);
+}
+
diff --git a/clang/test/SemaCXX/altivec-vec-msum-p9.cpp b/clang/test/SemaCXX/altivec-vec-msum-p9.cpp
new file mode 100644
index 0000000000000..051c37a9d909c
--- /dev/null
+++ b/clang/test/SemaCXX/altivec-vec-msum-p9.cpp
@@ -0,0 +1,14 @@
+// REQUIRES: powerpc-registered-target
+// RUN: %clang_cc1 -std=c++20 -target-feature +power9-vector -target-feature +isa-v207-instructions \
+// RUN: -triple powerpc64le-unknown-unknown -fsyntax-only -verify %s
+
+// expected-no-diagnostics
+#include <altivec.h>
+
+auto test_u64(vector unsigned long long a, vector unsigned long long b, vector unsigned __int128 c) {
+ return vec_msum(a, b, c);
+}
+
+auto test_direct(vector unsigned long long a, vector unsigned long long b, vector unsigned __int128 c) {
+ return vec_vmsumudm(a, b, c);
+}
>From 61a2bde462345949f64b9bb813e35a6cb8621233 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Tue, 8 Sep 2026 20:20:40 +0530
Subject: [PATCH 2/3] [clang][PowerPC] Fix formatting in altivec.h (NFC)
---
clang/lib/Headers/altivec.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h
index 929189be04cf5..44725538d60f6 100644
--- a/clang/lib/Headers/altivec.h
+++ b/clang/lib/Headers/altivec.h
@@ -6081,9 +6081,10 @@ vec_msum(vector unsigned short __a, vector unsigned short __b,
}
#if defined(__POWER9_VECTOR__) && defined(__SIZEOF_INT128__)
-static __inline__ vector unsigned __int128 __ATTRS_o_ai
-vec_msum(vector unsigned long long __a, vector unsigned long long __b,
- vector unsigned __int128 __c) {
+static __inline__ vector unsigned __int128
+ __ATTRS_o_ai vec_msum(vector unsigned long long __a,
+ vector unsigned long long __b,
+ vector unsigned __int128 __c) {
return __builtin_altivec_vmsumudm(__a, __b, __c);
}
#endif
>From 2c6429775969ab57cde95c878a9b76aba9ff953e Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Thu, 10 Sep 2026 09:57:50 +0530
Subject: [PATCH 3/3] [clang][PowerPC] Add negative test cases for vec_msum and
vec_vmsumudm on POWER9
Add error checking for invalid vector types passed to vec_msum and vec_vmsumudm, ensuring signed inputs and mismatched accumulator types are properly rejected. Follow conventions in backend:PowerPC tests with dual endianness testing and -flax-vector-conversions=none.
---
clang/test/SemaCXX/altivec-vec-msum-p9.cpp | 39 ++++++++++++++--------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/clang/test/SemaCXX/altivec-vec-msum-p9.cpp b/clang/test/SemaCXX/altivec-vec-msum-p9.cpp
index 051c37a9d909c..3d1a7aefb8a67 100644
--- a/clang/test/SemaCXX/altivec-vec-msum-p9.cpp
+++ b/clang/test/SemaCXX/altivec-vec-msum-p9.cpp
@@ -1,14 +1,25 @@
-// REQUIRES: powerpc-registered-target
-// RUN: %clang_cc1 -std=c++20 -target-feature +power9-vector -target-feature +isa-v207-instructions \
-// RUN: -triple powerpc64le-unknown-unknown -fsyntax-only -verify %s
-
-// expected-no-diagnostics
-#include <altivec.h>
-
-auto test_u64(vector unsigned long long a, vector unsigned long long b, vector unsigned __int128 c) {
- return vec_msum(a, b, c);
-}
-
-auto test_direct(vector unsigned long long a, vector unsigned long long b, vector unsigned __int128 c) {
- return vec_vmsumudm(a, b, c);
-}
+// REQUIRES: powerpc-registered-target
+// RUN: %clang_cc1 -std=c++20 -target-feature +power9-vector -target-feature +isa-v207-instructions \
+// RUN: -triple powerpc64le-unknown-unknown -fsyntax-only -flax-vector-conversions=none \
+// RUN: -verify -verify-ignore-unexpected=note %s
+// RUN: %clang_cc1 -std=c++20 -target-feature +power9-vector -target-feature +isa-v207-instructions \
+// RUN: -triple powerpc64-unknown-unknown -fsyntax-only -flax-vector-conversions=none \
+// RUN: -verify -verify-ignore-unexpected=note %s
+
+#include <altivec.h>
+
+auto test_u64(vector unsigned long long a, vector unsigned long long b, vector unsigned __int128 c) {
+ return vec_msum(a, b, c);
+}
+
+auto test_direct(vector unsigned long long a, vector unsigned long long b, vector unsigned __int128 c) {
+ return vec_vmsumudm(a, b, c);
+}
+
+void test_error(vector signed long long a, vector signed long long b, vector signed __int128 c,
+ vector unsigned long long u, vector unsigned __int128 uc) {
+ vec_msum(a, b, c); // expected-error {{no matching function for call to 'vec_msum'}}
+ vec_msum(u, u, c); // expected-error {{no matching function for call to 'vec_msum'}}
+ vec_vmsumudm(a, b, uc); // expected-error {{no matching function for call to 'vec_vmsumudm'}}
+ vec_vmsumudm(u, u, c); // expected-error {{no matching function for call to 'vec_vmsumudm'}}
+}
More information about the cfe-commits
mailing list