diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp index 96610d2df193..9908dcf02e83 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp @@ -2659,7 +2659,8 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr( case NEON::BI__builtin_neon_vaddlv_s32: llvm_unreachable(" neon_vaddlv_s32 NYI "); case NEON::BI__builtin_neon_vaddlv_u32: - llvm_unreachable(" neon_vaddlv_u32 NYI "); + return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy, + loc); case NEON::BI__builtin_neon_vaddlvq_s32: llvm_unreachable(" neon_vaddlvq_s32 NYI "); case NEON::BI__builtin_neon_vaddlvq_u32: diff --git a/clang/test/CIR/CodeGen/AArch64/neon.c b/clang/test/CIR/CodeGen/AArch64/neon.c index 1d31dc7ab5b4..0d9559d8a22e 100644 --- a/clang/test/CIR/CodeGen/AArch64/neon.c +++ b/clang/test/CIR/CodeGen/AArch64/neon.c @@ -19217,12 +19217,17 @@ uint32_t test_vaddv_u32(uint32x2_t a) { // return vaddlv_s32(a); // } -// NYI-LABEL: @test_vaddlv_u32( -// NYI: [[VADDLV_U32_I:%.*]] = call i64 @llvm.aarch64.neon.uaddlv.i64.v2i32(<2 x i32> %a) -// NYI: ret i64 [[VADDLV_U32_I]] -// uint64_t test_vaddlv_u32(uint32x2_t a) { -// return vaddlv_u32(a); -// } +uint64_t test_vaddlv_u32(uint32x2_t a) { + return vaddlv_u32(a); + + // CIR-LABEL: vaddlv_u32 + // CIR: cir.llvm.intrinsic "aarch64.neon.uaddlv" {{%.*}} : (!cir.vector) -> !u64i + + // LLVM-LABEL: test_vaddlv_u32 + // LLVM-SAME: (<2 x i32> [[a:%.*]]) + // LLVM: [[VADDLV_U32_I:%.*]] = call i64 @llvm.aarch64.neon.uaddlv.i64.v2i32(<2 x i32> [[a]]) + // LLVM: ret i64 [[VADDLV_U32_I]] +} uint8x8_t test_vmovn_u16(uint16x8_t a) { return vmovn_u16(a);