[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM conversions for GL.FSign and GL.SSign (PR #206934)

Arseniy Obolenskiy llvmlistbot at llvm.org
Wed Jul 29 05:38:38 PDT 2026


================
@@ -1678,6 +1678,68 @@ class ScalePattern : public SPIRVToLLVMConversion<SPIRVOp> {
   double scale;
 };
 
+/// Converts `spirv.GL.FSign`/`spirv.GL.SSign` to a sign(x) sequence that maps
+/// the operand to -1/0/1 using two comparisons and two selects. The `isFloat`
+/// flag selects between floating-point and integer comparisons/constants.
+template <typename SPIRVOp, bool isFloat>
+class SignPattern : public SPIRVToLLVMConversion<SPIRVOp> {
+public:
+  using SPIRVToLLVMConversion<SPIRVOp>::SPIRVToLLVMConversion;
+
+  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 operand = adaptor.getOperand();
+    auto vecSrcType = dyn_cast<VectorType>(srcType);
+    Type i1Type = rewriter.getI1Type();
+    Type cmpType =
+        vecSrcType ? VectorType::get(vecSrcType.getShape(), i1Type) : i1Type;
+
+    Value zero, one, minusOne, gt, lt;
+    if constexpr (isFloat) {
+      zero = createFPConstant(loc, srcType, dstType, rewriter, 0.0);
+      one = createFPConstant(loc, srcType, dstType, rewriter, 1.0);
+      minusOne = createFPConstant(loc, srcType, dstType, rewriter, -1.0);
+      gt = LLVM::FCmpOp::create(rewriter, loc, cmpType,
+                                LLVM::FCmpPredicate::ogt, operand, zero);
+      lt = LLVM::FCmpOp::create(rewriter, loc, cmpType,
+                                LLVM::FCmpPredicate::olt, operand, zero);
+    } else {
+      auto intElemType = cast<IntegerType>(getElementTypeOrSelf(srcType));
+      IntegerAttr zeroAttr = rewriter.getIntegerAttr(intElemType, 0);
+      IntegerAttr oneAttr = rewriter.getIntegerAttr(intElemType, 1);
+      if (vecSrcType) {
+        zero = LLVM::ConstantOp::create(
+            rewriter, loc, dstType,
+            SplatElementsAttr::get(vecSrcType, zeroAttr));
+        one = LLVM::ConstantOp::create(
+            rewriter, loc, dstType,
+            SplatElementsAttr::get(vecSrcType, oneAttr));
+      } else {
+        zero = LLVM::ConstantOp::create(rewriter, loc, dstType, zeroAttr);
+        one = LLVM::ConstantOp::create(rewriter, loc, dstType, oneAttr);
+      }
----------------
aobolensk wrote:

Reused helpers, thanks

https://github.com/llvm/llvm-project/pull/206934


More information about the Mlir-commits mailing list