[clang] [CIR] Upstream builtin scatter from ClangIR incubator (PR #170353)
Jasmine Tang via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 2 11:23:31 PST 2025
https://github.com/badumbatish created https://github.com/llvm/llvm-project/pull/170353
Part of [#167752](https://github.com/llvm/llvm-project/issues/167752)
>From 1c02d3dcc8c77aabb3c1b727ad90b5903b04bfd3 Mon Sep 17 00:00:00 2001
From: Jasmine Tang <jjasmine at igalia.com>
Date: Tue, 2 Dec 2025 11:11:48 -0800
Subject: [PATCH] Upstream scatter from ClangIR incubator
---
clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp | 89 +++++++++-
.../CodeGenBuiltins/X86/avx512f-builtins.c | 168 ++++++++++++++++++
2 files changed, 256 insertions(+), 1 deletion(-)
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp
index 224a182ed17d1..82820915bcbe5 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp
@@ -685,7 +685,94 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
case X86::BI__builtin_ia32_scattersiv4sf:
case X86::BI__builtin_ia32_scattersiv4si:
case X86::BI__builtin_ia32_scattersiv8sf:
- case X86::BI__builtin_ia32_scattersiv8si:
+ case X86::BI__builtin_ia32_scattersiv8si: {
+ llvm::StringRef intrinsicName;
+ switch (builtinID) {
+ default:
+ llvm_unreachable("Unexpected builtin");
+ case X86::BI__builtin_ia32_scattersiv8df:
+ intrinsicName = "x86.avx512.mask.scatter.dpd.512";
+ break;
+ case X86::BI__builtin_ia32_scattersiv16sf:
+ intrinsicName = "x86.avx512.mask.scatter.dps.512";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv8df:
+ intrinsicName = "x86.avx512.mask.scatter.qpd.512";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv16sf:
+ intrinsicName = "x86.avx512.mask.scatter.qps.512";
+ break;
+ case X86::BI__builtin_ia32_scattersiv8di:
+ intrinsicName = "x86.avx512.mask.scatter.dpq.512";
+ break;
+ case X86::BI__builtin_ia32_scattersiv16si:
+ intrinsicName = "x86.avx512.mask.scatter.dpi.512";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv8di:
+ intrinsicName = "x86.avx512.mask.scatter.qpq.512";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv16si:
+ intrinsicName = "x86.avx512.mask.scatter.qpi.512";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv2df:
+ intrinsicName = "x86.avx512.mask.scatterdiv2.df";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv2di:
+ intrinsicName = "x86.avx512.mask.scatterdiv2.di";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv4df:
+ intrinsicName = "x86.avx512.mask.scatterdiv4.df";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv4di:
+ intrinsicName = "x86.avx512.mask.scatterdiv4.di";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv4sf:
+ intrinsicName = "x86.avx512.mask.scatterdiv4.sf";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv4si:
+ intrinsicName = "x86.avx512.mask.scatterdiv4.si";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv8sf:
+ intrinsicName = "x86.avx512.mask.scatterdiv8.sf";
+ break;
+ case X86::BI__builtin_ia32_scatterdiv8si:
+ intrinsicName = "x86.avx512.mask.scatterdiv8.si";
+ break;
+ case X86::BI__builtin_ia32_scattersiv2df:
+ intrinsicName = "x86.avx512.mask.scattersiv2.df";
+ break;
+ case X86::BI__builtin_ia32_scattersiv2di:
+ intrinsicName = "x86.avx512.mask.scattersiv2.di";
+ break;
+ case X86::BI__builtin_ia32_scattersiv4df:
+ intrinsicName = "x86.avx512.mask.scattersiv4.df";
+ break;
+ case X86::BI__builtin_ia32_scattersiv4di:
+ intrinsicName = "x86.avx512.mask.scattersiv4.di";
+ break;
+ case X86::BI__builtin_ia32_scattersiv4sf:
+ intrinsicName = "x86.avx512.mask.scattersiv4.sf";
+ break;
+ case X86::BI__builtin_ia32_scattersiv4si:
+ intrinsicName = "x86.avx512.mask.scattersiv4.si";
+ break;
+ case X86::BI__builtin_ia32_scattersiv8sf:
+ intrinsicName = "x86.avx512.mask.scattersiv8.sf";
+ break;
+ case X86::BI__builtin_ia32_scattersiv8si:
+ intrinsicName = "x86.avx512.mask.scattersiv8.si";
+ break;
+ }
+
+ mlir::Location loc = getLoc(expr->getExprLoc());
+ unsigned minElts =
+ std::min(cast<cir::VectorType>(ops[2].getType()).getSize(),
+ cast<cir::VectorType>(ops[3].getType()).getSize());
+ ops[1] = getMaskVecValue(builder, loc, ops[1], minElts);
+
+ return emitIntrinsicCallOp(builder, loc, intrinsicName.str(),
+ convertType(expr->getType()), ops);
+ }
case X86::BI__builtin_ia32_vextractf128_pd256:
case X86::BI__builtin_ia32_vextractf128_ps256:
case X86::BI__builtin_ia32_vextractf128_si256:
diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512f-builtins.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512f-builtins.c
index e03109510a931..21841b163832c 100644
--- a/clang/test/CIR/CodeGenBuiltins/X86/avx512f-builtins.c
+++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512f-builtins.c
@@ -446,3 +446,171 @@ __m512i test_mm512_mask_i32gather_epi64(__m512i __v1_old, __mmask8 __mask, __m25
// OGCG: call <8 x i64> @llvm.x86.avx512.mask.gather.dpq.512
return _mm512_mask_i32gather_epi64(__v1_old, __mask, __index, __addr, 2);
}
+
+void test_mm512_i32scatter_pd(void *__addr, __m256i __index, __m512d __v1) {
+ // CIR-LABEL: test_mm512_i32scatter_pd
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpd.512"
+
+ // LLVM-LABEL: test_mm512_i32scatter_pd
+ // LLVM: @llvm.x86.avx512.mask.scatter.dpd.512
+
+ // OGCG-LABEL: test_mm512_i32scatter_pd
+ // OGCG: @llvm.x86.avx512.mask.scatter.dpd.512
+ return _mm512_i32scatter_pd(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i32scatter_pd(void *__addr, __mmask8 __mask, __m256i __index, __m512d __v1) {
+ // CIR-LABEL: test_mm512_mask_i32scatter_pd
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpd.512"
+
+ // LLVM-LABEL: test_mm512_mask_i32scatter_pd
+ // LLVM: @llvm.x86.avx512.mask.scatter.dpd.512
+
+ // OGCG-LABEL: test_mm512_mask_i32scatter_pd
+ // OGCG: @llvm.x86.avx512.mask.scatter.dpd.512
+ return _mm512_mask_i32scatter_pd(__addr, __mask, __index, __v1, 2);
+}
+
+void test_mm512_i32scatter_ps(void *__addr, __m512i __index, __m512 __v1) {
+ // CIR-LABEL: test_mm512_i32scatter_ps
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dps.512"
+
+ // LLVM-LABEL: test_mm512_i32scatter_ps
+ // LLVM: @llvm.x86.avx512.mask.scatter.dps.512
+
+ // OGCG-LABEL: test_mm512_i32scatter_ps
+ // OGCG: @llvm.x86.avx512.mask.scatter.dps.512
+ return _mm512_i32scatter_ps(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i32scatter_ps(void *__addr, __mmask16 __mask, __m512i __index, __m512 __v1) {
+ // CIR-LABEL: test_mm512_mask_i32scatter_ps
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dps.512"
+
+ // LLVM-LABEL: test_mm512_mask_i32scatter_ps
+ // LLVM: @llvm.x86.avx512.mask.scatter.dps.512
+
+ // OGCG-LABEL: test_mm512_mask_i32scatter_ps
+ // OGCG: @llvm.x86.avx512.mask.scatter.dps.512
+ return _mm512_mask_i32scatter_ps(__addr, __mask, __index, __v1, 2);
+}
+
+void test_mm512_i64scatter_pd(void *__addr, __m512i __index, __m512d __v1) {
+ // CIR-LABEL: test_mm512_i64scatter_pd
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpd.512"
+
+ // LLVM-LABEL: test_mm512_i64scatter_pd
+ // LLVM: @llvm.x86.avx512.mask.scatter.qpd.512
+
+ // OGCG-LABEL: test_mm512_i64scatter_pd
+ // OGCG: @llvm.x86.avx512.mask.scatter.qpd.512
+ return _mm512_i64scatter_pd(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i64scatter_pd(void *__addr, __mmask8 __mask, __m512i __index, __m512d __v1) {
+ // CIR-LABEL: test_mm512_mask_i64scatter_pd
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpd.512"
+
+ // LLVM-LABEL: test_mm512_mask_i64scatter_pd
+ // LLVM: @llvm.x86.avx512.mask.scatter.qpd.512
+
+ // OGCG-LABEL: test_mm512_mask_i64scatter_pd
+ // OGCG: @llvm.x86.avx512.mask.scatter.qpd.512
+ return _mm512_mask_i64scatter_pd(__addr, __mask, __index, __v1, 2);
+}
+
+void test_mm512_i64scatter_ps(void *__addr, __m512i __index, __m256 __v1) {
+ // CIR-LABEL: test_mm512_i64scatter_ps
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qps.512"
+
+ // LLVM-LABEL: test_mm512_i64scatter_ps
+ // LLVM: @llvm.x86.avx512.mask.scatter.qps.512
+
+ // OGCG-LABEL: test_mm512_i64scatter_ps
+ // OGCG: @llvm.x86.avx512.mask.scatter.qps.512
+ return _mm512_i64scatter_ps(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i64scatter_ps(void *__addr, __mmask8 __mask, __m512i __index, __m256 __v1) {
+ // CIR-LABEL: test_mm512_mask_i64scatter_ps
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qps.512"
+
+ // LLVM-LABEL: test_mm512_mask_i64scatter_ps
+ // LLVM: @llvm.x86.avx512.mask.scatter.qps.512
+
+ // OGCG-LABEL: test_mm512_mask_i64scatter_ps
+ // OGCG: @llvm.x86.avx512.mask.scatter.qps.512
+ return _mm512_mask_i64scatter_ps(__addr, __mask, __index, __v1, 2);
+}
+
+void test_mm512_i32scatter_epi32(void *__addr, __m512i __index, __m512i __v1) {
+ // CIR-LABEL: test_mm512_i32scatter_epi32
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpi.512"
+
+ // LLVM-LABEL: test_mm512_i32scatter_epi32
+ // LLVM: @llvm.x86.avx512.mask.scatter.dpi.512
+
+ // OGCG-LABEL: test_mm512_i32scatter_epi32
+ // OGCG: @llvm.x86.avx512.mask.scatter.dpi.512
+ return _mm512_i32scatter_epi32(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i32scatter_epi32(void *__addr, __mmask16 __mask, __m512i __index, __m512i __v1) {
+ // CIR-LABEL: test_mm512_mask_i32scatter_epi32
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpi.512"
+
+ // LLVM-LABEL: test_mm512_mask_i32scatter_epi32
+ // LLVM: @llvm.x86.avx512.mask.scatter.dpi.512
+
+ // OGCG-LABEL: test_mm512_mask_i32scatter_epi32
+ // OGCG: @llvm.x86.avx512.mask.scatter.dpi.512
+ return _mm512_mask_i32scatter_epi32(__addr, __mask, __index, __v1, 2);
+}
+
+void test_mm512_i64scatter_epi64(void *__addr, __m512i __index, __m512i __v1) {
+ // CIR-LABEL: test_mm512_i64scatter_epi64
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpq.512"
+
+ // LLVM-LABEL: test_mm512_i64scatter_epi64
+ // LLVM: @llvm.x86.avx512.mask.scatter.qpq.512
+
+ // OGCG-LABEL: test_mm512_i64scatter_epi64
+ // OGCG: @llvm.x86.avx512.mask.scatter.qpq.512
+ return _mm512_i64scatter_epi64(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i64scatter_epi64(void *__addr, __mmask8 __mask, __m512i __index, __m512i __v1) {
+ // CIR-LABEL: test_mm512_mask_i64scatter_epi64
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpq.512"
+
+ // LLVM-LABEL: test_mm512_mask_i64scatter_epi64
+ // LLVM: @llvm.x86.avx512.mask.scatter.qpq.512
+
+ // OGCG-LABEL: test_mm512_mask_i64scatter_epi64
+ // OGCG: @llvm.x86.avx512.mask.scatter.qpq.512
+ return _mm512_mask_i64scatter_epi64(__addr, __mask, __index, __v1, 2);
+}
+
+void test_mm512_i64scatter_epi32(void *__addr, __m512i __index, __m256i __v1) {
+ // CIR-LABEL: test_mm512_i64scatter_epi32
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpi.512"
+
+ // LLVM-LABEL: test_mm512_i64scatter_epi32
+ // LLVM: @llvm.x86.avx512.mask.scatter.qpi.512
+
+ // OGCG-LABEL: test_mm512_i64scatter_epi32
+ // OGCG: @llvm.x86.avx512.mask.scatter.qpi.512
+ return _mm512_i64scatter_epi32(__addr, __index, __v1, 2);
+}
+
+void test_mm512_mask_i64scatter_epi32(void *__addr, __mmask8 __mask, __m512i __index, __m256i __v1) {
+ // CIR-LABEL: test_mm512_mask_i64scatter_epi32
+ // CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpi.512"
+
+ // LLVM-LABEL: test_mm512_mask_i64scatter_epi32
+ // LLVM: @llvm.x86.avx512.mask.scatter.qpi.512
+
+ // OGCG-LABEL: test_mm512_mask_i64scatter_epi32
+ // OGCG: @llvm.x86.avx512.mask.scatter.qpi.512
+ return _mm512_mask_i64scatter_epi32(__addr, __mask, __index, __v1, 2);
+}
More information about the cfe-commits
mailing list