[llvm-branch-commits] [mlir] 82e282f - Revert "[mlir][math] Add FP software implementation lowering pass: math-to-ap…"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Dec 17 10:52:07 PST 2025
Author: Maksim Levental
Date: 2025-12-17T10:52:04-08:00
New Revision: 82e282f7643d79c830e8288d15b72ef55a093fe1
URL: https://github.com/llvm/llvm-project/commit/82e282f7643d79c830e8288d15b72ef55a093fe1
DIFF: https://github.com/llvm/llvm-project/commit/82e282f7643d79c830e8288d15b72ef55a093fe1.diff
LOG: Revert "[mlir][math] Add FP software implementation lowering pass: math-to-ap…"
This reverts commit 7f1a30ebd242b2a55e8393717f1e594f9cd61569.
Added:
mlir/lib/Conversion/ArithToAPFloat/ArithToAPFloat.cpp
mlir/lib/Conversion/ArithToAPFloat/CMakeLists.txt
mlir/test/Conversion/ArithToApfloat/arith-to-apfloat.mlir
Modified:
mlir/include/mlir/Conversion/Passes.h
mlir/include/mlir/Conversion/Passes.td
mlir/include/mlir/Dialect/Func/Utils/Utils.h
mlir/lib/Conversion/CMakeLists.txt
mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
mlir/lib/Dialect/Func/Utils/Utils.cpp
mlir/lib/ExecutionEngine/APFloatWrappers.cpp
Removed:
mlir/include/mlir/Conversion/MathToAPFloat/MathToAPFloat.h
mlir/lib/Conversion/ArithAndMathToAPFloat/ArithToAPFloat.cpp
mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt
mlir/lib/Conversion/ArithAndMathToAPFloat/MathToAPFloat.cpp
mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.cpp
mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.h
mlir/test/Conversion/ArithAndMathToAPFloat/arith-to-apfloat.mlir
mlir/test/Conversion/ArithAndMathToAPFloat/math-to-apfloat.mlir
mlir/test/Integration/Dialect/Math/CPU/test-apfloat-emulation.mlir
################################################################################
diff --git a/mlir/include/mlir/Conversion/MathToAPFloat/MathToAPFloat.h b/mlir/include/mlir/Conversion/MathToAPFloat/MathToAPFloat.h
deleted file mode 100644
index 86179a1611d5e..0000000000000
--- a/mlir/include/mlir/Conversion/MathToAPFloat/MathToAPFloat.h
+++ /dev/null
@@ -1,21 +0,0 @@
-//===- MathToAPFloat.h - Math to APFloat impl conversion ---*- C++ ------*-===//
-//
-// Part of the APFloat Project, under the Apache License v2.0 with APFloat
-// Exceptions. See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH APFloat-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_CONVERSION_MATHTOAPFLOAT_MATHTOAPFLOAT_H
-#define MLIR_CONVERSION_MATHTOAPFLOAT_MATHTOAPFLOAT_H
-
-#include <memory>
-
-namespace mlir {
-class Pass;
-
-#define GEN_PASS_DECL_MATHTOAPFLOATCONVERSIONPASS
-#include "mlir/Conversion/Passes.h.inc"
-} // namespace mlir
-
-#endif // MLIR_CONVERSION_MATHTOAPFLOAT_MATHTOAPFLOAT_H
diff --git a/mlir/include/mlir/Conversion/Passes.h b/mlir/include/mlir/Conversion/Passes.h
index 05ec2f8ce2538..82bdfd02661a6 100644
--- a/mlir/include/mlir/Conversion/Passes.h
+++ b/mlir/include/mlir/Conversion/Passes.h
@@ -44,7 +44,6 @@
#include "mlir/Conversion/IndexToLLVM/IndexToLLVM.h"
#include "mlir/Conversion/IndexToSPIRV/IndexToSPIRV.h"
#include "mlir/Conversion/LinalgToStandard/LinalgToStandard.h"
-#include "mlir/Conversion/MathToAPFloat/MathToAPFloat.h"
#include "mlir/Conversion/MathToEmitC/MathToEmitCPass.h"
#include "mlir/Conversion/MathToFuncs/MathToFuncs.h"
#include "mlir/Conversion/MathToLLVM/MathToLLVM.h"
diff --git a/mlir/include/mlir/Conversion/Passes.td b/mlir/include/mlir/Conversion/Passes.td
index 7f24e58671aab..fcbaf3ccc1486 100644
--- a/mlir/include/mlir/Conversion/Passes.td
+++ b/mlir/include/mlir/Conversion/Passes.td
@@ -775,21 +775,6 @@ def ConvertMathToLibmPass : Pass<"convert-math-to-libm", "ModuleOp"> {
];
}
-//===----------------------------------------------------------------------===//
-// MathToAPFloat
-//===----------------------------------------------------------------------===//
-
-def MathToAPFloatConversionPass
- : Pass<"convert-math-to-apfloat", "ModuleOp"> {
- let summary = "Convert Math ops to APFloat runtime library calls";
- let description = [{
- This pass converts supported Math ops to APFloat-based runtime library
- calls (APFloatWrappers.cpp). APFloat is a software implementation of
- floating-point mathmetic operations.
- }];
- let dependentDialects = ["math::MathDialect", "func::FuncDialect"];
-}
-
//===----------------------------------------------------------------------===//
// MathToLLVM
//===----------------------------------------------------------------------===//
diff --git a/mlir/include/mlir/Dialect/Func/Utils/Utils.h b/mlir/include/mlir/Dialect/Func/Utils/Utils.h
index 079c1f461b6ed..00d50874a2e8d 100644
--- a/mlir/include/mlir/Dialect/Func/Utils/Utils.h
+++ b/mlir/include/mlir/Dialect/Func/Utils/Utils.h
@@ -67,22 +67,6 @@ FailureOr<FuncOp> lookupFnDecl(SymbolOpInterface symTable, StringRef name,
FunctionType funcT,
SymbolTableCollection *symbolTables = nullptr);
-/// Create a FuncOp decl and insert it into `symTable` operation. If
-/// `symbolTables` is provided, then the decl will be inserted into the
-/// SymbolTableCollection.
-FuncOp createFnDecl(OpBuilder &b, SymbolOpInterface symTable, StringRef name,
- FunctionType funcT, bool setPrivate,
- SymbolTableCollection *symbolTables = nullptr);
-
-/// Helper function to look up or create the symbol for a runtime library
-/// function with the given parameter types. Returns an int64_t, unless a
-///
diff erent result type is specified.
-FailureOr<FuncOp>
-lookupOrCreateFnDecl(OpBuilder &b, SymbolOpInterface symTable, StringRef name,
- TypeRange paramTypes,
- SymbolTableCollection *symbolTables = nullptr,
- Type resultType = {});
-
} // namespace func
} // namespace mlir
diff --git a/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt b/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt
deleted file mode 100644
index bad8226ac88ec..0000000000000
--- a/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-add_mlir_library(ArithAndMathToAPFloatUtils
- Utils.cpp
- PARTIAL_SOURCES_INTENDED
-
- LINK_LIBS PUBLIC
- MLIRArithDialect
- )
-
-add_mlir_conversion_library(MLIRArithToAPFloat
- ArithToAPFloat.cpp
- PARTIAL_SOURCES_INTENDED
-
- ADDITIONAL_HEADER_DIRS
- ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToLLVM
-
- DEPENDS
- MLIRConversionPassIncGen
-
- LINK_COMPONENTS
- Core
-
- LINK_LIBS PUBLIC
- ArithAndMathToAPFloatUtils
- MLIRArithDialect
- MLIRArithTransforms
- MLIRFuncDialect
- MLIRFuncUtils
- MLIRVectorDialect
- )
-
-add_mlir_conversion_library(MLIRMathToAPFloat
- MathToAPFloat.cpp
- PARTIAL_SOURCES_INTENDED
-
- ADDITIONAL_HEADER_DIRS
- ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToLLVM
-
- DEPENDS
- MLIRConversionPassIncGen
-
- LINK_COMPONENTS
- Core
-
- LINK_LIBS PUBLIC
- ArithAndMathToAPFloatUtils
- MLIRMathDialect
- MLIRFuncDialect
- MLIRFuncUtils
- )
diff --git a/mlir/lib/Conversion/ArithAndMathToAPFloat/MathToAPFloat.cpp b/mlir/lib/Conversion/ArithAndMathToAPFloat/MathToAPFloat.cpp
deleted file mode 100644
index 20d82863c518e..0000000000000
--- a/mlir/lib/Conversion/ArithAndMathToAPFloat/MathToAPFloat.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-//===- MathToAPFloat.cpp - Mathmetic to APFloat Conversion ----------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Conversion/MathToAPFloat/MathToAPFloat.h"
-#include "Utils.h"
-
-#include "mlir/Dialect/Func/IR/FuncOps.h"
-#include "mlir/Dialect/Func/Utils/Utils.h"
-#include "mlir/Dialect/Math/IR/Math.h"
-#include "mlir/Dialect/Math/Transforms/Passes.h"
-#include "mlir/Dialect/Vector/IR/VectorOps.h"
-#include "mlir/IR/PatternMatch.h"
-#include "mlir/IR/Verifier.h"
-#include "mlir/Transforms/WalkPatternRewriteDriver.h"
-
-namespace mlir {
-#define GEN_PASS_DEF_MATHTOAPFLOATCONVERSIONPASS
-#include "mlir/Conversion/Passes.h.inc"
-} // namespace mlir
-
-using namespace mlir;
-using namespace mlir::func;
-
-struct AbsFOpToAPFloatConversion final : OpRewritePattern<math::AbsFOp> {
- AbsFOpToAPFloatConversion(MLIRContext *context, SymbolOpInterface symTable,
- PatternBenefit benefit = 1)
- : OpRewritePattern<math::AbsFOp>(context, benefit), symTable(symTable) {}
-
- LogicalResult matchAndRewrite(math::AbsFOp op,
- PatternRewriter &rewriter) const override {
- // Cast operands to 64-bit integers.
- auto operand = op.getOperand();
- auto floatTy = dyn_cast<FloatType>(operand.getType());
- if (!floatTy)
- return rewriter.notifyMatchFailure(op,
- "only scalar FloatTypes supported");
- if (floatTy.getIntOrFloatBitWidth() > 64) {
- return rewriter.notifyMatchFailure(op,
- "bitwidth > 64 bits is not supported");
- }
- // Get APFloat function from runtime library.
- auto i32Type = IntegerType::get(symTable->getContext(), 32);
- auto i64Type = IntegerType::get(symTable->getContext(), 64);
- FailureOr<FuncOp> fn = lookupOrCreateFnDecl(
- rewriter, symTable, "_mlir_apfloat_abs", {i32Type, i64Type});
- if (failed(fn))
- return fn;
- Location loc = op.getLoc();
- rewriter.setInsertionPoint(op);
- auto intWType = rewriter.getIntegerType(floatTy.getWidth());
- Value operandBits = arith::ExtUIOp::create(
- rewriter, loc, i64Type,
- arith::BitcastOp::create(rewriter, loc, intWType, operand));
-
- // Call APFloat function.
- Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
- SmallVector<Value> params = {semValue, operandBits};
- Value negatedBits = func::CallOp::create(rewriter, loc, TypeRange(i64Type),
- SymbolRefAttr::get(*fn), params)
- ->getResult(0);
-
- // Truncate result to the original width.
- Value truncatedBits =
- arith::TruncIOp::create(rewriter, loc, intWType, negatedBits);
- rewriter.replaceOp(
- op, arith::BitcastOp::create(rewriter, loc, floatTy, truncatedBits));
- return success();
- }
-
- SymbolOpInterface symTable;
-};
-
-template <typename OpTy>
-struct IsOpToAPFloatConversion final : OpRewritePattern<OpTy> {
- IsOpToAPFloatConversion(MLIRContext *context, const char *APFloatName,
- SymbolOpInterface symTable,
- PatternBenefit benefit = 1)
- : OpRewritePattern<OpTy>(context, benefit), symTable(symTable),
- APFloatName(APFloatName) {};
-
- LogicalResult matchAndRewrite(OpTy op,
- PatternRewriter &rewriter) const override {
- // Cast operands to 64-bit integers.
- auto operand = op.getOperand();
- auto floatTy = dyn_cast<FloatType>(operand.getType());
- if (!floatTy)
- return rewriter.notifyMatchFailure(op,
- "only scalar FloatTypes supported");
- if (floatTy.getIntOrFloatBitWidth() > 64) {
- return rewriter.notifyMatchFailure(op,
- "bitwidth > 64 bits is not supported");
- }
- // Get APFloat function from runtime library.
- auto i1 = IntegerType::get(symTable->getContext(), 1);
- auto i32Type = IntegerType::get(symTable->getContext(), 32);
- auto i64Type = IntegerType::get(symTable->getContext(), 64);
- std::string funcName =
- (llvm::Twine("_mlir_apfloat_is") + APFloatName).str();
- FailureOr<FuncOp> fn = lookupOrCreateFnDecl(
- rewriter, symTable, funcName, {i32Type, i64Type}, nullptr, i1);
- if (failed(fn))
- return fn;
- Location loc = op.getLoc();
- rewriter.setInsertionPoint(op);
- auto intWType = rewriter.getIntegerType(floatTy.getWidth());
- Value operandBits = arith::ExtUIOp::create(
- rewriter, loc, i64Type,
- arith::BitcastOp::create(rewriter, loc, intWType, operand));
-
- // Call APFloat function.
- Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
- SmallVector<Value> params = {semValue, operandBits};
- rewriter.replaceOpWithNewOp<func::CallOp>(op, TypeRange(i1),
- SymbolRefAttr::get(*fn), params);
- return success();
- }
-
- SymbolOpInterface symTable;
- const char *APFloatName;
-};
-
-struct FmaOpToAPFloatConversion final : OpRewritePattern<math::FmaOp> {
- FmaOpToAPFloatConversion(MLIRContext *context, SymbolOpInterface symTable,
- PatternBenefit benefit = 1)
- : OpRewritePattern<math::FmaOp>(context, benefit), symTable(symTable) {};
-
- LogicalResult matchAndRewrite(math::FmaOp op,
- PatternRewriter &rewriter) const override {
- // Cast operands to 64-bit integers.
- auto floatTy = cast<FloatType>(op.getResult().getType());
- if (!floatTy)
- return rewriter.notifyMatchFailure(op,
- "only scalar FloatTypes supported");
- if (floatTy.getIntOrFloatBitWidth() > 64) {
- return rewriter.notifyMatchFailure(op,
- "bitwidth > 64 bits is not supported");
- }
-
- auto i32Type = IntegerType::get(symTable->getContext(), 32);
- auto i64Type = IntegerType::get(symTable->getContext(), 64);
- FailureOr<FuncOp> fn = lookupOrCreateFnDecl(
- rewriter, symTable, "_mlir_apfloat_fused_multiply_add",
- {i32Type, i64Type, i64Type, i64Type});
- if (failed(fn))
- return fn;
- Location loc = op.getLoc();
- rewriter.setInsertionPoint(op);
-
- auto intWType = rewriter.getIntegerType(floatTy.getWidth());
- auto int64Type = rewriter.getI64Type();
- Value operand = arith::ExtUIOp::create(
- rewriter, loc, int64Type,
- arith::BitcastOp::create(rewriter, loc, intWType, op.getA()));
- Value multiplicand = arith::ExtUIOp::create(
- rewriter, loc, int64Type,
- arith::BitcastOp::create(rewriter, loc, intWType, op.getB()));
- Value addend = arith::ExtUIOp::create(
- rewriter, loc, int64Type,
- arith::BitcastOp::create(rewriter, loc, intWType, op.getC()));
-
- // Call APFloat function.
- Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
- SmallVector<Value> params = {semValue, operand, multiplicand, addend};
- auto resultOp =
- func::CallOp::create(rewriter, loc, TypeRange(rewriter.getI64Type()),
- SymbolRefAttr::get(*fn), params);
-
- // Truncate result to the original width.
- Value truncatedBits = arith::TruncIOp::create(rewriter, loc, intWType,
- resultOp->getResult(0));
- rewriter.replaceOpWithNewOp<arith::BitcastOp>(op, floatTy, truncatedBits);
- return success();
- }
-
- SymbolOpInterface symTable;
-};
-
-namespace {
-struct MathToAPFloatConversionPass final
- : impl::MathToAPFloatConversionPassBase<MathToAPFloatConversionPass> {
- using Base::Base;
-
- void runOnOperation() override;
-};
-
-void MathToAPFloatConversionPass::runOnOperation() {
- MLIRContext *context = &getContext();
- RewritePatternSet patterns(context);
-
- patterns.add<AbsFOpToAPFloatConversion>(context, getOperation());
- patterns.add<IsOpToAPFloatConversion<math::IsFiniteOp>>(context, "finite",
- getOperation());
- patterns.add<IsOpToAPFloatConversion<math::IsInfOp>>(context, "infinite",
- getOperation());
- patterns.add<IsOpToAPFloatConversion<math::IsNaNOp>>(context, "nan",
- getOperation());
- patterns.add<IsOpToAPFloatConversion<math::IsNormalOp>>(context, "normal",
- getOperation());
- patterns.add<FmaOpToAPFloatConversion>(context, getOperation());
-
- LogicalResult result = success();
- ScopedDiagnosticHandler scopedHandler(context, [&result](Diagnostic &diag) {
- if (diag.getSeverity() == DiagnosticSeverity::Error) {
- result = failure();
- }
- // NB: if you don't return failure, no other diag handlers will fire (see
- // mlir/lib/IR/Diagnostics.cpp:DiagnosticEngineImpl::emit).
- return failure();
- });
- walkAndApplyPatterns(getOperation(), std::move(patterns));
- if (failed(result))
- return signalPassFailure();
-}
-} // namespace
diff --git a/mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.cpp b/mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.cpp
deleted file mode 100644
index 2b5857367dc40..0000000000000
--- a/mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//===- Utils.cpp - Utils for APFloat Conversion ---------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "Utils.h"
-
-#include "mlir/Dialect/Arith/IR/Arith.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/BuiltinTypeInterfaces.h"
-#include "mlir/IR/Location.h"
-#include "mlir/IR/Value.h"
-
-mlir::Value mlir::getAPFloatSemanticsValue(OpBuilder &b, Location loc,
- FloatType floatTy) {
- int32_t sem = llvm::APFloatBase::SemanticsToEnum(floatTy.getFloatSemantics());
- return arith::ConstantOp::create(b, loc, b.getI32Type(),
- b.getIntegerAttr(b.getI32Type(), sem));
-}
diff --git a/mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.h b/mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.h
deleted file mode 100644
index 5f11d24261b43..0000000000000
--- a/mlir/lib/Conversion/ArithAndMathToAPFloat/Utils.h
+++ /dev/null
@@ -1,21 +0,0 @@
-//===- Utils.h - Utils for APFloat Conversion - C++ -----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_CONVERSION_ARITHANDMATHTOAPFLOAT_UTILS_H_
-#define MLIR_CONVERSION_ARITHANDMATHTOAPFLOAT_UTILS_H_
-
-namespace mlir {
-class Value;
-class OpBuilder;
-class Location;
-class FloatType;
-
-Value getAPFloatSemanticsValue(OpBuilder &b, Location loc, FloatType floatTy);
-} // namespace mlir
-
-#endif // MLIR_CONVERSION_ARITHANDMATHTOAPFLOAT_UTILS_H_
diff --git a/mlir/lib/Conversion/ArithAndMathToAPFloat/ArithToAPFloat.cpp b/mlir/lib/Conversion/ArithToAPFloat/ArithToAPFloat.cpp
similarity index 88%
rename from mlir/lib/Conversion/ArithAndMathToAPFloat/ArithToAPFloat.cpp
rename to mlir/lib/Conversion/ArithToAPFloat/ArithToAPFloat.cpp
index b9ba94ef08098..79816fc6e3bf1 100644
--- a/mlir/lib/Conversion/ArithAndMathToAPFloat/ArithToAPFloat.cpp
+++ b/mlir/lib/Conversion/ArithToAPFloat/ArithToAPFloat.cpp
@@ -7,7 +7,6 @@
//===----------------------------------------------------------------------===//
#include "mlir/Conversion/ArithToAPFloat/ArithToAPFloat.h"
-#include "Utils.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/Arith/Transforms/Passes.h"
@@ -26,6 +25,47 @@ namespace mlir {
using namespace mlir;
using namespace mlir::func;
+static FuncOp createFnDecl(OpBuilder &b, SymbolOpInterface symTable,
+ StringRef name, FunctionType funcT, bool setPrivate,
+ SymbolTableCollection *symbolTables = nullptr) {
+ OpBuilder::InsertionGuard g(b);
+ assert(!symTable->getRegion(0).empty() && "expected non-empty region");
+ b.setInsertionPointToStart(&symTable->getRegion(0).front());
+ FuncOp funcOp = FuncOp::create(b, symTable->getLoc(), name, funcT);
+ if (setPrivate)
+ funcOp.setPrivate();
+ if (symbolTables) {
+ SymbolTable &symbolTable = symbolTables->getSymbolTable(symTable);
+ symbolTable.insert(funcOp, symTable->getRegion(0).front().begin());
+ }
+ return funcOp;
+}
+
+/// Helper function to look up or create the symbol for a runtime library
+/// function with the given parameter types. Returns an int64_t, unless a
+///
diff erent result type is specified.
+static FailureOr<FuncOp>
+lookupOrCreateApFloatFn(OpBuilder &b, SymbolOpInterface symTable,
+ StringRef name, TypeRange paramTypes,
+ SymbolTableCollection *symbolTables = nullptr,
+ Type resultType = {}) {
+ if (!resultType)
+ resultType = IntegerType::get(symTable->getContext(), 64);
+ std::string funcName = (llvm::Twine("_mlir_apfloat_") + name).str();
+ auto funcT = FunctionType::get(b.getContext(), paramTypes, {resultType});
+ FailureOr<FuncOp> func =
+ lookupFnDecl(symTable, funcName, funcT, symbolTables);
+ // Failed due to type mismatch.
+ if (failed(func))
+ return func;
+ // Successfully matched existing decl.
+ if (*func)
+ return *func;
+
+ return createFnDecl(b, symTable, funcName, funcT,
+ /*setPrivate=*/true, symbolTables);
+}
+
/// Helper function to look up or create the symbol for a runtime library
/// function for a binary arithmetic operation.
///
@@ -41,9 +81,14 @@ lookupOrCreateBinaryFn(OpBuilder &b, SymbolOpInterface symTable, StringRef name,
SymbolTableCollection *symbolTables = nullptr) {
auto i32Type = IntegerType::get(symTable->getContext(), 32);
auto i64Type = IntegerType::get(symTable->getContext(), 64);
- std::string funcName = (llvm::Twine("_mlir_apfloat_") + name).str();
- return lookupOrCreateFnDecl(b, symTable, funcName,
- {i32Type, i64Type, i64Type}, symbolTables);
+ return lookupOrCreateApFloatFn(b, symTable, name, {i32Type, i64Type, i64Type},
+ symbolTables);
+}
+
+static Value getSemanticsValue(OpBuilder &b, Location loc, FloatType floatTy) {
+ int32_t sem = llvm::APFloatBase::SemanticsToEnum(floatTy.getFloatSemantics());
+ return arith::ConstantOp::create(b, loc, b.getI32Type(),
+ b.getIntegerAttr(b.getI32Type(), sem));
}
/// Given two operands of vector type and vector result type (with the same
@@ -152,7 +197,7 @@ struct BinaryArithOpToAPFloatConversion final : OpRewritePattern<OpTy> {
arith::BitcastOp::create(rewriter, loc, intWType, rhs));
// Call APFloat function.
- Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
+ Value semValue = getSemanticsValue(rewriter, loc, floatTy);
SmallVector<Value> params = {semValue, lhsBits, rhsBits};
auto resultOp = func::CallOp::create(rewriter, loc,
TypeRange(rewriter.getI64Type()),
@@ -186,9 +231,8 @@ struct FpToFpConversion final : OpRewritePattern<OpTy> {
// Get APFloat function from runtime library.
auto i32Type = IntegerType::get(symTable->getContext(), 32);
auto i64Type = IntegerType::get(symTable->getContext(), 64);
- FailureOr<FuncOp> fn =
- lookupOrCreateFnDecl(rewriter, symTable, "_mlir_apfloat_convert",
- {i32Type, i32Type, i64Type});
+ FailureOr<FuncOp> fn = lookupOrCreateApFloatFn(
+ rewriter, symTable, "convert", {i32Type, i32Type, i64Type});
if (failed(fn))
return fn;
@@ -206,10 +250,9 @@ struct FpToFpConversion final : OpRewritePattern<OpTy> {
arith::BitcastOp::create(rewriter, loc, inIntWType, operand1));
// Call APFloat function.
- Value inSemValue = getAPFloatSemanticsValue(rewriter, loc, inFloatTy);
+ Value inSemValue = getSemanticsValue(rewriter, loc, inFloatTy);
auto outFloatTy = cast<FloatType>(resultType);
- Value outSemValue =
- getAPFloatSemanticsValue(rewriter, loc, outFloatTy);
+ Value outSemValue = getSemanticsValue(rewriter, loc, outFloatTy);
std::array<Value, 3> params = {inSemValue, outSemValue, operandBits};
auto resultOp = func::CallOp::create(rewriter, loc,
TypeRange(rewriter.getI64Type()),
@@ -246,8 +289,8 @@ struct FpToIntConversion final : OpRewritePattern<OpTy> {
auto i32Type = IntegerType::get(symTable->getContext(), 32);
auto i64Type = IntegerType::get(symTable->getContext(), 64);
FailureOr<FuncOp> fn =
- lookupOrCreateFnDecl(rewriter, symTable, "_mlir_apfloat_convert_to_int",
- {i32Type, i32Type, i1Type, i64Type});
+ lookupOrCreateApFloatFn(rewriter, symTable, "convert_to_int",
+ {i32Type, i32Type, i1Type, i64Type});
if (failed(fn))
return fn;
@@ -265,7 +308,7 @@ struct FpToIntConversion final : OpRewritePattern<OpTy> {
arith::BitcastOp::create(rewriter, loc, inIntWType, operand1));
// Call APFloat function.
- Value inSemValue = getAPFloatSemanticsValue(rewriter, loc, inFloatTy);
+ Value inSemValue = getSemanticsValue(rewriter, loc, inFloatTy);
auto outIntTy = cast<IntegerType>(resultType);
Value outWidthValue = arith::ConstantOp::create(
rewriter, loc, i32Type,
@@ -307,9 +350,9 @@ struct IntToFpConversion final : OpRewritePattern<OpTy> {
auto i1Type = IntegerType::get(symTable->getContext(), 1);
auto i32Type = IntegerType::get(symTable->getContext(), 32);
auto i64Type = IntegerType::get(symTable->getContext(), 64);
- FailureOr<FuncOp> fn = lookupOrCreateFnDecl(
- rewriter, symTable, "_mlir_apfloat_convert_from_int",
- {i32Type, i32Type, i1Type, i64Type});
+ FailureOr<FuncOp> fn =
+ lookupOrCreateApFloatFn(rewriter, symTable, "convert_from_int",
+ {i32Type, i32Type, i1Type, i64Type});
if (failed(fn))
return fn;
@@ -334,8 +377,7 @@ struct IntToFpConversion final : OpRewritePattern<OpTy> {
// Call APFloat function.
auto outFloatTy = cast<FloatType>(resultType);
- Value outSemValue =
- getAPFloatSemanticsValue(rewriter, loc, outFloatTy);
+ Value outSemValue = getSemanticsValue(rewriter, loc, outFloatTy);
Value inWidthValue = arith::ConstantOp::create(
rewriter, loc, i32Type,
rewriter.getIntegerAttr(i32Type, inIntTy.getWidth()));
@@ -379,8 +421,8 @@ struct CmpFOpToAPFloatConversion final : OpRewritePattern<arith::CmpFOp> {
auto i32Type = IntegerType::get(symTable->getContext(), 32);
auto i64Type = IntegerType::get(symTable->getContext(), 64);
FailureOr<FuncOp> fn =
- lookupOrCreateFnDecl(rewriter, symTable, "_mlir_apfloat_compare",
- {i32Type, i64Type, i64Type}, nullptr, i8Type);
+ lookupOrCreateApFloatFn(rewriter, symTable, "compare",
+ {i32Type, i64Type, i64Type}, nullptr, i8Type);
if (failed(fn))
return fn;
@@ -401,7 +443,7 @@ struct CmpFOpToAPFloatConversion final : OpRewritePattern<arith::CmpFOp> {
arith::BitcastOp::create(rewriter, loc, intWType, rhs));
// Call APFloat function.
- Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
+ Value semValue = getSemanticsValue(rewriter, loc, floatTy);
SmallVector<Value> params = {semValue, lhsBits, rhsBits};
Value comparisonResult =
func::CallOp::create(rewriter, loc, TypeRange(i8Type),
@@ -527,8 +569,8 @@ struct NegFOpToAPFloatConversion final : OpRewritePattern<arith::NegFOp> {
// Get APFloat function from runtime library.
auto i32Type = IntegerType::get(symTable->getContext(), 32);
auto i64Type = IntegerType::get(symTable->getContext(), 64);
- FailureOr<FuncOp> fn = lookupOrCreateFnDecl(
- rewriter, symTable, "_mlir_apfloat_neg", {i32Type, i64Type});
+ FailureOr<FuncOp> fn =
+ lookupOrCreateApFloatFn(rewriter, symTable, "neg", {i32Type, i64Type});
if (failed(fn))
return fn;
@@ -546,7 +588,7 @@ struct NegFOpToAPFloatConversion final : OpRewritePattern<arith::NegFOp> {
arith::BitcastOp::create(rewriter, loc, intWType, operand1));
// Call APFloat function.
- Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
+ Value semValue = getSemanticsValue(rewriter, loc, floatTy);
SmallVector<Value> params = {semValue, operandBits};
Value negatedBits =
func::CallOp::create(rewriter, loc, TypeRange(i64Type),
diff --git a/mlir/lib/Conversion/ArithToAPFloat/CMakeLists.txt b/mlir/lib/Conversion/ArithToAPFloat/CMakeLists.txt
new file mode 100644
index 0000000000000..31fce7a4de8a2
--- /dev/null
+++ b/mlir/lib/Conversion/ArithToAPFloat/CMakeLists.txt
@@ -0,0 +1,19 @@
+add_mlir_conversion_library(MLIRArithToAPFloat
+ ArithToAPFloat.cpp
+
+ ADDITIONAL_HEADER_DIRS
+ ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToLLVM
+
+ DEPENDS
+ MLIRConversionPassIncGen
+
+ LINK_COMPONENTS
+ Core
+
+ LINK_LIBS PUBLIC
+ MLIRArithDialect
+ MLIRArithTransforms
+ MLIRFuncDialect
+ MLIRFuncUtils
+ MLIRVectorDialect
+ )
diff --git a/mlir/lib/Conversion/CMakeLists.txt b/mlir/lib/Conversion/CMakeLists.txt
index 2ed10effb53da..613dc6d242ceb 100644
--- a/mlir/lib/Conversion/CMakeLists.txt
+++ b/mlir/lib/Conversion/CMakeLists.txt
@@ -2,7 +2,7 @@ add_subdirectory(AffineToStandard)
add_subdirectory(AMDGPUToROCDL)
add_subdirectory(ArithCommon)
add_subdirectory(ArithToAMDGPU)
-add_subdirectory(ArithAndMathToAPFloat)
+add_subdirectory(ArithToAPFloat)
add_subdirectory(ArithToArmSME)
add_subdirectory(ArithToEmitC)
add_subdirectory(ArithToLLVM)
diff --git a/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp b/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
index e5f8763127a1b..a08cc98e4d5bf 100644
--- a/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
+++ b/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
@@ -37,9 +37,7 @@ using ConvertFMFMathToLLVMPattern =
VectorConvertToLLVMPattern<SourceOp, TargetOp, ConvertFastMath,
FailOnUnsupportedFP>;
-using AbsFOpLowering =
- ConvertFMFMathToLLVMPattern<math::AbsFOp, LLVM::FAbsOp,
- /*FailOnUnsupportedFP=*/true>;
+using AbsFOpLowering = ConvertFMFMathToLLVMPattern<math::AbsFOp, LLVM::FAbsOp>;
using CeilOpLowering = ConvertFMFMathToLLVMPattern<math::CeilOp, LLVM::FCeilOp>;
using CopySignOpLowering =
ConvertFMFMathToLLVMPattern<math::CopySignOp, LLVM::CopySignOp>;
@@ -54,8 +52,7 @@ using Exp2OpLowering = ConvertFMFMathToLLVMPattern<math::Exp2Op, LLVM::Exp2Op>;
using ExpOpLowering = ConvertFMFMathToLLVMPattern<math::ExpOp, LLVM::ExpOp>;
using FloorOpLowering =
ConvertFMFMathToLLVMPattern<math::FloorOp, LLVM::FFloorOp>;
-using FmaOpLowering = ConvertFMFMathToLLVMPattern<math::FmaOp, LLVM::FMAOp,
- /*FailOnUnsupportedFP=*/true>;
+using FmaOpLowering = ConvertFMFMathToLLVMPattern<math::FmaOp, LLVM::FMAOp>;
using Log10OpLowering =
ConvertFMFMathToLLVMPattern<math::Log10Op, LLVM::Log10Op>;
using Log2OpLowering = ConvertFMFMathToLLVMPattern<math::Log2Op, LLVM::Log2Op>;
diff --git a/mlir/lib/Dialect/Func/Utils/Utils.cpp b/mlir/lib/Dialect/Func/Utils/Utils.cpp
index 7dc12adad0531..d6dfd0229963c 100644
--- a/mlir/lib/Dialect/Func/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Func/Utils/Utils.cpp
@@ -279,42 +279,3 @@ func::lookupFnDecl(SymbolOpInterface symTable, StringRef name,
}
return func;
}
-
-func::FuncOp func::createFnDecl(OpBuilder &b, SymbolOpInterface symTable,
- StringRef name, FunctionType funcT,
- bool setPrivate,
- SymbolTableCollection *symbolTables) {
- OpBuilder::InsertionGuard g(b);
- assert(!symTable->getRegion(0).empty() && "expected non-empty region");
- b.setInsertionPointToStart(&symTable->getRegion(0).front());
- func::FuncOp funcOp =
- func::FuncOp::create(b, symTable->getLoc(), name, funcT);
- if (setPrivate)
- funcOp.setPrivate();
- if (symbolTables) {
- SymbolTable &symbolTable = symbolTables->getSymbolTable(symTable);
- symbolTable.insert(funcOp, symTable->getRegion(0).front().begin());
- }
- return funcOp;
-}
-
-FailureOr<func::FuncOp>
-func::lookupOrCreateFnDecl(OpBuilder &b, SymbolOpInterface symTable,
- StringRef funcName, TypeRange paramTypes,
- SymbolTableCollection *symbolTables,
- Type resultType) {
- if (!resultType)
- resultType = IntegerType::get(symTable->getContext(), 64);
- auto funcT = FunctionType::get(b.getContext(), paramTypes, {resultType});
- FailureOr<func::FuncOp> func =
- lookupFnDecl(symTable, funcName, funcT, symbolTables);
- // Failed due to type mismatch.
- if (failed(func))
- return func;
- // Successfully matched existing decl.
- if (*func)
- return *func;
-
- return createFnDecl(b, symTable, funcName, funcT,
- /*setPrivate=*/true, symbolTables);
-}
diff --git a/mlir/lib/ExecutionEngine/APFloatWrappers.cpp b/mlir/lib/ExecutionEngine/APFloatWrappers.cpp
index 9deb900fbe35d..f3e38eb8ffa2d 100644
--- a/mlir/lib/ExecutionEngine/APFloatWrappers.cpp
+++ b/mlir/lib/ExecutionEngine/APFloatWrappers.cpp
@@ -21,7 +21,6 @@
//
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APSInt.h"
-#include "llvm/Support/Debug.h"
#ifdef _WIN32
#ifndef MLIR_APFLOAT_WRAPPERS_EXPORT
@@ -144,8 +143,7 @@ MLIR_APFLOAT_WRAPPERS_EXPORT int8_t _mlir_apfloat_compare(int32_t semantics,
return static_cast<int8_t>(x.compare(y));
}
-MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_neg(int32_t semantics,
- uint64_t a) {
+MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_neg(int32_t semantics, uint64_t a) {
const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
static_cast<llvm::APFloatBase::Semantics>(semantics));
unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
@@ -154,67 +152,6 @@ MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_neg(int32_t semantics,
return x.bitcastToAPInt().getZExtValue();
}
-MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_abs(int32_t semantics,
- uint64_t a) {
- const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
- static_cast<llvm::APFloatBase::Semantics>(semantics));
- unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
- llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
- return abs(x).bitcastToAPInt().getZExtValue();
-}
-
-MLIR_APFLOAT_WRAPPERS_EXPORT bool _mlir_apfloat_isfinite(int32_t semantics,
- uint64_t a) {
- const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
- static_cast<llvm::APFloatBase::Semantics>(semantics));
- unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
- llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
- return x.isFinite();
-}
-
-MLIR_APFLOAT_WRAPPERS_EXPORT bool _mlir_apfloat_isinfinite(int32_t semantics,
- uint64_t a) {
- const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
- static_cast<llvm::APFloatBase::Semantics>(semantics));
- unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
- llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
- return x.isInfinity();
-}
-
-MLIR_APFLOAT_WRAPPERS_EXPORT bool _mlir_apfloat_isnormal(int32_t semantics,
- uint64_t a) {
- const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
- static_cast<llvm::APFloatBase::Semantics>(semantics));
- unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
- llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
- return x.isNormal();
-}
-
-MLIR_APFLOAT_WRAPPERS_EXPORT bool _mlir_apfloat_isnan(int32_t semantics,
- uint64_t a) {
- const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
- static_cast<llvm::APFloatBase::Semantics>(semantics));
- unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
- llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
- return x.isNaN();
-}
-
-MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t
-_mlir_apfloat_fused_multiply_add(int32_t semantics, uint64_t operand,
- uint64_t multiplicand, uint64_t addend) {
- const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
- static_cast<llvm::APFloatBase::Semantics>(semantics));
- unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
- llvm::APFloat operand_(sem, llvm::APInt(bitWidth, operand));
- llvm::APFloat multiplicand_(sem, llvm::APInt(bitWidth, multiplicand));
- llvm::APFloat addend_(sem, llvm::APInt(bitWidth, addend));
- llvm::detail::opStatus stat = operand_.fusedMultiplyAdd(
- multiplicand_, addend_, llvm::RoundingMode::NearestTiesToEven);
- assert(stat == llvm::APFloatBase::opOK &&
- "expected fusedMultiplyAdd status to be OK");
- return operand_.bitcastToAPInt().getZExtValue();
-}
-
/// Min/max operations.
#define APFLOAT_MIN_MAX_OP(OP) \
MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_##OP( \
diff --git a/mlir/test/Conversion/ArithAndMathToAPFloat/math-to-apfloat.mlir b/mlir/test/Conversion/ArithAndMathToAPFloat/math-to-apfloat.mlir
deleted file mode 100644
index e52eb5866093c..0000000000000
--- a/mlir/test/Conversion/ArithAndMathToAPFloat/math-to-apfloat.mlir
+++ /dev/null
@@ -1,66 +0,0 @@
-// RUN: mlir-opt %s --convert-math-to-apfloat | FileCheck %s
-
-func.func @full_example() {
- %neg14fp8 = arith.constant -1.4 : f8E4M3FN
- %abs = math.absf %neg14fp8 : f8E4M3FN
-
- // see llvm/unittests/ADT/APFloatTest::TEST(APFloatTest, Float8E8M0FNUFMA)
- %twof8E8M0FNU = arith.constant 2.0 : f8E8M0FNU
- %fourf8E8M0FNU = arith.constant 4.0 : f8E8M0FNU
- %eightf8E8M0FNU = arith.constant 8.0 : f8E8M0FNU
- %fma = math.fma %fourf8E8M0FNU, %twof8E8M0FNU, %eightf8E8M0FNU : f8E8M0FNU
-
- %isinf = math.isinf %neg14fp8 : f8E4M3FN
- %isnan = math.isnan %neg14fp8 : f8E4M3FN
- %isnormal = math.isnormal %neg14fp8 : f8E4M3FN
- %isfinite = math.isfinite %neg14fp8 : f8E4M3FN
-
- return
-}
-
-// CHECK-LABEL: func.func private @_mlir_apfloat_isfinite(i32, i64) -> i1
-// CHECK: func.func private @_mlir_apfloat_isnormal(i32, i64) -> i1
-// CHECK: func.func private @_mlir_apfloat_isnan(i32, i64) -> i1
-// CHECK: func.func private @_mlir_apfloat_isinfinite(i32, i64) -> i1
-// CHECK: func.func private @_mlir_apfloat_fused_multiply_add(i32, i64, i64, i64) -> i64
-// CHECK: func.func private @_mlir_apfloat_abs(i32, i64) -> i64
-
-// CHECK-LABEL: func.func @full_example() {
-// CHECK: %[[CONSTANT_0:.*]] = arith.constant -1.375000e+00 : f8E4M3FN
-// CHECK: %[[BITCAST_0:.*]] = arith.bitcast %[[CONSTANT_0]] : f8E4M3FN to i8
-// CHECK: %[[EXTUI_0:.*]] = arith.extui %[[BITCAST_0]] : i8 to i64
-// CHECK: %[[CONSTANT_1:.*]] = arith.constant 10 : i32
-// CHECK: %[[VAL_0:.*]] = call @_mlir_apfloat_abs(%[[CONSTANT_1]], %[[EXTUI_0]]) : (i32, i64) -> i64
-// CHECK: %[[TRUNCI_0:.*]] = arith.trunci %[[VAL_0]] : i64 to i8
-// CHECK: %[[BITCAST_1:.*]] = arith.bitcast %[[TRUNCI_0]] : i8 to f8E4M3FN
-// CHECK: %[[CONSTANT_2:.*]] = arith.constant 2.000000e+00 : f8E8M0FNU
-// CHECK: %[[CONSTANT_3:.*]] = arith.constant 4.000000e+00 : f8E8M0FNU
-// CHECK: %[[CONSTANT_4:.*]] = arith.constant 8.000000e+00 : f8E8M0FNU
-// CHECK: %[[BITCAST_2:.*]] = arith.bitcast %[[CONSTANT_3]] : f8E8M0FNU to i8
-// CHECK: %[[EXTUI_1:.*]] = arith.extui %[[BITCAST_2]] : i8 to i64
-// CHECK: %[[BITCAST_3:.*]] = arith.bitcast %[[CONSTANT_2]] : f8E8M0FNU to i8
-// CHECK: %[[EXTUI_2:.*]] = arith.extui %[[BITCAST_3]] : i8 to i64
-// CHECK: %[[BITCAST_4:.*]] = arith.bitcast %[[CONSTANT_4]] : f8E8M0FNU to i8
-// CHECK: %[[EXTUI_3:.*]] = arith.extui %[[BITCAST_4]] : i8 to i64
-// CHECK: %[[CONSTANT_5:.*]] = arith.constant 15 : i32
-// CHECK: %[[VAL_1:.*]] = call @_mlir_apfloat_fused_multiply_add(%[[CONSTANT_5]], %[[EXTUI_1]], %[[EXTUI_2]], %[[EXTUI_3]]) : (i32, i64, i64, i64) -> i64
-// CHECK: %[[TRUNCI_1:.*]] = arith.trunci %[[VAL_1]] : i64 to i8
-// CHECK: %[[BITCAST_5:.*]] = arith.bitcast %[[TRUNCI_1]] : i8 to f8E8M0FNU
-// CHECK: %[[BITCAST_6:.*]] = arith.bitcast %[[CONSTANT_0]] : f8E4M3FN to i8
-// CHECK: %[[EXTUI_4:.*]] = arith.extui %[[BITCAST_6]] : i8 to i64
-// CHECK: %[[CONSTANT_6:.*]] = arith.constant 10 : i32
-// CHECK: %[[VAL_2:.*]] = call @_mlir_apfloat_isinfinite(%[[CONSTANT_6]], %[[EXTUI_4]]) : (i32, i64) -> i1
-// CHECK: %[[BITCAST_7:.*]] = arith.bitcast %[[CONSTANT_0]] : f8E4M3FN to i8
-// CHECK: %[[EXTUI_5:.*]] = arith.extui %[[BITCAST_7]] : i8 to i64
-// CHECK: %[[CONSTANT_7:.*]] = arith.constant 10 : i32
-// CHECK: %[[VAL_3:.*]] = call @_mlir_apfloat_isnan(%[[CONSTANT_7]], %[[EXTUI_5]]) : (i32, i64) -> i1
-// CHECK: %[[BITCAST_8:.*]] = arith.bitcast %[[CONSTANT_0]] : f8E4M3FN to i8
-// CHECK: %[[EXTUI_6:.*]] = arith.extui %[[BITCAST_8]] : i8 to i64
-// CHECK: %[[CONSTANT_8:.*]] = arith.constant 10 : i32
-// CHECK: %[[VAL_4:.*]] = call @_mlir_apfloat_isnormal(%[[CONSTANT_8]], %[[EXTUI_6]]) : (i32, i64) -> i1
-// CHECK: %[[BITCAST_9:.*]] = arith.bitcast %[[CONSTANT_0]] : f8E4M3FN to i8
-// CHECK: %[[EXTUI_7:.*]] = arith.extui %[[BITCAST_9]] : i8 to i64
-// CHECK: %[[CONSTANT_9:.*]] = arith.constant 10 : i32
-// CHECK: %[[VAL_5:.*]] = call @_mlir_apfloat_isfinite(%[[CONSTANT_9]], %[[EXTUI_7]]) : (i32, i64) -> i1
-// CHECK: return
-// CHECK: }
diff --git a/mlir/test/Conversion/ArithAndMathToAPFloat/arith-to-apfloat.mlir b/mlir/test/Conversion/ArithToApfloat/arith-to-apfloat.mlir
similarity index 100%
rename from mlir/test/Conversion/ArithAndMathToAPFloat/arith-to-apfloat.mlir
rename to mlir/test/Conversion/ArithToApfloat/arith-to-apfloat.mlir
diff --git a/mlir/test/Integration/Dialect/Math/CPU/test-apfloat-emulation.mlir b/mlir/test/Integration/Dialect/Math/CPU/test-apfloat-emulation.mlir
deleted file mode 100644
index c890b470b563a..0000000000000
--- a/mlir/test/Integration/Dialect/Math/CPU/test-apfloat-emulation.mlir
+++ /dev/null
@@ -1,68 +0,0 @@
-// REQUIRES: system-linux || system-darwin
-// TODO: Run only on Linux and MacOS until we figure out how to build
-// mlir_apfloat_wrappers in a platform-independent way.
-
-// RUN: mlir-opt %s --convert-math-to-apfloat --convert-to-llvm | \
-// RUN: mlir-runner -e entry --entry-point-result=void \
-// RUN: --shared-libs=%mlir_c_runner_utils \
-// RUN: --shared-libs=%mlir_apfloat_wrappers | FileCheck %s
-
-func.func @entry() {
-
- // FP8
-
- %neg14fp8 = arith.constant -1.4 : f8E4M3FN
- %absfp8 = math.absf %neg14fp8 : f8E4M3FN
- // CHECK: 1.375
- vector.print %absfp8 : f8E4M3FN
-
- // see llvm/unittests/ADT/APFloatTest::TEST(APFloatTest, Float8E8M0FNUFMA)
- %twof8E8M0FNU = arith.constant 2.0 : f8E8M0FNU
- %fourf8E8M0FNU = arith.constant 4.0 : f8E8M0FNU
- %eightf8E8M0FNU = arith.constant 8.0 : f8E8M0FNU
- %fmafp8 = math.fma %fourf8E8M0FNU, %twof8E8M0FNU, %eightf8E8M0FNU : f8E8M0FNU
- // CHECK: 16
- vector.print %fmafp8 : f8E8M0FNU
-
- // CHECK: 0
- %isinffp8 = math.isinf %neg14fp8 : f8E4M3FN
- vector.print %isinffp8 : i1
- // CHECK: 0
- %isnanfp8 = math.isnan %neg14fp8 : f8E4M3FN
- vector.print %isnanfp8 : i1
- %isnormalfp8 = math.isnormal %neg14fp8 : f8E4M3FN
- // CHECK: 1
- vector.print %isnormalfp8 : i1
- %isfinitefp8 = math.isfinite %neg14fp8 : f8E4M3FN
- // CHECK: 1
- vector.print %isfinitefp8 : i1
-
- // FP32
-
- %neg14fp32 = arith.constant -1.4 : f32
- %absfp32 = math.absf %neg14fp32 : f32
- // CHECK: 1.4
- vector.print %absfp32 : f32
-
- %twofp32 = arith.constant 2.0 : f32
- %fourfp32 = arith.constant 4.0 : f32
- %eightfp32 = arith.constant 8.0 : f32
- %fmafp32 = math.fma %fourfp32, %twofp32, %eightfp32 : f32
- // CHECK: 16
- vector.print %fmafp32 : f32
-
- // CHECK: 0
- %isinffp32 = math.isinf %neg14fp32 : f32
- vector.print %isinffp32 : i1
- // CHECK: 0
- %isnanfp32 = math.isnan %neg14fp32 : f32
- vector.print %isnanfp32 : i1
- %isnormalfp32 = math.isnormal %neg14fp32 : f32
- // CHECK: 1
- vector.print %isnormalfp32 : i1
- %isfinitefp32 = math.isfinite %neg14fp32 : f32
- // CHECK: 1
- vector.print %isfinitefp32 : i1
-
- return
-}
More information about the llvm-branch-commits
mailing list