[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM conversions for GL.FSign and GL.SSign (PR #206934)
Igor Wodiany
llvmlistbot at llvm.org
Wed Jul 29 03:35:11 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);
+ }
----------------
IgWod wrote:
Isn't there a helper function that helps us avoid all of that? I remember something was added in one of the other PRs.
https://github.com/llvm/llvm-project/pull/206934
More information about the Mlir-commits
mailing list