[clang] [CIR][AArch64] Upstream store (vstrq_p128) NEON builtins (PR #212677)

Vicky Nguyen via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 28 21:27:52 PDT 2026


https://github.com/iamvickynguyen created https://github.com/llvm/llvm-project/pull/212677

Related to https://github.com/llvm/llvm-project/issues/185382

CIR lowering for store intrinsics (`vstrq_p128`) (https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#store)

Port test from `clang/test/CodeGen/AArch64/poly128.c` to `clang/test/CodeGen/AArch64/neon/store.c`

>From 61d47bf6413b87ba34a62548d26f9afa65b1cc1e Mon Sep 17 00:00:00 2001
From: Vicky Nguyen <vicky.trucviennguyen at gmail.com>
Date: Mon, 27 Jul 2026 22:28:07 -0700
Subject: [PATCH] [CIR][AArch64] Upstream store (vstrq_p128) NEON builtins

---
 clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 10 +++++++++-
 clang/test/CodeGen/AArch64/neon/store.c        | 11 +++++++++++
 clang/test/CodeGen/AArch64/poly128.c           | 13 +------------
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index 969ed724d7f73..dbc42404e11a4 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -2467,6 +2467,7 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
       case NEON::BI__builtin_neon_vst1q_v:
       case NEON::BI__builtin_neon_vst1_lane_v:
       case NEON::BI__builtin_neon_vst1q_lane_v:
+      case NEON::BI__builtin_neon_vstrq_p128:
         // Get the alignment for the argument in addition to the value;
         // we'll use it later.
         ptrOp0 = emitPointerWithAlignment(expr->getArg(0));
@@ -2538,7 +2539,14 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
     return builder.createBitcast(result, convertType(expr->getType()));
   }
   case NEON::BI__builtin_neon_vldrq_p128:
-  case NEON::BI__builtin_neon_vstrq_p128:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
+  case NEON::BI__builtin_neon_vstrq_p128: {
+    builder.createStore(loc, ops[1], ptrOp0);
+    return nullptr;
+  }
   case NEON::BI__builtin_neon_vcvts_f32_u32:
   case NEON::BI__builtin_neon_vcvtd_f64_u64:
   case NEON::BI__builtin_neon_vcvts_f32_s32:
diff --git a/clang/test/CodeGen/AArch64/neon/store.c b/clang/test/CodeGen/AArch64/neon/store.c
index 5579bf27ad00d..b28bbcf182cf3 100644
--- a/clang/test/CodeGen/AArch64/neon/store.c
+++ b/clang/test/CodeGen/AArch64/neon/store.c
@@ -1484,3 +1484,14 @@ void test_vst1q_u8_x4(uint8_t *a, uint8x16x4_t b) {
 // LLVM: ret void
   vst1q_u8_x4(a, b);
 }
+
+// ALL-LABEL: @test_vstrq_p128(
+void test_vstrq_p128(poly128_t *ptr, poly128_t val) {
+// CIR: cir.cast bitcast {{.*}} : !cir.ptr<!void> -> !cir.ptr<!u128i>
+// CIR: cir.store align(16) {{.*}}, {{.*}} : !u128i, !cir.ptr<!u128i>
+
+// LLVM-SAME: ptr {{.*}} [[PTR:%.*]], i128 {{.*}} [[VAL:%.*]])
+// LLVM: store i128 [[VAL]], ptr [[PTR]], align 16
+// LLVM: ret void
+  vstrq_p128(ptr, val);
+}
diff --git a/clang/test/CodeGen/AArch64/poly128.c b/clang/test/CodeGen/AArch64/poly128.c
index a9df831c07cb6..cf76fcbf106de 100644
--- a/clang/test/CodeGen/AArch64/poly128.c
+++ b/clang/test/CodeGen/AArch64/poly128.c
@@ -14,19 +14,8 @@
 
 #include <arm_neon.h>
 
-// CHECK-LABEL: define {{[^@]+}}@test_vstrq_p128
-// CHECK-SAME: (ptr noundef [[PTR:%.*]], i128 noundef [[VAL:%.*]]) #[[ATTR0:[0-9]+]] {
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    store i128 [[VAL]], ptr [[PTR]], align 16
-// CHECK-NEXT:    ret void
-//
-void test_vstrq_p128(poly128_t * ptr, poly128_t val) {
-  vstrq_p128(ptr, val);
-
-}
-
 // CHECK-LABEL: define {{[^@]+}}@test_vldrq_p128
-// CHECK-SAME: (ptr noundef [[PTR:%.*]]) #[[ATTR0]] {
+// CHECK-SAME: (ptr noundef [[PTR:%.*]]) #[[ATTR0:[0-9]+]] {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr [[PTR]], align 16
 // CHECK-NEXT:    ret i128 [[TMP0]]



More information about the cfe-commits mailing list