[flang-commits] [flang] [mlir] [RFC][mlir] Conditional support for fast-math attributes. (PR #125620)
Mehdi Amini via flang-commits
flang-commits at lists.llvm.org
Tue Feb 4 02:29:29 PST 2025
================
@@ -22,31 +22,60 @@ def ArithFastMathInterface : OpInterface<"ArithFastMathInterface"> {
let cppNamespace = "::mlir::arith";
- let methods = [
- InterfaceMethod<
- /*desc=*/ "Returns a FastMathFlagsAttr attribute for the operation",
- /*returnType=*/ "FastMathFlagsAttr",
- /*methodName=*/ "getFastMathFlagsAttr",
- /*args=*/ (ins),
- /*methodBody=*/ [{}],
- /*defaultImpl=*/ [{
+ let methods =
+ [InterfaceMethod<
+ /*desc=*/"Returns a FastMathFlagsAttr attribute for the operation",
+ /*returnType=*/"FastMathFlagsAttr",
+ /*methodName=*/"getFastMathFlagsAttr",
+ /*args=*/(ins),
+ /*methodBody=*/[{}],
+ /*defaultImpl=*/[{
ConcreteOp op = cast<ConcreteOp>(this->getOperation());
return op.getFastmathAttr();
- }]
- >,
- StaticInterfaceMethod<
- /*desc=*/ [{Returns the name of the FastMathFlagsAttr attribute
+ }]>,
+ StaticInterfaceMethod<
+ /*desc=*/[{Returns the name of the FastMathFlagsAttr attribute
for the operation}],
- /*returnType=*/ "StringRef",
- /*methodName=*/ "getFastMathAttrName",
- /*args=*/ (ins),
- /*methodBody=*/ [{}],
- /*defaultImpl=*/ [{
+ /*returnType=*/"StringRef",
+ /*methodName=*/"getFastMathAttrName",
+ /*args=*/(ins),
+ /*methodBody=*/[{}],
+ /*defaultImpl=*/[{
return "fastmath";
- }]
- >
+ }]>,
+ InterfaceMethod<
+ /*desc=*/[{Returns true iff FastMathFlagsAttr attribute
+ is applicable to the operation that supports
+ ArithFastMathInterface. If it returns false,
+ then the FastMathFlagsAttr of the operation
+ must be nullptr or have 'none' value}],
+ /*returnType=*/"bool",
+ /*methodName=*/"isArithFastMathApplicable",
+ /*args=*/(ins),
+ /*methodBody=*/[{}],
+ /*defaultImpl=*/[{
+ return ::mlir::cast<::mlir::arith::ArithFastMathInterface>(this->getOperation()).isApplicableImpl();
+ }]>];
- ];
+ let extraClassDeclaration = [{
+ /// Returns true iff the given type is a floating point type
+ /// or contains one.
+ static bool isCompatibleType(::mlir::Type);
+
+ /// Default implementation of isArithFastMathApplicable().
+ /// It returns true iff any of the results of the operations
+ /// has a type that is compatible with fast-math.
+ bool isApplicableImpl();
+ }];
+
+ let verify = [{
+ auto fmi = ::mlir::cast<::mlir::arith::ArithFastMathInterface>($_op);
+ auto attr = fmi.getFastMathFlagsAttr();
+ if (attr && attr.getValue() != ::mlir::arith::FastMathFlags::none &&
+ !fmi.isArithFastMathApplicable())
+ return $_op->emitOpError() << "FastMathFlagsAttr is not applicable";
----------------
joker-eph wrote:
```suggestion
return $_op->emitOpError() << "has flag " << stringify(attr.getValue()) << " but fast-math flags are not applicable (`isArithFastMathApplicable()` returns false)";
```
https://github.com/llvm/llvm-project/pull/125620
More information about the flang-commits
mailing list