[Mlir-commits] [mlir] [mlir][arith] wide integer emulation support for fpto*i ops (PR #132375)

Jakub Kuderski llvmlistbot at llvm.org
Thu Mar 27 13:05:26 PDT 2025


================
@@ -974,6 +1009,130 @@ struct ConvertUIToFP final : OpConversionPattern<arith::UIToFPOp> {
   }
 };
 
+//===----------------------------------------------------------------------===//
+// ConvertFPToSI
+//===----------------------------------------------------------------------===//
+
+struct ConvertFPToSI final : OpConversionPattern<arith::FPToSIOp> {
+  using OpConversionPattern::OpConversionPattern;
+
+  LogicalResult
+  matchAndRewrite(arith::FPToSIOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override {
+    Location loc = op.getLoc();
+    // Get the input float type.
+    Value inFp = adaptor.getIn();
+    Type fpTy = inFp.getType();
+
+    Type intTy = op.getType();
+
+    auto newTy = getTypeConverter()->convertType<VectorType>(intTy);
+    if (!newTy)
+      return rewriter.notifyMatchFailure(
+          loc, llvm::formatv("unsupported type: {0}", intTy));
+
+    // Work on the absolute value and then convert the result to signed integer.
+    // Defer absolute value to fptoui. If minSInt < fp < maxSInt, i.e.
+    // if the fp is representable in signed i2N, emits the correct result.
+    // Else, the result is UB.
+
+    TypedAttr zeroAttr = rewriter.getZeroAttr(fpTy);
+    Value zeroCst = rewriter.create<arith::ConstantOp>(loc, zeroAttr);
+
----------------
kuhar wrote:

```suggestion
    Value zeroCst = rewriter.create<arith::ConstantOp>(loc, zeroAttr);
```

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


More information about the Mlir-commits mailing list