[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM conversions for GL.FMix and CL.mix (PR #206935)
Arseniy Obolenskiy
llvmlistbot at llvm.org
Mon Jul 6 02:15:43 PDT 2026
================
@@ -1584,6 +1584,55 @@ class FractPattern : public SPIRVToLLVMConversion<spirv::GLFractOp> {
}
};
+/// Converts `spirv.GL.FMix` to `x * (1 - a) + y * a` as specified by
+/// GL.std.450.
+class GLFMixPattern : public SPIRVToLLVMConversion<spirv::GLFMixOp> {
+public:
+ using SPIRVToLLVMConversion<spirv::GLFMixOp>::SPIRVToLLVMConversion;
+
+ LogicalResult
+ matchAndRewrite(spirv::GLFMixOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ Type dstType = getTypeConverter()->convertType(op.getType());
+ if (!dstType)
+ return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+ Location loc = op.getLoc();
+ Value x = adaptor.getX();
+ Value y = adaptor.getY();
+ Value a = adaptor.getA();
+ Value one = createFPConstant(loc, op.getType(), dstType, rewriter, 1.0);
+ Value oneMinusA = LLVM::FSubOp::create(rewriter, loc, dstType, one, a);
+ Value lhs = LLVM::FMulOp::create(rewriter, loc, dstType, x, oneMinusA);
+ Value rhs = LLVM::FMulOp::create(rewriter, loc, dstType, y, a);
+ rewriter.replaceOpWithNewOp<LLVM::FAddOp>(op, dstType, lhs, rhs);
+ return success();
+ }
+};
+
+/// Converts `spirv.CL.mix` to `fma(a, y - x, x)`. The OpenCL spec defines
+/// mix as `x + (y - x) * a` and explicitly permits FMA contractions.
+class CLMixPattern : public SPIRVToLLVMConversion<spirv::CLMixOp> {
+public:
+ using SPIRVToLLVMConversion<spirv::CLMixOp>::SPIRVToLLVMConversion;
+
+ LogicalResult
+ matchAndRewrite(spirv::CLMixOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ Type dstType = getTypeConverter()->convertType(op.getType());
+ if (!dstType)
+ return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+ Location loc = op.getLoc();
+ Value x = adaptor.getOperands()[0];
+ Value y = adaptor.getOperands()[1];
+ Value a = adaptor.getOperands()[2];
----------------
aobolensk wrote:
Done
https://github.com/llvm/llvm-project/pull/206935
More information about the Mlir-commits
mailing list