[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM lowering for GL Radians and Degrees ops (PR #205967)

Arseniy Obolenskiy llvmlistbot at llvm.org
Thu Jul 2 21:30:14 PDT 2026


https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/205967

>From 4a57422646469ef455fcd5efe91b1072d04dd11d Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Fri, 26 Jun 2026 05:53:39 +0200
Subject: [PATCH 1/2] [mlir][SPIR-V] Add SPIRVToLLVM lowering for GL Radians
 and Degrees ops

---
 .../Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp    | 47 ++++++++++++++++++-
 .../SPIRVToLLVM/gl-ops-to-llvm.mlir           | 30 ++++++++++++
 2 files changed, 76 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
index c43415b27b1b3..9ef26c01c3321 100644
--- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
+++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
@@ -1564,6 +1564,50 @@ class SAbsPattern : public SPIRVToLLVMConversion<spirv::GLSAbsOp> {
   }
 };
 
+class RadiansPattern : public SPIRVToLLVMConversion<spirv::GLRadiansOp> {
+public:
+  using SPIRVToLLVMConversion<spirv::GLRadiansOp>::SPIRVToLLVMConversion;
+
+  LogicalResult
+  matchAndRewrite(spirv::GLRadiansOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override {
+    auto srcType = op.getType();
+    auto dstType = getTypeConverter()->convertType(srcType);
+    if (!dstType)
+      return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+    Location loc = op.getLoc();
+    // pi / 180
+    Value factor =
+        createFPConstant(loc, srcType, dstType, rewriter, 0.017453292519943295);
+    rewriter.replaceOpWithNewOp<LLVM::FMulOp>(op, dstType, adaptor.getOperand(),
+                                              factor);
+    return success();
+  }
+};
+
+class DegreesPattern : public SPIRVToLLVMConversion<spirv::GLDegreesOp> {
+public:
+  using SPIRVToLLVMConversion<spirv::GLDegreesOp>::SPIRVToLLVMConversion;
+
+  LogicalResult
+  matchAndRewrite(spirv::GLDegreesOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override {
+    auto srcType = op.getType();
+    auto dstType = getTypeConverter()->convertType(srcType);
+    if (!dstType)
+      return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+    Location loc = op.getLoc();
+    // 180 / pi
+    Value factor =
+        createFPConstant(loc, srcType, dstType, rewriter, 57.29577951308232);
+    rewriter.replaceOpWithNewOp<LLVM::FMulOp>(op, dstType, adaptor.getOperand(),
+                                              factor);
+    return success();
+  }
+};
+
 class VariablePattern : public SPIRVToLLVMConversion<spirv::VariableOp> {
 public:
   using SPIRVToLLVMConversion<spirv::VariableOp>::SPIRVToLLVMConversion;
@@ -1916,7 +1960,8 @@ 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, RadiansPattern,
+      DegreesPattern,
 
       // 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..f26754248a6f2 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
 //===----------------------------------------------------------------------===//

>From be1645f077ccc89070dd0a3550b9aa9286d56058 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Fri, 3 Jul 2026 06:30:03 +0200
Subject: [PATCH 2/2] Address comments

---
 .../Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp    | 50 ++++++++-----------
 1 file changed, 20 insertions(+), 30 deletions(-)

diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
index 46762d632b5c1..1cd3d79c13e20 100644
--- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
+++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
@@ -1584,48 +1584,33 @@ class FractPattern : public SPIRVToLLVMConversion<spirv::GLFractOp> {
   }
 };
 
-class RadiansPattern : public SPIRVToLLVMConversion<spirv::GLRadiansOp> {
+// 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:
-  using SPIRVToLLVMConversion<spirv::GLRadiansOp>::SPIRVToLLVMConversion;
+  template <typename... Args>
+  ScalePattern(double scale, Args &&...args)
+      : SPIRVToLLVMConversion<SPIRVOp>(std::forward<Args>(args)...),
+        scale(scale) {}
 
   LogicalResult
-  matchAndRewrite(spirv::GLRadiansOp op, OpAdaptor adaptor,
+  matchAndRewrite(SPIRVOp op, typename SPIRVOp::Adaptor adaptor,
                   ConversionPatternRewriter &rewriter) const override {
-    auto srcType = op.getType();
-    auto dstType = getTypeConverter()->convertType(srcType);
+    Type srcType = op.getType();
+    Type dstType = this->getTypeConverter()->convertType(srcType);
     if (!dstType)
       return rewriter.notifyMatchFailure(op, "type conversion failed");
 
     Location loc = op.getLoc();
-    // pi / 180
-    Value factor =
-        createFPConstant(loc, srcType, dstType, rewriter, 0.017453292519943295);
+    Value factor = createFPConstant(loc, srcType, dstType, rewriter, scale);
     rewriter.replaceOpWithNewOp<LLVM::FMulOp>(op, dstType, adaptor.getOperand(),
                                               factor);
     return success();
   }
-};
 
-class DegreesPattern : public SPIRVToLLVMConversion<spirv::GLDegreesOp> {
-public:
-  using SPIRVToLLVMConversion<spirv::GLDegreesOp>::SPIRVToLLVMConversion;
-
-  LogicalResult
-  matchAndRewrite(spirv::GLDegreesOp op, OpAdaptor adaptor,
-                  ConversionPatternRewriter &rewriter) const override {
-    auto srcType = op.getType();
-    auto dstType = getTypeConverter()->convertType(srcType);
-    if (!dstType)
-      return rewriter.notifyMatchFailure(op, "type conversion failed");
-
-    Location loc = op.getLoc();
-    // 180 / pi
-    Value factor =
-        createFPConstant(loc, srcType, dstType, rewriter, 57.29577951308232);
-    rewriter.replaceOpWithNewOp<LLVM::FMulOp>(op, dstType, adaptor.getOperand(),
-                                              factor);
-    return success();
-  }
+private:
+  double scale;
 };
 
 class VariablePattern : public SPIRVToLLVMConversion<spirv::VariableOp> {
@@ -1981,7 +1966,6 @@ void mlir::populateSPIRVToLLVMConversionPatterns(
       DirectConversionPattern<spirv::GLAcosOp, LLVM::ACosOp>,
       DirectConversionPattern<spirv::GLAtanOp, LLVM::ATanOp>,
       InverseSqrtPattern, SAbsPattern, TanPattern, TanhPattern, FractPattern,
-      RadiansPattern, DegreesPattern,
 
       // OpenCL extended instruction set ops
       DirectConversionPattern<spirv::CLCeilOp, LLVM::FCeilOp>,
@@ -2091,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(



More information about the Mlir-commits mailing list