[clang] 185382 - shift left scalar intrinsics upstreaming (PR #186406)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 13 07:47:09 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (albertbolt1)
<details>
<summary>Changes</summary>
[CIR][AArch64] Add support for NEON shift left builtins
This PR adds CIR generation for the following AArch64 NEON builtins:
__builtin_neon_vshld_n_s64 and __builtin_neon_vshld_n_u64 (constant shifts)
extracted the constant value and use it directly for shift left
added test cases in intrinsics.c by looking at the test cases present in
https://github.com/llvm/llvm-project/blob/main/clang/test/CodeGen/AArch64/neon-shifts.c
---
Full diff: https://github.com/llvm/llvm-project/pull/186406.diff
2 Files Affected:
- (modified) clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp (+7)
- (modified) clang/test/CodeGen/AArch64/neon/intrinsics.c (+22)
``````````diff
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index 5534e69b5f8bc..6bd95cf755869 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -2787,6 +2787,13 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
case NEON::BI__builtin_neon_vrsrad_n_s64:
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);
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/186406
More information about the cfe-commits
mailing list