[Mlir-commits] [mlir] [mlir][arith] Add `arith.fptofp` op (PR #188041)

Ivan Butygin llvmlistbot at llvm.org
Mon Mar 23 07:40:27 PDT 2026


================
@@ -262,6 +262,81 @@ struct CmpFOpLowering : public ConvertOpToLLVMPattern<arith::CmpFOp> {
                   ConversionPatternRewriter &rewriter) const override;
 };
 
+/// Lower arith.fptofp to the appropriate arith/LLVM op(s).
+///
+/// - If src is wider than dst: arith.truncf (recursively lowered)
+/// - If src is narrower than dst: arith.extf (recursively lowered)
+/// - bf16 <-> f16: llvm.fpext to f32, then llvm.fptrunc to dst.
+struct FPToFPOpLowering : public ConvertOpToLLVMPattern<arith::FPToFPOp> {
+  using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern;
+
+  LogicalResult
+  matchAndRewrite(arith::FPToFPOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override {
+    if (LLVM::detail::opHasUnsupportedFloatingPointTypes(op,
+                                                         *getTypeConverter()))
+      return rewriter.notifyMatchFailure(op, "unsupported floating point type");
+    auto srcFloat = cast<FloatType>(getElementTypeOrSelf(op.getIn().getType()));
+    auto dstFloat = cast<FloatType>(getElementTypeOrSelf(op.getType()));
+    unsigned srcWidth = srcFloat.getWidth();
+    unsigned dstWidth = dstFloat.getWidth();
+
+    if (srcWidth > dstWidth) {
+      rewriter.replaceOpWithNewOp<arith::TruncFOp>(op, op.getType(), op.getIn(),
+                                                   op.getRoundingmodeAttr(),
+                                                   op.getFastmathAttr());
+      return success();
+    }
+    if (srcWidth < dstWidth) {
+      rewriter.replaceOpWithNewOp<arith::ExtFOp>(op, op.getType(), op.getIn(),
+                                                 op.getFastmathAttr());
+      return success();
+    }
+
+    // Same width, different semantic: lower directly to LLVM. Only bf16 <-> f16
+    // conversions are supported. There is currently no other pair of FP types
+    // that are valid LLVM types.
+    assert((srcFloat.isBF16() && dstFloat.isF16()) ||
----------------
Hardcode84 wrote:

ah, ok

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


More information about the Mlir-commits mailing list