https://github.com/amanmaurya92 updated https://github.com/llvm/llvm-project/pull/221199
>From 4ea965197144ecd44325053d1368b7cca32caa86 Mon Sep 17 00:00:00 2001 From: amanmaurya92 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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'}} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
