[clang] [CIR][AArch64] Upstream NEON shift left builtins (PR #186406)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 14 05:00:37 PDT 2026
https://github.com/albertbolt1 updated https://github.com/llvm/llvm-project/pull/186406
>From f8a37ee0140ed911706cd4084c022a9895da0181 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Fri, 13 Mar 2026 19:54:19 +0530
Subject: [PATCH 1/5] added scalar intrinsics and test cases
---
.../lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 13 +++++++++++
clang/test/CodeGen/AArch64/neon/intrinsics.c | 22 +++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index 5534e69b5f8bc..574959cfac900 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -2785,8 +2785,21 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
case NEON::BI__builtin_neon_vrshrd_n_s64:
case NEON::BI__builtin_neon_vrsrad_n_u64:
case NEON::BI__builtin_neon_vrsrad_n_s64:
+ case NEON::BI__builtin_neon_vshld_s64:
+ case NEON::BI__builtin_neon_vshld_u64:
+ {
+ auto loc = getLoc(expr->getExprLoc());
+ return builder.createShiftLeft(loc,ops[0],ops[1]);
+ }
case NEON::BI__builtin_neon_vshld_n_s64:
case NEON::BI__builtin_neon_vshld_n_u64:
+ {
+ auto loc = getLoc(expr->getExprLoc());
+ std::optional<llvm::APSInt> amt =
+ expr->getArg(1)->getIntegerConstantExpr(getContext());
+ assert(amt && "Expected argument to be a constant");
+ return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
+ }
case NEON::BI__builtin_neon_vshrd_n_s64:
case NEON::BI__builtin_neon_vshrd_n_u64:
case NEON::BI__builtin_neon_vsrad_n_s64:
diff --git a/clang/test/CodeGen/AArch64/neon/intrinsics.c b/clang/test/CodeGen/AArch64/neon/intrinsics.c
index b740c3b5b2310..38fcb76ba9ce6 100644
--- a/clang/test/CodeGen/AArch64/neon/intrinsics.c
+++ b/clang/test/CodeGen/AArch64/neon/intrinsics.c
@@ -936,3 +936,25 @@ uint32x4_t test_vabaq_u32(uint32x4_t v1, uint32x4_t v2, uint32x4_t v3) {
// LLVM-NEXT: ret <4 x i32> [[ADD_I]]
return vabaq_u32(v1, v2, v3);
}
+
+// LLVM-LABEL: @test_vshld_n_s64
+// CIR-LABEL: @test_vshld_n_s64
+int64_t test_vshld_n_s64(int64_t a) {
+ // CIR: cir.shift(left, {{.*}})
+
+ // LLVM-SAME: i64 noundef [[A:%.*]])
+ // LLVM: [[SHL_N:%.*]] = shl i64 [[A]], 1
+ // LLVM: ret i64 [[SHL_N]]
+ return (int64_t)vshld_n_s64(a, 1);
+}
+
+// LLVM-LABEL: @test_vshld_n_u64
+// CIR-LABEL: @test_vshld_n_u64
+int64_t test_vshld_n_u64(int64_t a) {
+ // CIR: cir.shift(left, {{.*}})
+
+ // LLVM-SAME: i64 noundef [[A:%.*]])
+ // LLVM: [[SHL_N:%.*]] = shl i64 [[A]], 1
+ // LLVM: ret i64 [[SHL_N]]
+ return (int64_t)vshld_n_u64(a, 1);
+}
>From f32cbeaea2bfda6a1d41a440eaef352e6b968748 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Fri, 13 Mar 2026 20:04:55 +0530
Subject: [PATCH 2/5] removed unnecessary ones
---
clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 6 ------
1 file changed, 6 deletions(-)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index 574959cfac900..6bd95cf755869 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -2785,12 +2785,6 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
case NEON::BI__builtin_neon_vrshrd_n_s64:
case NEON::BI__builtin_neon_vrsrad_n_u64:
case NEON::BI__builtin_neon_vrsrad_n_s64:
- case NEON::BI__builtin_neon_vshld_s64:
- case NEON::BI__builtin_neon_vshld_u64:
- {
- auto loc = getLoc(expr->getExprLoc());
- return builder.createShiftLeft(loc,ops[0],ops[1]);
- }
case NEON::BI__builtin_neon_vshld_n_s64:
case NEON::BI__builtin_neon_vshld_n_u64:
{
>From c4762db90d79c1232c51d96c430e1e5d7681e25d Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Fri, 13 Mar 2026 21:11:07 +0530
Subject: [PATCH 3/5] cleaned
---
clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index 6bd95cf755869..affa2597a54bd 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -2786,8 +2786,7 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
case NEON::BI__builtin_neon_vrsrad_n_u64:
case NEON::BI__builtin_neon_vrsrad_n_s64:
case NEON::BI__builtin_neon_vshld_n_s64:
- case NEON::BI__builtin_neon_vshld_n_u64:
- {
+ case NEON::BI__builtin_neon_vshld_n_u64:{
auto loc = getLoc(expr->getExprLoc());
std::optional<llvm::APSInt> amt =
expr->getArg(1)->getIntegerConstantExpr(getContext());
>From cf220f5a603738938ee129b9050d068b0b596442 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 14 Mar 2026 01:15:05 +0530
Subject: [PATCH 4/5] cleaned
---
clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index affa2597a54bd..fb20289a415c5 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -2786,7 +2786,7 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
case NEON::BI__builtin_neon_vrsrad_n_u64:
case NEON::BI__builtin_neon_vrsrad_n_s64:
case NEON::BI__builtin_neon_vshld_n_s64:
- case NEON::BI__builtin_neon_vshld_n_u64:{
+ case NEON::BI__builtin_neon_vshld_n_u64: {
auto loc = getLoc(expr->getExprLoc());
std::optional<llvm::APSInt> amt =
expr->getArg(1)->getIntegerConstantExpr(getContext());
>From 54a5d477d371f45848d217e8a7a03533920a9190 Mon Sep 17 00:00:00 2001
From: albertbolt <albertboltinfinity at gmail.com>
Date: Sat, 14 Mar 2026 17:29:51 +0530
Subject: [PATCH 5/5] finished the scalar parts
---
.../lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp | 2 ++
clang/test/CodeGen/AArch64/neon/intrinsics.c | 20 +++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index fb20289a415c5..2612250cb936c 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -1390,6 +1390,8 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
break;
case NEON::BI__builtin_neon_vabdd_f64:
case NEON::BI__builtin_neon_vabds_f32:
+ case NEON::BI__builtin_neon_vshld_s64:
+ case NEON::BI__builtin_neon_vshld_u64:
return emitNeonCall(cgf.cgm, cgf.getBuilder(),
{cgf.convertType(expr->getArg(0)->getType())}, ops,
llvmIntrName, cgf.convertType(expr->getType()), loc);
diff --git a/clang/test/CodeGen/AArch64/neon/intrinsics.c b/clang/test/CodeGen/AArch64/neon/intrinsics.c
index 38fcb76ba9ce6..ee70a1ff5e232 100644
--- a/clang/test/CodeGen/AArch64/neon/intrinsics.c
+++ b/clang/test/CodeGen/AArch64/neon/intrinsics.c
@@ -958,3 +958,23 @@ int64_t test_vshld_n_u64(int64_t a) {
// LLVM: ret i64 [[SHL_N]]
return (int64_t)vshld_n_u64(a, 1);
}
+
+// LLVM-LABEL: @test_vshld_s64
+// CIR-LABEL: @test_vshld_s64
+int64_t test_vshld_s64(int64_t a,int64_t b) {
+
+ // LLVM-SAME: i64 noundef [[A:%.*]], i64 noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] {
+ // LLVM: [[VSHLD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.sshl.i64(i64 [[A]], i64 [[B]])
+ // LLVM: ret i64 [[VSHLD_S64_I]]
+ return (int64_t)vshld_s64(a, b);
+}
+
+// LLVM-LABEL: @test_vshld_u64
+// CIR-LABEL: @test_vshld_u64
+int64_t test_vshld_u64(int64_t a,int64_t b) {
+
+ // LLVM-SAME: i64 noundef [[A:%.*]], i64 noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] {
+ // LLVM: [[VSHLD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.ushl.i64(i64 [[A]], i64 [[B]])
+ // LLVM: ret i64 [[VSHLD_S64_I]]
+ return (int64_t)vshld_u64(a, b);
+}
More information about the cfe-commits
mailing list