[Mlir-commits] [mlir] e3c417d - [mlir][SPIR-V] Extract complex abs and zero-check helpers in ComplexToSPIRV (NFC) (#236851)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Fri Oct 30 02:58:19 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-10-30T10:58:12+01:00
New Revision: e3c417dcd3cbdd57007cda1df9c9d2c9fb679d4b

URL: https://github.com/llvm/llvm-project/commit/e3c417dcd3cbdd57007cda1df9c9d2c9fb679d4b
DIFF: https://github.com/llvm/llvm-project/commit/e3c417dcd3cbdd57007cda1df9c9d2c9fb679d4b.diff

LOG: [mlir][SPIR-V] Extract complex abs and zero-check helpers in ComplexToSPIRV (NFC) (#236851)

Move the overflow safe magnitude and zero check out of SignOpPattern so
other lowerings can reuse them

Required for other ops lowering (e.g. sqrt/rsqrt)

Added: 
    

Modified: 
    mlir/lib/Conversion/ComplexToSPIRV/ComplexToSPIRV.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Conversion/ComplexToSPIRV/ComplexToSPIRV.cpp b/mlir/lib/Conversion/ComplexToSPIRV/ComplexToSPIRV.cpp
index 07c0378b86299..2ed827e4b5850 100644
--- a/mlir/lib/Conversion/ComplexToSPIRV/ComplexToSPIRV.cpp
+++ b/mlir/lib/Conversion/ComplexToSPIRV/ComplexToSPIRV.cpp
@@ -32,6 +32,30 @@ Value createFPConstant(OpBuilder &builder, Location loc, Type type,
       builder, loc, type, builder.getFloatAttr(cast<FloatType>(type), value));
 }
 
+/// Computes abs(re + i*im) as max * sqrt(1 + (min / max)^2) to avoid overflow
+/// in squaring. The result is NaN when both components are zero.
+template <typename SqrtOp, typename FAbsOp, typename FMaxOp, typename FMinOp>
+Value createComplexAbs(OpBuilder &builder, Location loc, Value re, Value im) {
+  Value absRe = FAbsOp::create(builder, loc, re);
+  Value absIm = FAbsOp::create(builder, loc, im);
+  Value max = FMaxOp::create(builder, loc, absRe, absIm);
+  Value min = FMinOp::create(builder, loc, absRe, absIm);
+  Value ratio = spirv::FDivOp::create(builder, loc, min, max);
+  Value ratioSq = spirv::FMulOp::create(builder, loc, ratio, ratio);
+  Value one = createFPConstant(builder, loc, re.getType(), 1.0);
+  Value ratioSqPlusOne = spirv::FAddOp::create(builder, loc, ratioSq, one);
+  Value sqrt = SqrtOp::create(builder, loc, ratioSqPlusOne);
+  return spirv::FMulOp::create(builder, loc, max, sqrt);
+}
+
+/// Returns true when both components are zero.
+Value createIsZero(OpBuilder &builder, Location loc, Value re, Value im) {
+  Value zero = createFPConstant(builder, loc, re.getType(), 0.0);
+  Value reIsZero = spirv::FOrdEqualOp::create(builder, loc, re, zero);
+  Value imIsZero = spirv::FOrdEqualOp::create(builder, loc, im, zero);
+  return spirv::LogicalAndOp::create(builder, loc, reIsZero, imIsZero);
+}
+
 struct ConstantOpPattern final : OpConversionPattern<complex::ConstantOp> {
   using Base::Base;
 
@@ -338,25 +362,13 @@ struct SignOpPattern final : OpConversionPattern<complex::SignOp> {
     Value im =
         spirv::CompositeExtractOp::create(rewriter, loc, complexVal, {1});
 
-    Value absRe = FAbsOp::create(rewriter, loc, re);
-    Value absIm = FAbsOp::create(rewriter, loc, im);
-    Value max = FMaxOp::create(rewriter, loc, absRe, absIm);
-    Value min = FMinOp::create(rewriter, loc, absRe, absIm);
-    Value ratio = spirv::FDivOp::create(rewriter, loc, min, max);
-    Value ratioSq = spirv::FMulOp::create(rewriter, loc, ratio, ratio);
-    Value one = createFPConstant(rewriter, loc, re.getType(), 1.0);
-    Value ratioSqPlusOne = spirv::FAddOp::create(rewriter, loc, ratioSq, one);
-    Value sqrt = SqrtOp::create(rewriter, loc, ratioSqPlusOne);
-    Value abs = spirv::FMulOp::create(rewriter, loc, max, sqrt);
+    Value abs =
+        createComplexAbs<SqrtOp, FAbsOp, FMaxOp, FMinOp>(rewriter, loc, re, im);
 
     Value signRe = spirv::FDivOp::create(rewriter, loc, re, abs);
     Value signIm = spirv::FDivOp::create(rewriter, loc, im, abs);
 
-    Value zero = createFPConstant(rewriter, loc, re.getType(), 0.0);
-    Value reIsZero = spirv::FOrdEqualOp::create(rewriter, loc, re, zero);
-    Value imIsZero = spirv::FOrdEqualOp::create(rewriter, loc, im, zero);
-    Value isZero =
-        spirv::LogicalAndOp::create(rewriter, loc, reIsZero, imIsZero);
+    Value isZero = createIsZero(rewriter, loc, re, im);
 
     // Select per component: spirv.Select with a scalar condition and a
     // composite result requires SPIR-V 1.4, so operate on scalars here and


        


More information about the Mlir-commits mailing list