[Mlir-commits] [mlir] e788a46 - [mlir][SPIR-V] Add SPIRVToLLVM lowering for GL Radians and Degrees ops (#205967)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Jul 3 07:45:17 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-07-03T16:45:12+02:00
New Revision: e788a46f7311e49d8275116c7a634a04a43a9cef
URL: https://github.com/llvm/llvm-project/commit/e788a46f7311e49d8275116c7a634a04a43a9cef
DIFF: https://github.com/llvm/llvm-project/commit/e788a46f7311e49d8275116c7a634a04a43a9cef.diff
LOG: [mlir][SPIR-V] Add SPIRVToLLVM lowering for GL Radians and Degrees ops (#205967)
Added:
Modified:
mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
index 2682e1d9e26ce..1cd3d79c13e20 100644
--- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
+++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
@@ -1584,6 +1584,35 @@ class FractPattern : public SPIRVToLLVMConversion<spirv::GLFractOp> {
}
};
+// Converts spirv.GL.Radians (scale = pi/180) and spirv.GL.Degrees
+// (scale = 180/pi) by multiplying the operand by a compile-time constant.
+template <typename SPIRVOp>
+class ScalePattern : public SPIRVToLLVMConversion<SPIRVOp> {
+public:
+ template <typename... Args>
+ ScalePattern(double scale, Args &&...args)
+ : SPIRVToLLVMConversion<SPIRVOp>(std::forward<Args>(args)...),
+ scale(scale) {}
+
+ LogicalResult
+ matchAndRewrite(SPIRVOp op, typename SPIRVOp::Adaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ Type srcType = op.getType();
+ Type dstType = this->getTypeConverter()->convertType(srcType);
+ if (!dstType)
+ return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+ Location loc = op.getLoc();
+ Value factor = createFPConstant(loc, srcType, dstType, rewriter, scale);
+ rewriter.replaceOpWithNewOp<LLVM::FMulOp>(op, dstType, adaptor.getOperand(),
+ factor);
+ return success();
+ }
+
+private:
+ double scale;
+};
+
class VariablePattern : public SPIRVToLLVMConversion<spirv::VariableOp> {
public:
using SPIRVToLLVMConversion<spirv::VariableOp>::SPIRVToLLVMConversion;
@@ -2046,6 +2075,12 @@ void mlir::populateSPIRVToLLVMConversionPatterns(
patterns.add<GlobalVariablePattern>(clientAPI, patterns.getContext(),
typeConverter);
+ // pi / 180
+ patterns.add<ScalePattern<spirv::GLRadiansOp>>(
+ 0.017453292519943295, patterns.getContext(), typeConverter);
+ // 180 / pi
+ patterns.add<ScalePattern<spirv::GLDegreesOp>>(
+ 57.29577951308232, patterns.getContext(), typeConverter);
}
void mlir::populateSPIRVToLLVMFunctionConversionPatterns(
diff --git a/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
index 042b68bef9dcd..24f16602e4147 100644
--- a/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
+++ b/mlir/test/Conversion/SPIRVToLLVM/gl-ops-to-llvm.mlir
@@ -334,6 +334,36 @@ spirv.func @inverse_sqrt(%arg0: f32) "None" {
spirv.Return
}
+//===----------------------------------------------------------------------===//
+// spirv.GL.Radians
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: @radians
+spirv.func @radians(%arg0: f32, %arg1: vector<3xf32>) "None" {
+ // CHECK: %[[FACTOR:.*]] = llvm.mlir.constant(0.0174532924 : f32) : f32
+ // CHECK: llvm.fmul %{{.*}}, %[[FACTOR]] : f32
+ %0 = spirv.GL.Radians %arg0 : f32
+ // CHECK: %[[VFACTOR:.*]] = llvm.mlir.constant(dense<0.0174532924> : vector<3xf32>) : vector<3xf32>
+ // CHECK: llvm.fmul %{{.*}}, %[[VFACTOR]] : vector<3xf32>
+ %1 = spirv.GL.Radians %arg1 : vector<3xf32>
+ spirv.Return
+}
+
+//===----------------------------------------------------------------------===//
+// spirv.GL.Degrees
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: @degrees
+spirv.func @degrees(%arg0: f32, %arg1: vector<3xf32>) "None" {
+ // CHECK: %[[FACTOR:.*]] = llvm.mlir.constant(57.2957802 : f32) : f32
+ // CHECK: llvm.fmul %{{.*}}, %[[FACTOR]] : f32
+ %0 = spirv.GL.Degrees %arg0 : f32
+ // CHECK: %[[VFACTOR:.*]] = llvm.mlir.constant(dense<57.2957802> : vector<3xf32>) : vector<3xf32>
+ // CHECK: llvm.fmul %{{.*}}, %[[VFACTOR]] : vector<3xf32>
+ %1 = spirv.GL.Degrees %arg1 : vector<3xf32>
+ spirv.Return
+}
+
//===----------------------------------------------------------------------===//
// spirv.GL.Trunc
//===----------------------------------------------------------------------===//
More information about the Mlir-commits
mailing list