[Mlir-commits] [llvm] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM conversion for GL.Fract (PR #206951)
Arseniy Obolenskiy
llvmlistbot at llvm.org
Thu Jul 2 02:25:16 PDT 2026
https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/206951
>From 0c27ffa07eb9b334cbc1bd5e4df2a94abd4e2643 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 1 Jul 2026 13:15:31 +0200
Subject: [PATCH 1/2] [mlir][SPIR-V] Add SPIRVToLLVM conversion for GL.Fract
---
.../Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp | 22 ++++++++++++++++++-
.../SPIRVToLLVM/gl-ops-to-llvm.mlir | 15 +++++++++++++
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
index c43415b27b1b3..c9eba35cf0939 100644
--- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
+++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
@@ -1564,6 +1564,26 @@ class SAbsPattern : public SPIRVToLLVMConversion<spirv::GLSAbsOp> {
}
};
+/// Converts `spirv.GL.Fract` to `x - floor(x)`.
+class FractPattern : public SPIRVToLLVMConversion<spirv::GLFractOp> {
+public:
+ using SPIRVToLLVMConversion<spirv::GLFractOp>::SPIRVToLLVMConversion;
+
+ LogicalResult
+ matchAndRewrite(spirv::GLFractOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ auto dstType = getTypeConverter()->convertType(op.getType());
+ if (!dstType)
+ return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+ Location loc = op.getLoc();
+ Value operand = adaptor.getOperand();
+ Value floored = LLVM::FFloorOp::create(rewriter, loc, dstType, operand);
+ rewriter.replaceOpWithNewOp<LLVM::FSubOp>(op, dstType, operand, floored);
+ return success();
+ }
+};
+
class VariablePattern : public SPIRVToLLVMConversion<spirv::VariableOp> {
public:
using SPIRVToLLVMConversion<spirv::VariableOp>::SPIRVToLLVMConversion;
@@ -1916,7 +1936,7 @@ void mlir::populateSPIRVToLLVMConversionPatterns(
DirectConversionPattern<spirv::GLAsinOp, LLVM::ASinOp>,
DirectConversionPattern<spirv::GLAcosOp, LLVM::ACosOp>,
DirectConversionPattern<spirv::GLAtanOp, LLVM::ATanOp>,
- InverseSqrtPattern, SAbsPattern, TanPattern, TanhPattern,
+ InverseSqrtPattern, SAbsPattern, TanPattern, TanhPattern, FractPattern,
// OpenCL extended instruction set ops
DirectConversionPattern<spirv::CLCeilOp, LLVM::FCeilOp>,
diff --git a/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
index ffa47efbf9213..042b68bef9dcd 100644
--- a/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
+++ b/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
@@ -361,3 +361,18 @@ spirv.func @asin_acos_atan(%arg0: f32, %arg1: vector<3xf16>) "None" {
%2 = spirv.GL.Atan %arg0 : f32
spirv.Return
}
+
+//===----------------------------------------------------------------------===//
+// spirv.GL.Fract
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: @fract
+spirv.func @fract(%arg0: f32, %arg1: vector<3xf16>) "None" {
+ // CHECK: %[[FLOOR:.*]] = llvm.intr.floor(%{{.*}}) : (f32) -> f32
+ // CHECK: llvm.fsub %{{.*}}, %[[FLOOR]] : f32
+ %0 = spirv.GL.Fract %arg0 : f32
+ // CHECK: %[[FLOORV:.*]] = llvm.intr.floor(%{{.*}}) : (vector<3xf16>) -> vector<3xf16>
+ // CHECK: llvm.fsub %{{.*}}, %[[FLOORV]] : vector<3xf16>
+ %1 = spirv.GL.Fract %arg1 : vector<3xf16>
+ spirv.Return
+}
>From c7a22b3372540610ec185a488467988809792f07 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Thu, 2 Jul 2026 11:25:00 +0200
Subject: [PATCH 2/2] [SPIR-V] Replace isPipeOrAddressSpaceCastBI hardcoded
list with table lookup
---
llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 4 ++++
llvm/lib/Target/SPIRV/SPIRVBuiltins.h | 3 +++
llvm/lib/Target/SPIRV/SPIRVBuiltins.td | 2 ++
llvm/lib/Target/SPIRV/SPIRVUtils.cpp | 29 ++-----------------------
4 files changed, 11 insertions(+), 27 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index f97e0060c67e4..d7adc5e108172 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -3984,5 +3984,9 @@ lowerBuiltinType(const Type *OpaqueType,
return TargetType;
}
+
+bool isPipeOrAddressSpaceCastBuiltin(StringRef Name) {
+ return lookupBuiltin(Name, OpenCL_std) != nullptr;
+}
} // namespace SPIRV
} // namespace llvm
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.h b/llvm/lib/Target/SPIRV/SPIRVBuiltins.h
index 81a6cc697ead7..88afb38a7c5aa 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.h
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.h
@@ -83,6 +83,9 @@ SPIRVTypeInst lowerBuiltinType(const Type *Type,
AccessQualifier::AccessQualifier AccessQual,
MachineIRBuilder &MIRBuilder,
SPIRVGlobalRegistry *GR);
+
+/// Returns true if \p Name is a pipe or address-space-cast OpenCL builtin.
+bool isPipeOrAddressSpaceCastBuiltin(StringRef Name);
} // namespace SPIRV
} // namespace llvm
#endif // LLVM_LIB_TARGET_SPIRV_SPIRVBUILTINS_H
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.td b/llvm/lib/Target/SPIRV/SPIRVBuiltins.td
index 64d5695ef2167..d8aa8d63f921f 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.td
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.td
@@ -1256,6 +1256,8 @@ defm : DemangledNativeBuiltin<"clock_read_hilo_sub_group", OpenCL_std, KernelClo
//SPV_ALTERA_blocking_pipes
defm : DemangledNativeBuiltin<"__spirv_WritePipeBlockingINTEL", OpenCL_std, BlockingPipes, 0, 0, OpWritePipeBlockingALTERA>;
defm : DemangledNativeBuiltin<"__spirv_ReadPipeBlockingINTEL", OpenCL_std, BlockingPipes, 0, 0, OpReadPipeBlockingALTERA>;
+defm : DemangledNativeBuiltin<"__read_pipe_2_bl", OpenCL_std, BlockingPipes, 4, 4, OpReadPipeBlockingALTERA>;
+defm : DemangledNativeBuiltin<"__write_pipe_2_bl", OpenCL_std, BlockingPipes, 4, 4, OpWritePipeBlockingALTERA>;
defm : DemangledNativeBuiltin<"__spirv_ReadClockKHR", OpenCL_std, KernelClock, 1, 1, OpReadClockKHR>;
//SPV_ALTERA_arbitrary_precision_fixed_point
diff --git a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
index 7ffd6d1e86c21..4b158a1145959 100644
--- a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
@@ -13,6 +13,7 @@
#include "SPIRVUtils.h"
#include "MCTargetDesc/SPIRVBaseInfo.h"
#include "SPIRV.h"
+#include "SPIRVBuiltins.h"
#include "SPIRVGlobalRegistry.h"
#include "SPIRVInstrInfo.h"
#include "SPIRVSubtarget.h"
@@ -535,32 +536,6 @@ Type *getMDOperandAsType(const MDNode *N, unsigned I) {
return toTypedPointer(ElementTy);
}
-// The set of names is borrowed from the SPIR-V translator.
-// TODO: may be implemented in SPIRVBuiltins.td.
-static bool isPipeOrAddressSpaceCastBI(const StringRef MangledName) {
- return MangledName == "write_pipe_2" || MangledName == "read_pipe_2" ||
- MangledName == "write_pipe_2_bl" || MangledName == "read_pipe_2_bl" ||
- MangledName == "write_pipe_4" || MangledName == "read_pipe_4" ||
- MangledName == "reserve_write_pipe" ||
- MangledName == "reserve_read_pipe" ||
- MangledName == "commit_write_pipe" ||
- MangledName == "commit_read_pipe" ||
- MangledName == "work_group_reserve_write_pipe" ||
- MangledName == "work_group_reserve_read_pipe" ||
- MangledName == "work_group_commit_write_pipe" ||
- MangledName == "work_group_commit_read_pipe" ||
- MangledName == "get_pipe_num_packets_ro" ||
- MangledName == "get_pipe_max_packets_ro" ||
- MangledName == "get_pipe_num_packets_wo" ||
- MangledName == "get_pipe_max_packets_wo" ||
- MangledName == "sub_group_reserve_write_pipe" ||
- MangledName == "sub_group_reserve_read_pipe" ||
- MangledName == "sub_group_commit_write_pipe" ||
- MangledName == "sub_group_commit_read_pipe" ||
- MangledName == "to_global" || MangledName == "to_local" ||
- MangledName == "to_private";
-}
-
static bool isEnqueueKernelBI(const StringRef MangledName) {
return MangledName == "__enqueue_kernel_basic" ||
MangledName == "__enqueue_kernel_basic_events" ||
@@ -580,7 +555,7 @@ static bool isNonMangledOCLBuiltin(StringRef Name) {
return false;
return isEnqueueKernelBI(Name) || isKernelQueryBI(Name) ||
- isPipeOrAddressSpaceCastBI(Name.drop_front(2)) ||
+ SPIRV::isPipeOrAddressSpaceCastBuiltin(Name) ||
Name == "__translate_sampler_initializer";
}
More information about the Mlir-commits
mailing list