[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